fineui是帆软报表和BI产品线所使用的前端框架。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

18163 lines
595 KiB

/**
*
* Created by GUY on 2016/5/26.
* @class BI.SequenceTableTreeNumber
* @extends BI.Widget
*/
BI.SequenceTableTreeNumber = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.SequenceTableTreeNumber.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-sequence-table-tree-number",
isNeedFreeze: false,
startSequence: 1,//开始的序号
scrollTop: 0,
headerRowSize: 25,
rowSize: 25,
sequenceHeaderCreator: null,
header: [],
items: [], //二维数组
//交叉表头
crossHeader: [],
crossItems: []
});
},
_init: function () {
BI.SequenceTableTreeNumber.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.vCurr = 1;
this.hCurr = 1;
this.tasks = [];
this.renderedCells = [];
this.renderedKeys = [];
this.container = BI.createWidget({
type: "bi.absolute",
width: 60,
scrollable: false
});
this.scrollContainer = BI.createWidget({
type: "bi.vertical",
scrollable: false,
scrolly: false,
items: [this.container]
});
this.headerContainer = BI.createWidget({
type: "bi.absolute",
cls: "bi-border",
width: 58,
scrollable: false
});
this.layout = BI.createWidget({
type: "bi.vtape",
element: this,
items: [{
el: this.headerContainer,
height: this._getHeaderHeight() - 2
}, {el: {type: "bi.layout"}, height: 2}, {
el: this.scrollContainer
}]
});
//缓存第一行对应的序号
this.start = this.options.startSequence;
this.cache = {};
this._nextState();
this._populate();
},
_getNextSequence: function (nodes) {
var self = this;
var start = this.start;
var cnt = this.start;
function track(node) {
//如果已经有缓存了就不改计数了,复杂表会出现这种情况
self.cache[node.text || node.value] || (self.cache[node.text || node.value] = cnt);
cnt++;
}
BI.each(nodes, function (i, node) {
if (BI.isNotEmptyArray(node.children)) {
BI.each(node.children, function (index, child) {
if (index === 0) {
if (self.cache[child.text || child.value]) {
start = cnt = self.cache[child.text || child.value];
}
}
track(child)
});
}
});
this.start = cnt;
return start;
},
_getStart: function (nodes) {
var self = this;
var start = this.start;
BI.some(nodes, function (i, node) {
if (BI.isNotEmptyArray(node.children)) {
return BI.some(node.children, function (index, child) {
if (index === 0) {
if (self.cache[child.text || child.value]) {
start = self.cache[child.text || child.value];
return true;
}
}
});
}
});
return start;
},
_formatNumber: function (nodes) {
var self = this, o = this.options;
var result = [];
var count = this._getStart(nodes);
function getLeafCount(node) {
var cnt = 0;
if (BI.isNotEmptyArray(node.children)) {
BI.each(node.children, function (index, child) {
cnt += getLeafCount(child);
});
if (/**node.children.length > 1 && **/BI.isNotEmptyArray(node.values)) {
cnt++;
}
} else {
cnt++;
}
return cnt;
}
var start = 0, top = 0;
BI.each(nodes, function (i, node) {
if (BI.isArray(node.children)) {
BI.each(node.children, function (index, child) {
var cnt = getLeafCount(child);
result.push({
text: count++,
start: start,
top: top,
cnt: cnt,
index: index,
height: cnt * o.rowSize
});
start += cnt;
top += cnt * o.rowSize;
});
if (BI.isNotEmptyArray(node.values)) {
result.push({
text: BI.i18nText("BI-Summary_Values"),
start: start++,
top: top,
cnt: 1,
isSummary: true,
height: o.rowSize
});
top += o.rowSize;
}
}
});
return result;
},
_layout: function () {
var self = this, o = this.options;
var headerHeight = this._getHeaderHeight() - 2;
var items = this.layout.attr("items");
if (o.isNeedFreeze === false) {
items[0].height = 0;
items[1].height = 0;
} else if (o.isNeedFreeze === true) {
items[0].height = headerHeight;
items[1].height = 2;
}
this.layout.attr("items", items);
this.layout.resize();
try {
this.scrollContainer.element.scrollTop(o.scrollTop);
} catch (e) {
}
},
_getHeaderHeight: function () {
var o = this.options;
return o.headerRowSize * (o.crossHeader.length + (o.header.length > 0 ? 1 : 0));
},
_nextState: function () {
var o = this.options;
this._getNextSequence(o.items);
},
_prevState: function () {
var self = this, o = this.options;
var firstChild;
BI.some(o.items, function (i, node) {
if (BI.isNotEmptyArray(node.children)) {
return BI.some(node.children, function (j, child) {
firstChild = child;
return true;
});
}
});
if (firstChild && BI.isNotEmptyObject(this.cache)) {
this.start = this.cache[firstChild.text || firstChild.value];
} else {
this.start = 1;
}
this._nextState();
},
_getMaxScrollTop: function (numbers) {
var cnt = 0;
BI.each(numbers, function (i, number) {
cnt += number.cnt;
});
return Math.max(0, cnt * this.options.rowSize - (this.options.height - this._getHeaderHeight()) + BI.DOM.getScrollWidth());
},
_createHeader: function () {
var o = this.options;
BI.createWidget({
type: "bi.absolute",
element: this.headerContainer,
items: [{
el: o.sequenceHeaderCreator || {
type: "bi.table_style_cell",
cls: "sequence-table-title-cell",
styleGetter: o.headerCellStyleGetter,
text: BI.i18nText("BI-Number_Index")
},
left: 0,
top: 0,
right: 0,
bottom: 0
}]
});
},
_calculateChildrenToRender: function () {
var self = this, o = this.options;
var renderedCells = [], renderedKeys = [];
var numbers = this._formatNumber(o.items);
var intervalTree = BI.PrefixIntervalTree.uniform(numbers.length, 0);
BI.each(numbers, function (i, number) {
intervalTree.set(i, number.height);
});
var scrollTop = BI.clamp(o.scrollTop, 0, this._getMaxScrollTop(numbers));
var index = intervalTree.greatestLowerBound(scrollTop);
var offsetTop = -(scrollTop - (index > 0 ? intervalTree.sumTo(index - 1) : 0));
var height = offsetTop;
var bodyHeight = o.height - this._getHeaderHeight();
while (height < bodyHeight && index < numbers.length) {
renderedKeys.push(index);
offsetTop += numbers[index].height;
height += numbers[index].height;
index++;
}
BI.each(renderedKeys, function (i, key) {
var index = BI.deepIndexOf(self.renderedKeys, key);
if (index > -1) {
if (numbers[key].height !== self.renderedCells[index]._height) {
self.renderedCells[index]._height = numbers[key].height;
self.renderedCells[index].el.setHeight(numbers[key].height);
}
if (numbers[key].top !== self.renderedCells[index].top) {
self.renderedCells[index].top = numbers[key].top;
self.renderedCells[index].el.element.css("top", numbers[key].top + "px");
}
renderedCells.push(self.renderedCells[index]);
} else {
var child = BI.createWidget(BI.extend({
type: "bi.table_style_cell",
cls: "sequence-table-number-cell bi-border-left bi-border-right bi-border-bottom",
width: 60,
styleGetter: numbers[key].isSummary === true ? function () {
return o.summaryCellStyleGetter(true);
} : function (key) {
return function () {
return o.sequenceCellStyleGetter(key);
}
}(numbers[key].index)
}, numbers[key]));
renderedCells.push({
el: child,
left: 0,
top: numbers[key].top,
_height: numbers[key].height
});
}
});
//已存在的, 需要添加的和需要删除的
var existSet = {}, addSet = {}, deleteArray = [];
BI.each(renderedKeys, function (i, key) {
if (BI.deepContains(self.renderedKeys, key)) {
existSet[i] = key;
} else {
addSet[i] = key;
}
});
BI.each(this.renderedKeys, function (i, key) {
if (BI.deepContains(existSet, key)) {
return;
}
if (BI.deepContains(addSet, key)) {
return;
}
deleteArray.push(i);
});
BI.each(deleteArray, function (i, index) {
self.renderedCells[index].el.destroy();
});
var addedItems = [];
BI.each(addSet, function (index) {
addedItems.push(renderedCells[index])
});
BI.createWidget({
type: "bi.absolute",
element: this.container,
items: addedItems
});
this.renderedCells = renderedCells;
this.renderedKeys = renderedKeys;
this.container.setHeight(intervalTree.sumUntil(numbers.length));
},
_restore: function () {
BI.each(this.renderedCells, function (i, cell) {
cell.el.destroy();
});
this.renderedCells = [];
this.renderedKeys = [];
},
_populate: function () {
var self = this;
BI.each(this.tasks, function (i, task) {
task.apply(self);
});
this.tasks = [];
this.headerContainer.empty();
this._createHeader();
this._layout();
this._calculateChildrenToRender();
},
setVerticalScroll: function (scrollTop) {
if (this.options.scrollTop !== scrollTop) {
this.options.scrollTop = scrollTop;
try {
this.scrollContainer.element.scrollTop(scrollTop);
} catch (e) {
}
}
},
getVerticalScroll: function () {
return this.options.scrollTop;
},
setVPage: function (v) {
if (v <= 1) {
this.cache = {};
this.start = this.options.startSequence;
this._restore();
this.tasks.push(this._nextState);
} else if (v === this.vCurr + 1) {
this.tasks.push(this._nextState);
} else if (v === this.vCurr - 1) {
this.tasks.push(this._prevState);
}
this.vCurr = v;
},
setHPage: function (v) {
if (v !== this.hCurr) {
this.tasks.push(this._prevState);
}
this.hCurr = v;
},
restore: function () {
this._restore();
},
populate: function (items, header, crossItems, crossHeader) {
var o = this.options;
if (items && items !== this.options.items) {
o.items = items;
this._restore();
this.tasks.push(this._prevState);
}
if (header && header !== this.options.header) {
o.header = header;
}
if (crossItems && crossItems !== this.options.crossItems) {
o.crossItems = crossItems;
}
if (crossHeader && crossHeader !== this.options.crossHeader) {
o.crossHeader = crossHeader;
}
this._populate();
}
});
BI.shortcut('bi.sequence_table_tree_number', BI.SequenceTableTreeNumber);/**
* 自适应布局
*
* 1、resize
* 2、吸附
* 3、当前组件在最上方
* 4、可以撤销
* 5、上下之间插入组件
*
* Created by GUY on 2016/2/23.
* @class BI.AdaptiveArrangement
* @extends BI.Widget
*/
BI.AdaptiveArrangement = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.AdaptiveArrangement.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-adaptive-arrangement",
resizable: true,
isNeedReLayout: true,
isNeedResizeContainer: true,
layoutType: BI.Arrangement.LAYOUT_TYPE.FREE,
items: []
});
},
_init: function () {
BI.AdaptiveArrangement.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.arrangement = BI.createWidget({
type: "bi.arrangement",
element: this,
isNeedReLayout: o.isNeedReLayout,
layoutType: o.layoutType,
items: o.items
});
this.arrangement.on(BI.Arrangement.EVENT_SCROLL, function () {
self.fireEvent(BI.AdaptiveArrangement.EVENT_SCROLL, arguments);
});
if (o.isNeedResizeContainer) {
var isResizing = false;
var needEnd = false;
var height;
var interval;
var startSize;
var resize = function (e, ui) {
if (isResizing) {
return;
}
isResizing = true;
height = ui.size.height;
interval = setInterval(function () {
height += 40;
self.arrangement.setContainerSize({
width: ui.size.width,
height: height
});
self.arrangement.scrollTo({top: height});
}, 300);
};
this.arrangement.container.element.resizable({
handles: "s",
minWidth: 100,
minHeight: 20,
helper: "bi-resizer",
autoHide: true,
start: function (e, ui) {
startSize = BI.clone(ui.size);
},
resize: function (e, ui) {
if (ui.size.height >= startSize.height - 10) {
resize(e, ui);
} else {
interval && clearInterval(interval);
needEnd = true;
}
},
stop: function (e, ui) {
var size = ui.size;
if (isResizing && !needEnd) {
size.height = height;
}
self.arrangement.setContainerSize(ui.size);
needEnd = false;
isResizing = false;
startSize = null;
interval && clearInterval(interval);
self.fireEvent(BI.AdaptiveArrangement.EVENT_RESIZE);
}
});
this._setLayoutType(o.layoutType);
}
this.zIndex = 0;
BI.each(o.items, function (i, item) {
self._initResizable(item.el);
});
this.element.click(function (e) {
BI.each(self.getAllRegions(), function (i, region) {
if (!region.el.element.__isMouseInBounds__(e)) {
region.el.element.removeClass("selected");
}
});
});
BI.ResizeDetector.addResizeListener(this, function () {
self.arrangement.resize();
self.fireEvent(BI.AdaptiveArrangement.EVENT_RESIZE);
});
},
_isEqual: function () {
return this.arrangement._isEqual.apply(this.arrangement, arguments);
},
_setSelect: function (item) {
if (!item.element.hasClass("selected")) {
item.element.css("zIndex", ++this.zIndex);
BI.each(this.getAllRegions(), function (i, region) {
region.el.element.removeClass("selected");
});
item.element.addClass("selected");
}
},
_initResizable: function (item) {
var self = this, o = this.options;
item.element.css("zIndex", ++this.zIndex);
item.element.mousedown(function () {
self._setSelect(item)
});
o.resizable && item.element.resizable({
handles: "e, s, se",
minWidth: 20,
minHeight: 20,
autoHide: true,
helper: "bi-resizer",
start: function () {
item.element.css("zIndex", ++self.zIndex);
self.fireEvent(BI.AdaptiveArrangement.EVENT_ELEMENT_START_RESIZE);
},
resize: function (e, ui) {
// self._resize(item.attr("id"), ui.size);
self._resize(item.attr("id"), ui.size);
self.fireEvent(BI.AdaptiveArrangement.EVENT_ELEMENT_RESIZE, item.attr("id"), ui.size);
},
stop: function (e, ui) {
self._stopResize(item.attr("id"), ui.size);
self.fireEvent(BI.AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE, item.attr("id"), ui.size);
self.fireEvent(BI.AdaptiveArrangement.EVENT_RESIZE);
}
});
},
_resize: function (name, size) {
var self = this;
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
this.setRegionSize(name, size);
break;
}
},
_stopResize: function (name, size) {
var self = this;
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
this.setRegionSize(name, {
width: size.width,
height: size.height
});
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
this.setRegionSize(name, size);
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
this.setRegionSize(name, size);
break;
}
},
//检查宽高是否规范
_checkRegionSize: function (name, size) {
var self = this;
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
var newSize = {};
var leftid, rightid, topid, bottomid;
var region = this.getRegionByName(name);
var rs = this.arrangement._getInDirectRelativeRegions(name, ["right"]).right;
var bs = this.arrangement._getInDirectRelativeRegions(name, ["bottom"]).bottom;
if (rs.left.length > 0) {
topid = BI.first(rs.left).id;
bottomid = BI.last(rs.left).id;
}
if (bs.top.length > 0) {
leftid = BI.first(bs.top).id;
rightid = BI.last(bs.top).id;
}
if (this.arrangement._isEqual(region.width, size.width)) {
topid = name;
bottomid = name;
}
if (this.arrangement._isEqual(region.height, size.height)) {
leftid = name;
rightid = name;
}
var tops = topid ? this.getDirectRelativeRegions(topid, ["top"]).top : [];
var bottoms = bottomid ? this.getDirectRelativeRegions(bottomid, ["bottom"]).bottom : [];
var lefts = leftid ? this.getDirectRelativeRegions(leftid, ["left"]).left : [];
var rights = rightid ? this.getDirectRelativeRegions(rightid, ["right"]).right : [];
if (region.width !== size.width) {
if (rights.length === 0) {//最右边的组件不能调整宽度
newSize.width = region.width;
} else {
var finded = BI.find(tops.concat(bottoms), function (i, r) {
r = self.getRegionByName(r.id);
return Math.abs(size.width + region.left - (r.left + r.width)) <= 3;
});
if (finded) {
finded = this.getRegionByName(finded.id);
newSize.width = finded.left + finded.width - region.left;
} else {
newSize.width = size.width;
}
}
} else {
newSize.width = size.width;
}
if (region.height !== size.height) {
if (bottoms.length === 0) {
newSize.height = region.height;
} else {
var finded = BI.find(lefts.concat(rights), function (i, r) {
r = self.getRegionByName(r.id);
return Math.abs(size.height + region.top - (r.top + r.height)) <= 3;
});
if (finded) {
finded = this.getRegionByName(finded.id);
newSize.height = finded.top + finded.height - region.top;
} else {
newSize.height = size.height;
}
}
} else {
newSize.height = size.height;
}
return newSize;
case BI.Arrangement.LAYOUT_TYPE.FREE:
return size;
case BI.Arrangement.LAYOUT_TYPE.GRID:
return size;
}
},
_getScrollOffset: function () {
return this.arrangement._getScrollOffset();
},
_setLayoutType: function (type) {
try {
//BI.nextTick(function () {
switch (type) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
$(">.ui-resizable-s", this.arrangement.container.element).css("zIndex", "");
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
$(">.ui-resizable-s", this.arrangement.container.element).css("zIndex", "-1");
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
$(">.ui-resizable-s", this.arrangement.container.element).css("zIndex", "-1");
break;
}
this.arrangement.container.element.resizable("option", "disabled", type === BI.Arrangement.LAYOUT_TYPE.FREE);
//});
} catch (e) {
}
},
getClientWidth: function () {
return this.arrangement.getClientWidth();
},
getClientHeight: function () {
return this.arrangement.getClientHeight();
},
getDirectRelativeRegions: function (name, direction) {
return this.arrangement.getDirectRelativeRegions(name, direction);
},
addRegion: function (region, position) {
this._initResizable(region.el);
this._setSelect(region.el);
var self = this, flag;
var old = this.arrangement.getAllRegions();
if (BI.isNotNull(this.position)) {
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
var type = this.position.type;
var current = this.position.region;
switch (type) {
case "top-gap":
var t = this.arrangement._getEquivalentRelativeRegions(current.id, ["top"])[0];
current = this.getRegionByName(t.id);
break;
case "bottom-gap":
break;
}
var id = BI.UUID();
var insert = this.position.insert;
if (insert.height > 0) {
var clone = this.arrangement._cloneRegion();
//找到最下面的组件
var occupied = this.arrangement._getRegionOccupied();
var bottomRegions = [];
BI.each(clone, function (i, region) {
if (self.arrangement._isEqual(region.top + region.height, occupied.top + occupied.height)) {
bottomRegions.push(region);
}
});
var bs = this.arrangement._getInDirectRelativeRegions(current.id, ["bottom"]).bottom;
var seen = [current.id];
var bottoms = bs.bottom;
var occ = this.arrangement._getRegionOccupied(bottoms);
clone[id] = BI.extend({}, region, {
left: occ.left,
width: occ.width,
top: current.top + current.height,
height: insert.height
});
while (bottoms.length > 0) {
BI.each(bottoms, function (i, bottom) {
seen.push(bottom.id);
var r = self.getRegionByName(bottom.id);
BI.extend(clone[bottom.id], {
top: r.top + insert.height
});
});
var t = [];
BI.each(bottoms, function (i, bottom) {
var n = self.arrangement._getInDirectRelativeRegions(bottom.id, ["bottom"]).bottom;
BI.each(n.top, function (i, region) {
if (!seen.contains(region.id)) {
seen.push(region.id);
var r = self.getRegionByName(region.id);
BI.extend(clone[region.id], {
height: r.height + insert.height
});
}
});
t = t.concat(n.bottom);
});
t = BI.uniq(t, function (i, region) {
return region.id;
});
bottoms = t;
}
BI.each(bottomRegions, function (i, region) {
if (!seen.contains(region.id)) {
region.height = region.height + insert.height;
}
});
this.arrangement.populate(BI.toArray(clone));
this.arrangement.resize();
flag = true;
}
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
break;
}
this.position = null;
} else {
if (flag = this.arrangement.addRegion(region, position)) {
this._old = old;
}
}
return flag;
},
deleteRegion: function (name) {
var flag;
var old = this.getAllRegions();
if (flag = this.arrangement.deleteRegion(name)) {
this._old = old;
} else {
this._old = this.getAllRegions();
this.relayout();
}
return true;
},
setRegionSize: function (name, size) {
var flag;
var old = this.getAllRegions();
size = this._checkRegionSize(name, size);
if (flag = this.arrangement.setRegionSize(name, size)) {
this._old = old;
}
return flag;
},
setPosition: function (position, size) {
var self = this;
var at = this.arrangement.setPosition(position, size);
this.position = null;
if (!at) {
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
if (position.left < 0 || position.top < 0) {
return null;
}
var offset = this.arrangement._getScrollOffset();
position = {
left: position.left + offset.left,
top: position.top + offset.top
};
BI.some(this.getAllRegions(), function (id, region) {
if (self.arrangement._isPositionInBounds(position, region)) {
var at = self.arrangement._positionAt(position, region);
if (at.type === "top-gap" || at.type === "bottom-gap") {
self.arrangement._setArrangeSize({
top: region.top - 8 + (at.type === "bottom-gap" ? region.height : 0),
left: region.left,
width: region.width,
height: 16
});
self.position = {
insert: {
height: (size || {}).height
},
type: at.type,
region: region
};
self.arrangement._start();
}
return true;
}
});
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
break;
}
}
return this.position || at;
},
setRegionPosition: function (name, position) {
var region = this.getRegionByName(name);
region.el.element.css("zIndex", ++this.zIndex);
return this.arrangement.setRegionPosition(name, position);
},
scrollTo: function (scroll) {
this.arrangement.scrollTo(scroll);
},
zoom: function (ratio) {
this.arrangement.zoom(ratio);
},
resize: function () {
this.arrangement.resize();
},
relayout: function () {
return this.arrangement.relayout();
},
setLayoutType: function (type) {
var self = this;
this._setLayoutType(type);
this.arrangement.setLayoutType(type);
},
getLayoutType: function () {
return this.arrangement.getLayoutType();
},
getLayoutRatio: function () {
return this.arrangement.getLayoutRatio();
},
getHelper: function () {
return this.arrangement.getHelper();
},
getRegionByName: function (name) {
return this.arrangement.getRegionByName(name);
},
getAllRegions: function () {
return this.arrangement.getAllRegions();
},
revoke: function () {
if (this._old) {
this.populate(BI.toArray(this._old));
}
},
populate: function (items) {
var self = this;
BI.each(items, function (i, item) {
self._initResizable(item.el);
});
this.arrangement.populate(items);
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
BI.nextTick(function () {
self.arrangement.resize();
});
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
break;
}
}
});
BI.AdaptiveArrangement.EVENT_ELEMENT_START_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_START_RESIZE";
BI.AdaptiveArrangement.EVENT_ELEMENT_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_RESIZE";
BI.AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE";
BI.AdaptiveArrangement.EVENT_RESIZE = "AdaptiveArrangement.EVENT_RESIZE";
BI.AdaptiveArrangement.EVENT_SCROLL = "AdaptiveArrangement.EVENT_SCROLL";
BI.shortcut('bi.adaptive_arrangement', BI.AdaptiveArrangement);/**
* Arrangement的block面板
*
* Created by GUY on 2016/3/1.
* @class BI.ArrangementBlock
* @extends BI.Widget
*/
BI.ArrangementBlock = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.ArrangementBlock.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-arrangement-block bi-mask"
});
},
_init: function () {
BI.ArrangementBlock.superclass._init.apply(this, arguments);
var self = this, o = this.options;
}
});
BI.shortcut('bi.arrangement_block', BI.ArrangementBlock);/**
* Arrangement的drop面板
*
* Created by GUY on 2016/3/1.
* @class BI.ArrangementDroppable
* @extends BI.Widget
*/
BI.ArrangementDroppable = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.ArrangementDroppable.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-arrangement-droppable bi-resizer"
});
},
_init: function () {
BI.ArrangementDroppable.superclass._init.apply(this, arguments);
var self = this, o = this.options;
}
});
BI.shortcut('bi.arrangement_droppable', BI.ArrangementDroppable);/**
* 布局
*
* Created by GUY on 2016/2/23.
* @class BI.Arrangement
* @extends BI.Widget
*/
BI.Arrangement = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.Arrangement.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-arrangement",
layoutType: BI.Arrangement.LAYOUT_TYPE.FREE,
isNeedReLayout: true,
items: []
});
},
_init: function () {
BI.Arrangement.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.arrangement = BI.createWidget({
type: "bi.arrangement_droppable",
cls: "arrangement-block",
invisible: true
});
this.block = BI.createWidget({
type: "bi.arrangement_block",
invisible: true
});
this.droppable = BI.createWidget({
type: "bi.layout",
cls: "arrangement-drop-container",
invisible: true
});
this.container = BI.createWidget({
type: "bi.absolute",
items: o.items.concat([this.block, this.arrangement, {
el: this.droppable,
left: 0,
right: 0,
top: 0,
bottom: 0
}])
});
this.scrollContainer = BI.createWidget({
type: "bi.adaptive",
width: "100%",
height: "100%",
scrollable: true,
items: [this.container]
});
this.scrollContainer.element.scroll(function () {
self.fireEvent(BI.Arrangement.EVENT_SCROLL, {
scrollLeft: self.scrollContainer.element.scrollLeft(),
scrollTop: self.scrollContainer.element.scrollTop(),
clientWidth: self.scrollContainer.element[0].clientWidth,
clientHeight: self.scrollContainer.element[0].clientHeight
});
});
BI.createWidget({
type: "bi.adaptive",
element: this,
items: [this.scrollContainer]
});
this.regions = {};
this.locations = {};
this.drops = {};
this.storeDrops = {};
if (o.items.length > 0) {
BI.nextTick(function () {
self.populate(o.items);
});
}
},
////初始化操作////
_calculateRegions: function (items) {
var self = this, o = this.options;
this.regions = {};
this.drops = {};
BI.each(items, function (i, item) {
var region = self._createOneRegion(item);
self.regions[region.id] = region;
var drop = self._createOneDrop(region);
self.drops[drop.id] = drop;
self.storeDrops[drop.id] = drop;
});
},
//定方位
_locationRegion: function () {
var self = this, o = this.options;
this.locations = {};
var reg = [];
BI.each(this.regions, function (id, region) {
var t = new BI.Region(region.left, region.top, region.width, region.height);
t.id = id;
reg.push(t);
self.locations[id] = {top: [], left: [], right: [], bottom: []};
});
BI.each(reg, function (i, dim) {
var topRegion = new BI.Region(dim.x, 0, dim.w, dim.y),
bottomRegion = new BI.Region(dim.x, dim.y + dim.h, dim.w, BI.MAX),
leftRegion = new BI.Region(0, dim.y, dim.x, dim.h),
rightRegion = new BI.Region(dim.x + dim.w, dim.y, BI.MAX, dim.h);
BI.each(reg, function (j, tar) {
if (i !== j) {
if (tar.isIntersects(topRegion) && self._isLessThanEqual(tar.y + tar.h, dim.y)) {
self.locations[dim.id].top.push(self.regions[tar.id]);
}
if (tar.isIntersects(bottomRegion) && self._isMoreThanEqual(tar.y, dim.y + dim.h)) {
self.locations[dim.id].bottom.push(self.regions[tar.id]);
}
if (tar.isIntersects(leftRegion) && self._isLessThanEqual(tar.x + tar.w, dim.x)) {
self.locations[dim.id].left.push(self.regions[tar.id]);
}
if (tar.isIntersects(rightRegion) && self._isMoreThanEqual(tar.x, dim.x + dim.w)) {
self.locations[dim.id].right.push(self.regions[tar.id]);
}
}
});
});
},
_isEqual: function (num1, num2) {
return Math.abs(num1 - num2) < 2;
},
_isLessThan: function (num1, num2) {
return num1 < num2 && !this._isEqual(num1, num2);
},
_isMoreThan: function (num1, num2) {
return num1 > num2 && !this._isEqual(num1, num2);
},
_isLessThanEqual: function (num1, num2) {
return num1 <= num2 || this._isEqual(num1, num2);
},
_isMoreThanEqual: function (num1, num2) {
return num1 >= num2 || this._isEqual(num1, num2);
},
////方法////
_isPositionInBounds: function (position, bound) {
var region = new BI.Region(bound.left, bound.top, bound.width, bound.height);
return region.isPointInside(position.left, position.top);
},
//获取某区域等量相关联的区域
_getEquivalentRelativeRegions: function (name, direction) {
var self = this;
direction || (direction = ["top", "bottom", "left", "right"]);
var result = [];
var target = this.regions[name];
var tops = this.locations[name].top;
var bottoms = this.locations[name].bottom;
var lefts = this.locations[name].left;
var rights = this.locations[name].right;
var finded = direction.contains("top") && BI.some(tops, function (i, region) {
if (self._isEqual(region.top + region.height, target.top) && self._isEqual(region.left, target.left) && self._isEqual(region.width, target.width)) {
var clone = BI.clone(region);
clone.height = region.height + target.height;
result.push(clone);
return true;
}
});
if (!finded) {
finded = direction.contains("bottom") && BI.some(bottoms, function (i, region) {
if (self._isEqual(target.top + target.height, region.top) && self._isEqual(region.left, target.left) && self._isEqual(region.width, target.width)) {
var clone = BI.clone(region);
clone.top = region.top - target.height;
clone.height = region.height + target.height;
result.push(clone);
return true;
}
});
if (!finded) {
finded = direction.contains("left") && BI.some(lefts, function (i, region) {
if (self._isEqual(region.left + region.width, target.left) && self._isEqual(region.top, target.top) && self._isEqual(region.height, target.height)) {
var clone = BI.clone(region);
clone.width = region.width + target.width;
result.push(clone);
return true;
}
});
if (!finded) {
finded = direction.contains("right") && BI.some(rights, function (i, region) {
if (self._isEqual(target.left + target.width, region.left) && self._isEqual(region.top, target.top) && self._isEqual(region.height, target.height)) {
var clone = BI.clone(region);
clone.left = region.left - target.width;
clone.width = region.width + target.width;
result.push(clone);
return true;
}
});
if (!finded) {
var findTopRegions = [], findBottomRegions = [];
direction.contains("top") && BI.each(tops, function (i, region) {
if (self._isEqual(region.top + region.height, target.top)
&& self._isMoreThanEqual(region.left, target.left)
&& self._isLessThanEqual(region.left + region.width, target.left + target.width)) {
findTopRegions.push(region);
}
});
direction.contains("bottom") && BI.each(bottoms, function (i, region) {
if (self._isEqual(target.top + target.height, region.top)
&& self._isMoreThanEqual(region.left, target.left)
&& self._isLessThanEqual(region.left + region.width, target.left + target.width)) {
findBottomRegions.push(region);
}
});
var topValid = isRegionsValid(findTopRegions, "top"),
bottomValid = isRegionsValid(findBottomRegions, "bottom");
if (topValid && bottomValid) {
BI.each(findTopRegions, function (i, region) {
var clone = BI.clone(region);
clone.height = region.height + target.height / 2;
result.push(clone);
});
BI.each(findBottomRegions, function (i, region) {
var clone = BI.clone(region);
clone.top = region.top - target.height / 2;
clone.height = region.height + target.height / 2;
result.push(clone);
});
} else if (topValid) {
BI.each(findTopRegions, function (i, region) {
var clone = BI.clone(region);
clone.height = region.height + target.height;
result.push(clone);
});
} else if (bottomValid) {
BI.each(findBottomRegions, function (i, region) {
var clone = BI.clone(region);
clone.top = region.top - target.height;
clone.height = region.height + target.height;
result.push(clone);
});
}
if (!topValid && !bottomValid) {
var findLeftRegions = [], findRightRegions = [];
direction.contains("left") && BI.each(lefts, function (i, region) {
if (self._isEqual(region.left + region.width, target.left)
&& self._isMoreThanEqual(region.top, target.top)
&& self._isLessThanEqual(region.top + region.height, target.top + target.height)) {
findLeftRegions.push(region);
}
});
direction.contains("right") && BI.each(rights, function (i, region) {
if (self._isEqual(target.left + target.width, region.left)
&& self._isMoreThanEqual(region.top, target.top)
&& self._isLessThanEqual(region.top + region.height, target.top + target.height)) {
findRightRegions.push(region);
}
});
var leftValid = isRegionsValid(findLeftRegions, "left"),
rightValid = isRegionsValid(findRightRegions, "right");
if (leftValid && rightValid) {
BI.each(findLeftRegions, function (i, region) {
var clone = BI.clone(region);
clone.width = region.width + target.width / 2;
result.push(clone);
});
BI.each(findRightRegions, function (i, region) {
var clone = BI.clone(region);
clone.left = region.left - target.width / 2;
clone.width = region.width + target.width / 2;
result.push(clone);
});
} else if (leftValid) {
BI.each(findLeftRegions, function (i, region) {
var clone = BI.clone(region);
clone.width = region.width + target.width;
result.push(clone);
});
} else if (rightValid) {
BI.each(findRightRegions, function (i, region) {
var clone = BI.clone(region);
clone.left = region.left - target.width;
clone.width = region.width + target.width;
result.push(clone);
});
}
//上下左右都不可行
if (!leftValid && !rightValid) {
}
}
}
}
}
}
return result;
function isRegionsValid(regions, dir) {
var occupied = self._getRegionOccupied(regions);
switch (dir) {
case "top":
case "bottom":
return self._isEqual(occupied.left, target.left) && self._isEqual(occupied.width, target.width);
case "left":
case "right":
return self._isEqual(occupied.top, target.top) && self._isEqual(occupied.height, target.height);
}
return false;
}
},
//获取某区域直接相关联的区域
_getDirectRelativeRegions: function (name, direction) {
var self = this;
direction || (direction = ["top", "bottom", "left", "right"]);
var result = [];
var target = this.regions[name];
var tops = this.locations[name].top;
var bottoms = this.locations[name].bottom;
var lefts = this.locations[name].left;
var rights = this.locations[name].right;
var finded = direction.contains("top") && BI.some(tops, function (i, region) {
if (self._isEqual(region.top + region.height, target.top)
&& ((self._isMoreThanEqual(region.left, target.left) && self._isLessThan(region.left, target.left + target.width))
|| (self._isMoreThan(region.left + region.width, target.left) && self._isLessThanEqual(region.left + region.width, target.left + target.width))
|| (self._isLessThan(region.left, target.left) && self._isMoreThan(region.left + region.width, target.left + target.width)))) {
var clone = BI.clone(region);
clone.height = region.height + target.height;
result.push(clone);
}
});
if (!finded) {
finded = direction.contains("bottom") && BI.some(bottoms, function (i, region) {
if (self._isEqual(target.top + target.height, region.top)
&& ((self._isMoreThanEqual(region.left, target.left) && self._isLessThan(region.left, target.left + target.width))
|| (self._isMoreThan(region.left + region.width, target.left) && self._isLessThanEqual(region.left + region.width, target.left + target.width))
|| (self._isLessThan(region.left, target.left) && self._isMoreThan(region.left + region.width, target.left + target.width)))) {
var clone = BI.clone(region);
clone.top = region.top - target.height;
clone.height = region.height + target.height;
result.push(clone);
}
});
if (!finded) {
finded = direction.contains("left") && BI.some(lefts, function (i, region) {
if (self._isEqual(region.left + region.width, target.left)
&& ((self._isMoreThanEqual(region.top, target.top) && self._isLessThan(region.top, target.top + target.height))
|| (self._isMoreThan(region.top + region.height, target.top) && self._isLessThanEqual(region.top + region.height, target.top + target.height))
|| (self._isLessThan(region.top, target.top) && self._isMoreThan(region.top + region.height, target.top + target.height)))) {
var clone = BI.clone(region);
clone.width = region.width + target.width;
result.push(clone);
}
});
if (!finded) {
finded = direction.contains("right") && BI.some(rights, function (i, region) {
if (self._isEqual(target.left + target.width, region.left)
&& ((self._isMoreThanEqual(region.top, target.top) && self._isLessThan(region.top, target.top + target.height))
|| (self._isMoreThan(region.top + region.height, target.top) && self._isLessThanEqual(region.top + region.height, target.top + target.height))
|| (self._isLessThan(region.top, target.top) && self._isMoreThan(region.top + region.height, target.top + target.height)))) {
var clone = BI.clone(region);
clone.left = region.left - target.width;
clone.width = region.width + target.width;
result.push(clone);
}
});
}
}
}
return result;
},
//获取间接相关联的区域,即调整name区域后需要附带调整的所有相关区域(包括自身)
_getInDirectRelativeRegions: function (name, direction) {
var self = this, dict = ["top", "left", "right", "bottom"];
var result = {};
direction || (direction = dict);
function recursion(regions, dir, store, cache) {
BI.each(regions, function (i, region) {
if (cache[region.id]) {
return;
}
cache[region.id] = true;
if (!store[dict[3 - dir]]) {
store[dict[3 - dir]] = [];
}
store[dict[3 - dir]].push(region);
recursion(self._getDirectRelativeRegions(region.id, [dict[dir]]), 3 - dir, store, cache);
})
}
if (direction.contains("top")) {
var store = {}, cache = {};
recursion([this.regions[name]], dict.indexOf("top"), store, cache);
store["top"] = BI.sortBy(store["top"], "left");
store["bottom"] = BI.sortBy(store["bottom"], "left");
result["top"] = store;
}
if (direction.contains("bottom")) {
var store = {}, cache = {};
recursion([this.regions[name]], dict.indexOf("bottom"), store, cache);
store["top"] = BI.sortBy(store["top"], "left");
store["bottom"] = BI.sortBy(store["bottom"], "left");
result["bottom"] = store;
}
if (direction.contains("left")) {
var store = {}, cache = {};
recursion([this.regions[name]], dict.indexOf("left"), store, cache);
store["left"] = BI.sortBy(store["left"], "top");
store["right"] = BI.sortBy(store["right"], "top");
result["left"] = store;
}
if (direction.contains("right")) {
var store = {}, cache = {};
recursion([this.regions[name]], dict.indexOf("right"), store, cache);
store["left"] = BI.sortBy(store["left"], "top");
store["right"] = BI.sortBy(store["right"], "top");
result["right"] = store;
}
return result;
},
_getLeftAlignRegions: function (name) {
var self = this;
var tops = this._getDirectRelativeRegions(name, ["top"]);
var bottoms = this._getDirectRelativeRegions(name, ["bottom"]);
var current = this.regions[name];
var rtop = [], rbottom = [];
BI.each(tops, function (i, region) {
if (self._isEqual(region.left, current.left)) {
rtop.push(region);
}
});
BI.each(bottoms, function (i, region) {
if (self._isEqual(region.left, current.left)) {
rbottom.push(region);
}
});
return {
top: rtop,
bottom: rbottom
}
},
_getRightAlignRegions: function (name) {
var self = this;
var tops = this._getDirectRelativeRegions(name, ["top"]);
var bottoms = this._getDirectRelativeRegions(name, ["bottom"]);
var current = this.regions[name];
var rtop = [], rbottom = [];
BI.each(tops, function (i, region) {
if (self._isEqual(region.left + region.width, current.left + current.width)) {
rtop.push(region);
}
});
BI.each(bottoms, function (i, region) {
if (self._isEqual(region.left + region.width, current.left + current.width)) {
rbottom.push(region);
}
});
return {
top: rtop,
bottom: rbottom
}
},
_getTopAlignRegions: function (name) {
var self = this;
var lefts = this._getDirectRelativeRegions(name, ["left"]);
var rights = this._getDirectRelativeRegions(name, ["right"]);
var current = this.regions[name];
var rleft = [], rright = [];
BI.each(lefts, function (i, region) {
if (self._isEqual(region.top, current.top)) {
rleft.push(region);
}
});
BI.each(rights, function (i, region) {
if (self._isEqual(region.top, current.top)) {
rright.push(region);
}
});
return {
left: rleft,
right: rright
}
},
_getBottomAlignRegions: function (name) {
var self = this;
var lefts = this._getDirectRelativeRegions(name, ["left"]);
var rights = this._getDirectRelativeRegions(name, ["right"]);
var current = this.regions[name];
var rleft = [], rright = [];
BI.each(lefts, function (i, region) {
if (self._isEqual(region.top + region.height, current.top + current.height)) {
rleft.push(region);
}
});
BI.each(rights, function (i, region) {
if (self._isEqual(region.top + region.height, current.top + current.height)) {
rright.push(region);
}
});
return {
left: rleft,
right: rright
}
},
//获取占有的最大Region
_getRegionOccupied: function (regions) {
var self = this, o = this.options;
if (BI.size(regions || this.regions) <= 0) {
return {
left: 0,
top: 0,
width: 0,
height: 0
}
}
var minLeft = BI.MAX, maxLeft = BI.MIN, minTop = BI.MAX, maxTop = BI.MIN;
BI.each(regions || this.regions, function (id, region) {
minLeft = Math.min(minLeft, region.left);
maxLeft = Math.max(maxLeft, region.left + region.width);
minTop = Math.min(minTop, region.top);
maxTop = Math.max(maxTop, region.top + region.height);
});
return {
left: minLeft,
top: minTop,
width: maxLeft - minLeft,
height: maxTop - minTop
}
},
//两个区域的交叉面积
_getCrossArea: function (region1, region2) {
if (region1.left <= region2.left) {
if (region1.top <= region2.top) {
if (region1.top + region1.height > region2.top && region1.left + region1.width > region2.left) {
if (this._isEqual(region1.top + region1.height, region2.top) || this._isEqual(region1.left + region1.width, region2.left)) {
return 0;
}
return (region1.top + region1.height - region2.top) * (region1.left + region1.width - region2.left);
}
} else {
if (region2.top + region2.height > region1.top && region1.left + region1.width > region2.left) {
if (this._isEqual(region2.top + region2.height, region1.top) || this._isEqual(region1.left + region1.width, region2.left)) {
return 0;
}
return (region2.top + region2.height - region1.top) * (region1.left + region1.width - region2.left);
}
}
} else {
if (region1.top <= region2.top) {
if (region1.top + region1.height > region2.top && region2.left + region2.width > region1.left) {
if (this._isEqual(region1.top + region1.height, region2.top) || this._isEqual(region2.left + region2.width, region1.left)) {
return 0;
}
return (region1.top + region1.height - region2.top) * (region2.left + region2.width - region1.left);
}
} else {
if (region2.top + region2.height > region1.top && region2.left + region2.width > region1.left) {
if (this._isEqual(region2.top + region2.height, region1.top) || this._isEqual(region2.left + region2.width, region1.left)) {
return 0;
}
return (region2.top + region2.height - region1.top) * (region2.left + region2.width - region1.left);
}
}
}
return 0;
},
//是否有覆盖的组件
_isRegionOverlay: function (regions) {
var reg = [];
BI.each(regions || this.regions, function (id, region) {
reg.push(new BI.Region(region.left, region.top, region.width, region.height));
});
for (var i = 0, len = reg.length; i < len; i++) {
for (var j = i + 1; j < len; j++) {
var area1 = {
left: reg[i].x,
top: reg[i].y,
width: reg[i].w,
height: reg[i].h
};
var area2 = {
left: reg[j].x,
top: reg[j].y,
width: reg[j].w,
height: reg[j].h
};
if (reg[i].isIntersects(reg[j]) && this._getCrossArea(area1, area2) > 1) {
return true;
}
}
}
return false;
},
//布局是否是优良的
_isArrangeFine: function (regions) {
switch (this.options.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
if (this._isRegionOverlay()) {
return false;
}
var maxRegion = this._getRegionOccupied(regions);
var area = maxRegion.width * maxRegion.height;
var all = 0;
BI.each(regions || this.regions, function (id, region) {
all += region.width * region.height;
});
return Math.abs(area - all) < 8;
case BI.Arrangement.LAYOUT_TYPE.FREE:
return true;
case BI.Arrangement.LAYOUT_TYPE.GRID:
if (this._isRegionOverlay()) {
return false;
}
}
return true;
},
_getRegionNames: function (regions) {
var names = [];
BI.each(regions || this.regions, function (i, region) {
names.push(region.id || region.attr("id"));
});
return names;
},
_getRegionsByNames: function (names, regions) {
names = BI.isArray(names) ? names : [names];
regions = regions || this.regions;
if (BI.isArray(regions)) {
var result = [];
BI.each(regions, function (i, region) {
if (names.contains(region.id || region.attr("id"))) {
result.push(region);
}
});
} else {
var result = {};
BI.each(names, function (i, name) {
result[name] = regions[name];
});
}
return result;
},
_cloneRegion: function (regions) {
var clone = {};
BI.each(regions || this.regions, function (id, region) {
clone[id] = {};
clone[id].el = region.el;
clone[id].id = region.id;
clone[id].left = region.left;
clone[id].top = region.top;
clone[id].width = region.width;
clone[id].height = region.height;
});
return clone;
},
//测试合法性
_test: function (regions) {
var self = this;
return !BI.any(regions || this.regions, function (i, region) {
if (BI.isNaN(region.width) || BI.isNaN(region.height) || region.width <= 21 || region.height <= 21) {
return true;
}
})
},
//对区域进行划分
_splitRegions: function (name) {
var result = [];
var tid = BI.UUID();
var _left = this._getLeftAlignRegions(name);
var _right = this._getRightAlignRegions(name);
var _top = this._getTopAlignRegions(name);
var _bottom = this._getBottomAlignRegions(name);
if (_left.top.length > 0) {
var upid = _left.top[0].id;
var tid = BI.UUID();
var clone = this._cloneRegion();
var _cur = clone[name];
var split = Math.min(clone[name].width, clone[upid].width) / 2;//两个组件中较小宽度的一半
var left = (clone[name].left + clone[upid].left) / 2;//求平均,减少误差
var insert = clone[tid] = {//新增的区域
left: left,
top: clone[upid].top,
width: split,
height: clone[name].height + clone[upid].height
};
BI.extend(clone[name], {
left: left + split,
width: clone[name].width - split - (left - clone[name].left)
});
BI.extend(clone[upid], {
left: left + split,
width: clone[upid].width - split - (left - clone[upid].left)
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "left-top",
regions: clone,
insert: insert
});
}
}
if (_left.bottom.length > 0) {
var bottomid = _left.bottom[0].id;
var tid = BI.UUID();
var clone = this._cloneRegion();
var _cur = clone[name];
var split = Math.min(clone[name].width, clone[bottomid].width) / 2;
var left = (clone[name].left + clone[bottomid].left) / 2;
var insert = clone[tid] = {//新增的区域
left: left,
top: clone[name].top,
width: split,
height: clone[name].height + clone[bottomid].height
};
BI.extend(clone[name], {
left: left + split,
width: clone[name].width - split - (left - clone[name].left)
});
BI.extend(clone[bottomid], {
left: left + split,
width: clone[bottomid].width - split - (left - clone[bottomid].left)
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "bottom-left",
regions: clone,
insert: insert
});
}
}
if (_right.top.length > 0) {
var upid = _right.top[0].id;
var tid = BI.UUID();
var clone = this._cloneRegion();
var _cur = clone[name];
var split = Math.min(clone[name].width, clone[upid].width) / 2;//两个组件中较小宽度的一半
var right = (clone[name].left + clone[name].width + clone[upid].left + clone[upid].width) / 2;//求平均,减少误差
var insert = clone[tid] = {//新增的区域
left: right - split,
top: clone[upid].top,
width: split,
height: clone[name].height + clone[upid].height
};
BI.extend(clone[name], {
width: right - clone[name].left - split
});
BI.extend(clone[upid], {
width: right - clone[upid].left - split
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "top-right",
regions: clone,
insert: insert
});
}
}
if (_right.bottom.length > 0) {
var bottomid = _right.bottom[0].id;
var tid = BI.UUID();
var clone = this._cloneRegion();
var _cur = clone[name];
var split = Math.min(clone[name].width, clone[bottomid].width) / 2;//两个组件中较小宽度的一半
var right = (clone[name].left + clone[name].width + clone[bottomid].left + clone[bottomid].width) / 2;//求平均,减少误差
var insert = clone[tid] = {//新增的区域
left: right - split,
top: clone[name].top,
width: split,
height: clone[name].height + clone[bottomid].height
};
BI.extend(clone[name], {
width: right - clone[name].left - split
});
BI.extend(clone[bottomid], {
width: right - clone[bottomid].left - split
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "bottom-right",
regions: clone,
insert: insert
});
}
}
if (_top.left.length > 0) {
var leftid = _top.left[0].id;
var tid = BI.UUID();
var clone = this._cloneRegion();
var _cur = clone[name];
var split = Math.min(clone[name].height, clone[leftid].height) / 2;//两个组件中较小高度的一半
var top = (clone[name].top + clone[leftid].top) / 2;//求平均,减少误差
var insert = clone[tid] = {//新增的区域
top: top,
left: clone[leftid].left,
height: split,
width: clone[name].width + clone[leftid].width
};
BI.extend(clone[name], {
top: top + split,
height: clone[name].height - split - (top - clone[name].top)
});
BI.extend(clone[leftid], {
top: top + split,
height: clone[leftid].height - split - (top - clone[leftid].top)
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "top-left",
regions: clone,
insert: insert
});
}
}
if (_top.right.length > 0) {
var rightid = _top.right[0].id;
var tid = BI.UUID();
var clone = this._cloneRegion();
var _cur = clone[name];
var split = Math.min(clone[name].height, clone[rightid].height) / 2;//两个组件中较小高度的一半
var top = (clone[name].top + clone[rightid].top) / 2;//求平均,减少误差
var insert = clone[tid] = {//新增的区域
top: top,
left: clone[name].left,
height: split,
width: clone[name].width + clone[rightid].width
};
BI.extend(clone[name], {
top: top + split,
height: clone[name].height - split - (top - clone[name].top)
});
BI.extend(clone[rightid], {
top: top + split,
height: clone[rightid].height - split - (top - clone[rightid].top)
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "top-right-second",
regions: clone,
insert: insert
});
}
}
if (_bottom.left.length > 0) {
var leftid = _bottom.left[0].id;
var tid = BI.UUID();
var clone = this._cloneRegion();
var _cur = clone[name];
var split = Math.min(clone[name].height, clone[leftid].height) / 2;//两个组件中较小高度的一半
var bottom = (clone[name].top + clone[name].height + clone[leftid].top + clone[leftid].height) / 2;//求平均,减少误差
var insert = clone[tid] = {//新增的区域
left: clone[leftid].left,
top: bottom - split,
height: split,
width: clone[name].width + clone[leftid].width
};
BI.extend(clone[name], {
height: bottom - clone[name].top - split
});
BI.extend(clone[leftid], {
height: bottom - clone[leftid].top - split
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "bottom-left-second",
regions: clone,
insert: insert
});
}
}
if (_bottom.right.length > 0) {
var rightid = _bottom.right[0].id;
var tid = BI.UUID();
var clone = this._cloneRegion();
var _cur = clone[name];
var split = Math.min(clone[name].height, clone[rightid].height) / 2;//两个组件中较小高度的一半
var bottom = (clone[name].top + clone[name].height + clone[rightid].top + clone[rightid].height) / 2;//求平均,减少误差
var insert = clone[tid] = {//新增的区域
left: clone[name].left,
top: bottom - split,
height: split,
width: clone[name].width + clone[rightid].width
};
BI.extend(clone[name], {
height: bottom - clone[name].top - split
});
BI.extend(clone[rightid], {
height: bottom - clone[rightid].top - split
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "bottom-right-second",
regions: clone,
insert: insert
});
}
}
//有上方居中drop
var lefts = _top.left, rights = _top.right;
if (lefts.length > 0 && rights.length > 0) {
var count = 0;
var store = [this.regions[name]];
while (lefts.length > 0 || rights.length > 0) {
var clone = this._cloneRegion();
if (lefts.length > 0) {
store.push(this.regions[lefts[0].id]);
}
if (rights.length > 0) {
store.push(this.regions[rights[0].id]);
}
count++;
var top = BI.average(store, function (i, r) {//求平均,减少误差
return r.top;
});
var occupied = this._getRegionOccupied(store);
var split = BI.min(store, function (i, r) {
return r.height;
}).height / 2;
var insert = clone[tid] = {
left: occupied.left,
width: occupied.width,
top: top,
height: split
};
BI.each(store, function (i, region) {
BI.extend(clone[region.id], {
top: top + split,
height: region.height - split - (top - region.top)
});
});
if (this._test(store)) {
delete clone[tid];
result.push({
type: "top-center" + count,
regions: clone,
insert: insert
});
} else {
break;
}
if (lefts.length > 0) {
lefts = this._getTopAlignRegions(lefts[0].id).left;
}
if (rights.length > 0) {
rights = this._getTopAlignRegions(rights[0].id).right;
}
}
}
//有下方居中drop
var lefts = _bottom.left, rights = _bottom.right;
if (lefts.length > 0 && rights.length > 0) {
var count = 0;
var store = [this.regions[name]];
while (lefts.length > 0 || rights.length > 0) {
var clone = this._cloneRegion();
if (lefts.length > 0) {
store.push(this.regions[lefts[0].id]);
}
if (rights.length > 0) {
store.push(this.regions[rights[0].id]);
}
count++;
var bottom = BI.average(store, function (i, r) {//求平均,减少误差
return r.top + r.height;
});
var occupied = this._getRegionOccupied(store);
var split = BI.min(store, function (i, r) {
return r.height;
}).height / 2;
var insert = clone[tid] = {
left: occupied.left,
width: occupied.width,
top: bottom - split,
height: split
};
BI.each(store, function (i, region) {
BI.extend(clone[region.id], {
height: bottom - region.top - split
});
});
if (this._test(store)) {
delete clone[tid];
result.push({
type: "bottom-center" + count,
regions: clone,
insert: insert
});
} else {
break;
}
if (lefts.length > 0) {
lefts = this._getBottomAlignRegions(lefts[0].id).left;
}
if (rights.length > 0) {
rights = this._getBottomAlignRegions(rights[0].id).right;
}
}
}
//有左方居中drop
var tops = _left.top, bottoms = _left.bottom;
if (tops.length > 0 && bottoms.length > 0) {
var count = 0;
var store = [this.regions[name]];
while (tops.length > 0 || bottoms.length > 0) {
var clone = this._cloneRegion();
if (tops.length > 0) {
store.push(this.regions[tops[0].id]);
}
if (bottoms.length > 0) {
store.push(this.regions[bottoms[0].id]);
}
count++;
var left = BI.average(store, function (i, r) {//求平均,减少误差
return r.left;
});
var occupied = this._getRegionOccupied(store);
var split = BI.min(store, function (i, r) {
return r.width;
}).width / 2;
var insert = clone[tid] = {
left: left,
width: split,
top: occupied.top,
height: occupied.height
};
BI.each(store, function (i, region) {
BI.extend(clone[region.id], {
left: left + split,
width: region.width - split - (left - region.left)
});
});
if (this._test(store)) {
delete clone[tid];
result.push({
type: "left-center" + count,
regions: clone,
insert: insert
});
} else {
break;
}
if (tops.length > 0) {
tops = this._getLeftAlignRegions(tops[0].id).top;
}
if (bottoms.length > 0) {
bottoms = this._getLeftAlignRegions(bottoms[0].id).bottom;
}
}
}
//有右方居中drop
var tops = _right.top, bottoms = _right.bottom;
if (tops.length > 0 && bottoms.length > 0) {
var count = 0;
var store = [this.regions[name]];
while (tops.length > 0 || bottoms.length > 0) {
var clone = this._cloneRegion();
if (tops.length > 0) {
store.push(this.regions[tops[0].id]);
}
if (bottoms.length > 0) {
store.push(this.regions[bottoms[0].id]);
}
count++;
var right = BI.average(store, function (i, r) {//求平均,减少误差
return r.left + r.width;
});
var occupied = this._getRegionOccupied(store);
var split = BI.min(store, function (i, r) {
return r.width;
}).width / 2;
var insert = clone[tid] = {
left: right - split,
width: split,
top: occupied.top,
height: occupied.height
};
BI.each(store, function (i, region) {
BI.extend(clone[region.id], {
width: right - region.left - split
});
});
if (this._test(store)) {
delete clone[tid];
result.push({
type: "right-center" + count,
regions: clone,
insert: insert
});
} else {
break;
}
if (tops.length > 0) {
tops = this._getRightAlignRegions(tops[0].id).top;
}
if (bottoms.length > 0) {
bottoms = this._getRightAlignRegions(bottoms[0].id).bottom;
}
}
}
var lefts = this._getEquivalentRelativeRegions(name, ["left"]);
if (lefts.length === 1) {
var clone = this._cloneRegion();
var _cur = clone[name];
var left = this.regions[lefts[0].id];
var width = left.width;
var all = left.width + _cur.width;
var ratio = width / all;
var split = all / 3;
var lleft = width - split * ratio, rleft = _cur.width - split * (1 - ratio);
var insert = false;
if (lleft <= 21) {
rleft = _cur.width - split;
if (rleft <= 21) {
} else {
insert = clone[tid] = {
top: _cur.top,
height: _cur.height,
left: _cur.left,
width: split,
};
BI.extend(clone[name], {
top: _cur.top,
height: _cur.height,
left: _cur.left + split,
width: _cur.width - split
});
}
} else if (rleft <= 21) {
lleft = width - split;
if (lleft <= 21) {
} else {
insert = clone[tid] = {
top: _cur.top,
height: _cur.height,
left: _cur.left - split,
width: split,
};
BI.extend(clone[left.id], {
top: left.top,
height: left.height,
left: left.left,
width: left.width - split
});
}
} else {
insert = clone[tid] = {
top: _cur.top,
height: _cur.height,
left: left.left + lleft,
width: split,
};
BI.extend(clone[name], {
top: _cur.top,
height: _cur.height,
left: _cur.left + _cur.width - rleft,
width: rleft
});
BI.extend(clone[left.id], {
top: left.top,
height: left.height,
left: left.left,
width: lleft
});
}
if (insert !== false) {
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "left-line",
regions: clone,
insert: insert
})
}
}
}
var rights = this._getEquivalentRelativeRegions(name, ["right"]);
if (rights.length === 1) {
var clone = this._cloneRegion();
var _cur = clone[name];
var right = this.regions[rights[0].id];
var width = right.width;
var all = right.width + _cur.width;
var ratio = width / all;
var split = all / 3;
var lleft = _cur.width - split * (1 - ratio), rleft = width - split * ratio;
var insert = false;
if (lleft <= 21) {
rleft = width - split;
if (rleft <= 21) {
} else {
insert = clone[tid] = {
top: right.top,
height: right.height,
left: right.left,
width: split
};
BI.extend(clone[right.id], {
top: right.top,
height: right.height,
left: right.left + split,
width: right.width - split
})
}
} else if (rleft <= 21) {
lleft = _cur.width - split;
if (lleft <= 21) {
} else {
insert = clone[tid] = {
top: _cur.top,
height: _cur.height,
left: _cur.left + lleft,
width: split
};
BI.extend(clone[name], {
top: _cur.top,
height: _cur.height,
left: _cur.left,
width: _cur.width - split
})
}
} else {
insert = clone[tid] = {
top: _cur.top,
height: _cur.height,
left: _cur.left + lleft,
width: split
};
BI.extend(clone[name], {
top: _cur.top,
height: _cur.height,
left: _cur.left,
width: lleft
});
BI.extend(clone[right.id], {
top: right.top,
height: right.height,
left: right.left + right.width - rleft,
width: rleft
});
}
if (insert !== false) {
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "right-line",
regions: clone,
insert: insert
})
}
}
}
var tops = this._getEquivalentRelativeRegions(name, ["top"]);
if (tops.length === 1) {
var clone = this._cloneRegion();
var _cur = clone[name];
var top = this.regions[tops[0].id];
var height = top.height;
var all = top.height + _cur.height;
var ratio = height / all;
var split = all / 3;
var tleft = height - split * ratio, bleft = _cur.height - split * (1 - ratio);
var insert = false;
if (tleft <= 21) {
bleft = _cur.height - split;
if (bleft <= 21) {
} else {
insert = clone[tid] = {
top: _cur.top,
width: _cur.width,
left: _cur.left,
height: split
};
BI.extend(clone[name], {
top: _cur.top + split,
height: _cur.height - split,
left: _cur.left,
width: _cur.width
});
}
}
if (bleft <= 21) {
tleft = height - split;
if (tleft <= 21) {
} else {
insert = clone[tid] = {
top: _cur.top - split,
height: split,
left: _cur.left,
width: _cur.width
};
BI.extend(clone[top.id], {
top: top.top,
height: top.height - split,
left: top.left,
width: top.width
});
}
} else {
insert = clone[tid] = {
top: top.top + tleft,
height: split,
left: _cur.left,
width: _cur.width
};
BI.extend(clone[name], {
top: _cur.top + _cur.height - bleft,
height: bleft,
left: _cur.left,
width: _cur.width
});
BI.extend(clone[top.id], {
top: top.top,
height: tleft,
left: top.left,
width: top.width
});
}
if (insert !== false) {
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "top-line",
regions: clone,
insert: insert
})
}
}
}
var bottoms = this._getEquivalentRelativeRegions(name, ["bottom"]);
if (bottoms.length === 1) {
var clone = this._cloneRegion();
var _cur = clone[name];
var bottom = this.regions[bottoms[0].id];
var height = bottom.height;
var all = bottom.height + _cur.height;
var ratio = height / all;
var split = all / 3;
var tleft = _cur.height - split * (1 - ratio), bleft = height - split * ratio;
var insert = false;
if (tleft <= 21) {
bleft = height - split;
if (bleft <= 21) {
} else {
insert = clone[tid] = {
top: bottom.top,
height: bottom.height,
left: bottom.left,
width: split
};
BI.extend(clone[bottom.id], {
top: bottom.top + split,
height: bottom.height - split,
left: bottom.left,
width: bottom.width
});
}
} else if (bleft <= 21) {
tleft = _cur.height - split;
if (tleft <= 21) {
} else {
insert = clone[tid] = {
top: _cur.top + tleft,
height: split,
left: _cur.left,
width: _cur.width
};
BI.extend(clone[name], {
top: _cur.top,
height: _cur.height - split,
left: _cur.left,
width: _cur.width
});
}
} else {
insert = clone[tid] = {
top: _cur.top + tleft,
height: split,
left: _cur.left,
width: _cur.width,
};
BI.extend(clone[name], {
top: _cur.top,
height: tleft,
left: _cur.left,
width: _cur.width
});
BI.extend(clone[bottom.id], {
top: bottom.top + bottom.height - bleft,
height: bleft,
left: bottom.left,
width: bottom.width
});
}
if (insert !== false) {
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "bottom-line",
regions: clone,
insert: insert
})
}
}
}
if (tops.length >= 1) {
result.push({
type: "top-gap"
});
}
if (bottoms.length >= 1) {
result.push({
type: "bottom-gap"
});
}
//上
var clone = this._cloneRegion();
var _cur = clone[name];
var insert = clone[tid] = {
top: _cur.top,
left: _cur.left,
width: _cur.width,
height: _cur.height / 2,
};
BI.extend(clone[name], {
top: _cur.top + _cur.height / 2,
left: _cur.left,
width: _cur.width,
height: _cur.height / 2
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "top",
regions: clone,
insert: insert
})
}
//下
var clone = this._cloneRegion();
var _cur = clone[name];
var insert = clone[tid] = {
top: _cur.top + _cur.height / 2,
left: _cur.left,
width: _cur.width,
height: _cur.height / 2
};
BI.extend(clone[name], {
top: _cur.top,
left: _cur.left,
width: _cur.width,
height: _cur.height / 2
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "bottom",
regions: clone,
insert: insert
})
}
//左
var clone = this._cloneRegion();
var _cur = clone[name];
var insert = clone[tid] = {
top: _cur.top,
left: _cur.left,
width: _cur.width / 2,
height: _cur.height
};
BI.extend(clone[name], {
top: _cur.top,
left: _cur.left + _cur.width / 2,
width: _cur.width / 2,
height: _cur.height
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "left",
regions: clone,
insert: insert
})
}
//右
var clone = this._cloneRegion();
var _cur = clone[name];
var insert = clone[tid] = {
top: _cur.top,
left: _cur.left + _cur.width / 2,
width: _cur.width / 2,
height: _cur.height
};
BI.extend(clone[name], {
top: _cur.top,
left: _cur.left,
width: _cur.width / 2,
height: _cur.height
});
if (this._test(clone)) {
delete clone[tid];
result.push({
type: "right",
regions: clone,
insert: insert
})
}
return result;
},
_positionAt: function (position, bound) {
var left = position.left - bound.left, top = position.top - bound.top;
var right = bound.width - left, bottom = bound.height - top;
var halfW = bound.width / 2, halfH = bound.height / 2;
if (left < 0 || top < 0 || right < 0 || bottom < 0) {
return;
}
var devides = this._splitRegions(bound.id);
var types = [];
var result = {};
var topcenterCount = 0, bottomcenterCount = 0, leftcenterCount = 0, rightcenterCount = 0;
BI.each(devides, function (i, devide) {
if (devide.type.indexOf("top-center") > -1) {
topcenterCount++;
} else if (devide.type.indexOf("bottom-center") > -1) {
bottomcenterCount++;
} else if (devide.type.indexOf("left-center") > -1) {
leftcenterCount++;
} else if (devide.type.indexOf("right-center") > -1) {
rightcenterCount++;
}
types.push(devide.type);
result[devide.type] = devide;
});
//drop
if (top >= 5 && top <= 15 && left >= 5 && left <= 15 && types.contains("left-top")) {
return result["left-top"];
}
if (top >= 5 && top <= 15 && right >= 5 && right <= 15 && types.contains("top-right")) {
return result["top-right"];
}
if (bottom >= 5 && bottom <= 15 && left >= 5 && left <= 15 && types.contains("bottom-left")) {
return result["bottom-left"];
}
if (bottom >= 5 && bottom <= 15 && right >= 5 && right <= 15 && types.contains("bottom-right")) {
return result["bottom-right"];
}
if (top >= 5 && top <= 15 && left >= 25 && left <= 35 && types.contains("top-left")) {
return result["top-left"];
}
if (top >= 5 && top <= 15 && right >= 25 && right <= 35 && types.contains("top-right-second")) {
return result["top-right-second"];
}
if (bottom >= 5 && bottom <= 15 && left >= 25 && left <= 35 && types.contains("bottom-left-second")) {
return result["bottom-left-second"];
}
if (bottom >= 5 && bottom <= 15 && right >= 25 && right <= 35 && types.contains("bottom-right-second")) {
return result["bottom-right-second"];
}
//topcenter或bottomcenter
if (left >= halfW - 10 && left <= halfW + 10 && (topcenterCount > 0 || bottomcenterCount > 0)) {
for (var i = 1; i <= topcenterCount; i++) {
var s = (topcenterCount - i) * 20 + 5, e = s + 10;
if (top >= s && top <= e) {
return result["top-center" + i];
}
}
for (var i = 1; i <= bottomcenterCount; i++) {
var s = (bottomcenterCount - i) * 20 + 5, e = s + 10;
if (bottom >= s && bottom <= e) {
return result["bottom-center" + i];
}
}
}
//leftcenter或rightcenter
if (top >= halfH - 10 && top <= halfH + 10 && (leftcenterCount > 0 || rightcenterCount > 0)) {
for (var i = 1; i <= leftcenterCount; i++) {
var s = (leftcenterCount - i) * 20 + 5, e = s + 10;
if (left >= s && left <= e) {
return result["left-center" + i];
}
}
for (var i = 1; i <= rightcenterCount; i++) {
var s = (rightcenterCount - i) * 20 + 5, e = s + 10;
if (right >= s && right <= e) {
return result["right-center" + i];
}
}
}
//缝隙
if (top <= 8 && types.contains("top-gap")) {
return result["top-gap"];
}
if (bottom <= 8 && types.contains("bottom-gap")) {
return result["bottom-gap"];
}
//三分
if (top <= 15 && left >= 15 && right >= 15 && types.contains("top-line")) {
return result["top-line"];
}
if (left <= 15 && top >= 15 && bottom >= 15 && types.contains("left-line")) {
return result["left-line"];
}
if (right <= 15 && top >= 15 && bottom >= 15 && types.contains("right-line")) {
return result["right-line"];
}
if (bottom <= 15 && left >= 15 && right >= 15 && types.contains("bottom-line")) {
return result["bottom-line"];
}
//平分
if (top <= 1 / 4 * bound.height && types.contains("top")) {
return result["top"];
}
if (top >= 3 / 4 * bound.height && types.contains("bottom")) {
return result["bottom"];
}
if (left <= bound.width / 2 && types.contains("left")) {
return result["left"];
}
return result["right"];
},
_getScrollOffset: function () {
return {
left: this.scrollContainer.element[0].scrollLeft,
top: this.scrollContainer.element[0].scrollTop
}
},
////操作////
_createOneRegion: function (item) {
var el = BI.createWidget(item.el);
el.setVisible(true);
return {
id: el.attr("id"),
left: item.left,
top: item.top,
width: item.width,
height: item.height,
el: el
}
},
_createOneDrop: function (region) {
if (this.storeDrops[region.id]) {
var drop = this.storeDrops[region.id].el;
drop.setVisible(true);
} else {
var drop = BI.createWidget({
type: "bi.layout",
cls: "arrangement-drop-region",
widgetName: region.id
});
}
return {
id: region.id,
left: region.left,
top: region.top,
width: region.width,
height: region.height,
el: drop
}
},
_calculateDrops: function () {
var self = this;
BI.each(this.drops, function (id, drop) {
drop.el.empty();
var devides = self._splitRegions(id);
var topcenterCount = 0, bottomcenterCount = 0, leftcenterCount = 0, rightcenterCount = 0;
var absolutes = [];
var horizontals = [];
var verticals = [];
BI.each(devides, function (i, devide) {
if (devide.type.indexOf("top-center") > -1) {
topcenterCount++;
} else if (devide.type.indexOf("bottom-center") > -1) {
bottomcenterCount++;
} else if (devide.type.indexOf("left-center") > -1) {
leftcenterCount++;
} else if (devide.type.indexOf("right-center") > -1) {
rightcenterCount++;
}
});
BI.each(devides, function (i, devide) {
switch (devide.type) {
case "left-top":
absolutes.push({
el: {
type: "bi.layout",
width: 10,
height: 10,
cls: "drop-devider"
},
left: 5,
top: 5
});
break;
case "top-right":
absolutes.push({
el: {
type: "bi.layout",
width: 10,
height: 10,
cls: "drop-devider"
},
right: 5,
top: 5
});
break;
case "bottom-left":
absolutes.push({
el: {
type: "bi.layout",
width: 10,
height: 10,
cls: "drop-devider"
},
left: 5,
bottom: 5
});
break;
case "bottom-right":
absolutes.push({
el: {
type: "bi.layout",
width: 10,
height: 10,
cls: "drop-devider"
},
right: 5,
bottom: 5
});
break;
case "top-left":
absolutes.push({
el: {
type: "bi.layout",
width: 10,
height: 10,
cls: "drop-devider"
},
left: 25,
top: 5
});
break;
case "top-right-second":
absolutes.push({
el: {
type: "bi.layout",
width: 10,
height: 10,
cls: "drop-devider"
},
right: 25,
top: 5
});
break;
case "bottom-left-second":
absolutes.push({
el: {
type: "bi.layout",
width: 10,
height: 10,
cls: "drop-devider"
},
left: 25,
bottom: 5
});
break;
case "bottom-right-second":
absolutes.push({
el: {
type: "bi.layout",
width: 10,
height: 10,
cls: "drop-devider"
},
right: 25,
bottom: 5
});
break;
default:
if (devide.type.indexOf("top-center") > -1) {
var num = devide.type.split("top-center")[1];
horizontals.push({
el: {
type: "bi.layout",
width: 20,
height: 10,
cls: "drop-devider"
},
tgap: 20 * (topcenterCount - BI.parseInt(num)) + 5
})
} else if (devide.type.indexOf("bottom-center") > -1) {
var num = devide.type.split("bottom-center")[1];
horizontals.push({
el: {
type: "bi.layout",
width: 20,
height: 10,
cls: "drop-devider"
},
bgap: 20 * (bottomcenterCount - BI.parseInt(num)) + 5
})
} else if (devide.type.indexOf("left-center") > -1) {
var num = devide.type.split("left-center")[1];
verticals.push({
el: {
type: "bi.layout",
width: 10,
height: 20,
cls: "drop-devider"
},
lgap: 20 * (leftcenterCount - BI.parseInt(num)) + 5
})
} else if (devide.type.indexOf("right-center") > -1) {
var num = devide.type.split("right-center")[1];
verticals.push({
el: {
type: "bi.layout",
width: 10,
height: 20,
cls: "drop-devider"
},
rgap: 20 * (rightcenterCount - BI.parseInt(num)) + 5
})
}
break;
}
});
BI.createWidget({
type: "bi.absolute",
element: drop.el,
items: absolutes
});
BI.createWidget({
type: "bi.absolute_horizontal_adapt",
element: drop.el,
items: horizontals
});
BI.createWidget({
type: "bi.absolute_vertical_adapt",
element: drop.el,
items: verticals
});
});
},
_applyRegion: function (regions) {
var self = this, o = this.options;
BI.each(regions || this.regions, function (i, region) {
region.el.element.css({
left: region.left,
top: region.top,
width: region.width,
height: region.height
});
self.drops[region.id].left = region.left;
self.drops[region.id].top = region.top;
self.drops[region.id].width = region.width;
self.drops[region.id].height = region.height;
});
BI.each(this.drops, function (i, region) {
region.el.element.css({
left: region.left,
top: region.top,
width: region.width,
height: region.height
});
});
this._applyContainer();
this._calculateDrops();
this.ratio = this.getLayoutRatio();
},
_renderRegion: function () {
var self = this;
BI.createWidget({
type: "bi.absolute",
element: this.container,
items: BI.toArray(this.regions)
});
BI.createWidget({
type: "bi.absolute",
element: this.droppable,
items: BI.toArray(this.drops)
});
},
getClientWidth: function () {
return this.scrollContainer.element[0].clientWidth;
},
getClientHeight: function () {
return this.scrollContainer.element[0].clientHeight;
},
_applyContainer: function () {
//先掩藏后显示能够明确滚动条是否出现
this.scrollContainer.element.css("overflow", "hidden");
var occupied = this._getRegionOccupied();
this.container.element.width(occupied.left + occupied.width).height(occupied.top + occupied.height);
this.scrollContainer.element.css("overflow", "auto");
return occupied;
},
_modifyRegion: function (regions) {
BI.each(this.regions, function (id, region) {
if (regions[id]) {
region.left = regions[id].left;
region.top = regions[id].top;
region.width = regions[id].width;
region.height = regions[id].height;
}
});
BI.each(this.drops, function (id, region) {
if (regions[id]) {
region.left = regions[id].left;
region.top = regions[id].top;
region.width = regions[id].width;
region.height = regions[id].height;
}
});
},
_addRegion: function (item) {
var region = this._createOneRegion(item);
this.regions[region.id] = region;
var drop = this._createOneDrop(region);
this.drops[drop.id] = drop;
this.storeDrops[drop.id] = drop;
this._locationRegion();
BI.createWidget({
type: "bi.absolute",
element: this.container,
items: [region]
});
BI.createWidget({
type: "bi.absolute",
element: this.droppable,
items: [drop]
})
},
_deleteRegionByName: function (name) {
this.regions[name].el.setVisible(false);
this.drops[name].el.setVisible(false);
delete this.regions[name];
delete this.drops[name];
this._locationRegion();
},
_setArrangeSize: function (size) {
this.arrangement.element.css({
left: size.left,
top: size.top,
width: size.width,
height: size.height
})
},
//Grid
_getOneWidthPortion: function () {
return this.getClientWidth() / BI.Arrangement.PORTION;
},
_getGridPositionAndSize: function (position) {
var perWidth = this._getOneWidthPortion();
var widthPortion = Math.round(position.width / perWidth);
var leftPortion = Math.round(position.left / perWidth);
var topPortion = Math.round(position.top / BI.Arrangement.GRID_HEIGHT);
var heightPortion = Math.round(position.height / BI.Arrangement.GRID_HEIGHT);
// if (leftPortion > BI.Arrangement.PORTION) {
// leftPortion = BI.Arrangement.PORTION;
// }
// if (widthPortion > BI.Arrangement.PORTION) {
// widthPortion = BI.Arrangement.PORTION;
// }
// if (leftPortion + widthPortion > BI.Arrangement.PORTION) {
// leftPortion = BI.Arrangement.PORTION - widthPortion;
// }
if (widthPortion === 0) {
widthPortion = 1;
}
if (heightPortion === 0) {
heightPortion = 1;
}
return {
x: leftPortion,
y: topPortion,
w: widthPortion,
h: heightPortion
}
},
_getBlockPositionAndSize: function (position) {
var perWidth = this._getOneWidthPortion();
return {
left: position.x * perWidth,
top: position.y * BI.Arrangement.GRID_HEIGHT,
width: position.w * perWidth,
height: position.h * BI.Arrangement.GRID_HEIGHT
};
},
_getLayoutsByRegions: function (regions) {
var self = this;
var result = [];
BI.each(regions || this.regions, function (id, region) {
result.push(BI.extend(self._getGridPositionAndSize(region), {
i: region.id
}))
});
return result;
},
_getLayoutIndexByName: function (layout, name) {
return BI.findIndex(layout, function (i, l) {
return l.i === name;
});
},
_setBlockPositionAndSize: function (size) {
this.block.element.css({
left: size.left,
top: size.top,
width: size.width,
height: size.height
});
},
_getRegionsByLayout: function (layout) {
var self = this;
var regions = {};
BI.each(layout, function (i, ly) {
regions[ly.i] = BI.extend(self._getBlockPositionAndSize(ly), {
id: ly.i
});
});
return regions;
},
_setRegionsByLayout: function (regions, layout) {
var self = this;
regions || (regions = this.regions);
BI.each(layout, function (i, ly) {
if (regions[ly.i]) {
BI.extend(regions[ly.i], self._getBlockPositionAndSize(ly));
}
});
return regions;
},
_moveElement: function (layout, l, x, y, isUserAction) {
var self = this;
if (l._static) {
return layout;
}
if (l.y === y && l.x === x) {
return layout;
}
var movingUp = y && l.y > y;
if (typeof x === 'number') {
l.x = x;
}
if (typeof y === 'number') {
l.y = y;
}
l.moved = true;
var sorted = this._sortLayoutItemsByRowCol(layout);
if (movingUp) {
sorted = sorted.reverse();
}
var collisions = getAllCollisions(sorted, l);
for (var i = 0, len = collisions.length; i < len; i++) {
var collision = collisions[i];
if (collision.moved) {
continue;
}
if (l.y > collision.y && l.y - collision.y > collision.h / 4) {
continue;
}
if (collision._static) {
layout = this._moveElementAwayFromCollision(layout, collision, l, isUserAction);
} else {
layout = this._moveElementAwayFromCollision(layout, l, collision, isUserAction);
}
}
return layout;
function getAllCollisions(layout, layoutItem) {
return BI.filter(layout, function (i, l) {
return self._collides(l, layoutItem);
});
}
},
_sortLayoutItemsByRowCol: function (layout) {
return [].concat(layout).sort(function (a, b) {
if (a.y > b.y || (a.y === b.y && a.x > b.x)) {
return 1;
}
return -1;
});
},
_collides: function (l1, l2) {
if (l1 === l2) {
return false;
} // same element
if (l1.x + l1.w <= l2.x) {
return false;
} // l1 is left of l2
if (l1.x >= l2.x + l2.w) {
return false;
} // l1 is right of l2
if (l1.y + l1.h <= l2.y) {
return false;
} // l1 is above l2
if (l1.y >= l2.y + l2.h) {
return false;
} // l1 is below l2
return true; // boxes overlap
},
_getFirstCollision: function (layout, layoutItem) {
for (var i = 0, len = layout.length; i < len; i++) {
if (this._collides(layout[i], layoutItem)) {
return layout[i];
}
}
},
_moveElementAwayFromCollision: function (layout, collidesWith,
itemToMove, isUserAction) {
if (isUserAction) {
var fakeItem = {
x: itemToMove.x,
y: itemToMove.y,
w: itemToMove.w,
h: itemToMove.h,
i: '-1'
};
fakeItem.y = Math.max(collidesWith.y - itemToMove.h, 0);
if (!this._getFirstCollision(layout, fakeItem)) {
return this._moveElement(layout, itemToMove, undefined, fakeItem.y);
}
}
return this._moveElement(layout, itemToMove, undefined, itemToMove.y + 1);
},
_compactItem: function (compareWith, l, verticalCompact) {
if (verticalCompact) {
while (l.y > 0 && !this._getFirstCollision(compareWith, l)) {
l.y--;
}
}
var collides;
while ((collides = this._getFirstCollision(compareWith, l))) {
l.y = collides.y + collides.h;
}
return l;
},
compact: function (layout, verticalCompact) {
var compareWith = getStatics(layout);
var sorted = this._sortLayoutItemsByRowCol(layout);
var out = [];
for (var i = 0, len = sorted.length; i < len; i++) {
var l = sorted[i];
if (!l._static) {
l = this._compactItem(compareWith, l, verticalCompact);
compareWith.push(l);
}
out[layout.indexOf(l)] = l;
l.moved = false;
}
return out;
function getStatics(layout) {
return BI.filter(layout, function (i, l) {
return l._static;
});
}
},
////公有方法////
getRegionByName: function (name) {
var obj = {};
obj[name] = this.regions[name];
return this._cloneRegion(obj)[name];
},
getAllRegions: function () {
return BI.toArray(this._cloneRegion());
},
getHelper: function () {
var helper = BI.createWidget({
type: "bi.layout",
width: 18,
height: 18,
cls: "arrangement-helper bi-border"
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [helper]
});
return helper;
},
_start: function (cur) {
this.arrangement.setVisible(true);
this.droppable.setVisible(true);
if (this.options.layoutType === BI.Arrangement.LAYOUT_TYPE.GRID) {
this.block.setVisible(true);
}
BI.each(this.drops, function (i, drop) {
drop.el.setVisible(false);
});
if (cur) {
if (this.drops[cur]) {
this.drops[cur].el.setVisible(true);
}
}
},
_stop: function () {
this.arrangement.setVisible(false);
this.droppable.setVisible(false);
this.block.setVisible(false);
},
getDirectRelativeRegions: function (name, direction) {
direction || (direction = ["top", "bottom", "left", "right"]);
var self = this, result = {};
BI.each(direction, function (i, dir) {
result[dir] = self._getDirectRelativeRegions(name, [dir]);
});
return result;
},
////公有操作////
setLayoutType: function (type) {
var self = this, o = this.options;
if (type !== o.layoutType) {
o.layoutType = type;
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
this.relayout();
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
this.relayout();
break;
}
}
},
getLayoutType: function () {
return this.options.layoutType;
},
getLayoutRatio: function () {
var occupied = this._getRegionOccupied();
var width = this.getClientWidth(), height = this.getClientHeight();
return {
x: BI.parseFloat(BI.contentFormat((occupied.left + occupied.width) / width, "#.##;-#.##")),
y: BI.parseFloat(BI.contentFormat((occupied.top + occupied.height) / height, "#.##;-#.##"))
}
},
addRegion: function (region, position) {
if (position) {
this.setPosition(position, region);
}
var self = this, o = this.options;
if (!this.position) {
return false;
}
var test = this._cloneRegion();
BI.each(this.position.regions, function (i, region) {
test[region.id].left = region.left;
test[region.id].top = region.top;
test[region.id].width = region.width;
test[region.id].height = region.height;
});
var item = BI.extend({}, region, {
left: this.position.insert.left,
top: this.position.insert.top,
width: this.position.insert.width,
height: this.position.insert.height
});
var added = this._createOneRegion(item);
test[added.id] = added;
if (this._test(test)) {
delete test[added.id];
this._modifyRegion(test);
this._addRegion(item);
this._populate(this.getAllRegions());
return true;
}
return false;
},
deleteRegion: function (name) {
if (!this.regions[name]) {
return false;
}
var self = this, o = this.options;
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
var clone = this._cloneRegion();
var regions = this._getEquivalentRelativeRegions(name);
if (regions.length > 0) {
BI.each(regions, function (i, region) {
BI.extend(clone[region.id], region);
});
this._modifyRegion(clone);
}
this._deleteRegionByName(name);
this._populate(this.getAllRegions());
return true;
case BI.Arrangement.LAYOUT_TYPE.FREE:
this._deleteRegionByName(name);
this._populate(this.getAllRegions());
return true;
case BI.Arrangement.LAYOUT_TYPE.GRID:
this._deleteRegionByName(name);
this._populate(this.getAllRegions());
this.resize();
return true;
}
return false;
},
setRegionSize: function (name, size) {
var self = this, o = this.options;
var flag = false;
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
var current = this.regions[name];
if (size.width !== current.width) {
var regions = this._getInDirectRelativeRegions(name, ["right"]).right;
var lefts = regions.left || [], rights = regions.right || [];
var offset = size.width - current.width;
var cloned = this._cloneRegion();
BI.some(lefts, function (i, left) {
var region = cloned[left.id];
region.width = region.width + offset;
});
BI.some(rights, function (i, right) {
var region = cloned[right.id];
region.width = region.width - offset;
region.left = region.left + offset;
});
if (this._test(cloned) && this._isArrangeFine(cloned)) {
this._modifyRegion(cloned);
flag = true;
}
}
if (size.height !== current.height) {
var regions = this._getInDirectRelativeRegions(name, ["bottom"]).bottom;
var tops = regions.top || [], bottoms = regions.bottom || [];
var offset = size.height - current.height;
var cloned = this._cloneRegion();
BI.some(tops, function (i, top) {
var region = cloned[top.id];
region.height = region.height + offset;
});
BI.some(bottoms, function (i, bottom) {
var region = cloned[bottom.id];
region.height = region.height - offset;
region.top = region.top + offset;
});
if (this._test(cloned) && this._isArrangeFine(cloned)) {
this._modifyRegion(cloned);
flag = true;
}
}
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
var clone = this._cloneRegion();
BI.extend(clone[name], {
width: size.width,
height: size.height
});
if (this._test(clone)) {
this._modifyRegion(clone);
flag = true;
}
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
var clone = this._cloneRegion();
BI.extend(clone[name], {
width: size.width,
height: size.height
});
if (this._test(clone)) {
var layout = this._getLayoutsByRegions(clone);
layout = this.compact(layout, true);
var regions = this._getRegionsByLayout(layout);
this._modifyRegion(regions);
flag = true;
}
break;
}
this._locationRegion();
this._applyRegion();
return flag;
},
setPosition: function (position, size) {
var self = this, o = this.options;
var insert, regions = [], cur;
if (position.left < 0 || position.top < 0) {
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
this.resize();
break;
}
this._stop();
this.position = null;
return null;
}
var offset = this._getScrollOffset();
position = {
left: position.left + offset.left,
top: position.top + offset.top
};
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
if (BI.isEmpty(this.regions)) {
if (self._isPositionInBounds(position, {
left: 0,
top: 0,
width: this.element[0].clientWidth,
height: this.element[0].clientHeight
})) {
insert = {
left: 0,
top: 0,
width: this.element[0].clientWidth,
height: this.element[0].clientHeight
};
}
} else {
if (BI.some(this.regions, function (id, region) {
if (self._isPositionInBounds(position, region)) {
var at = self._positionAt(position, region);
if (!at) {
insert = null;
} else {
insert = at.insert;
regions = at.regions;
}
cur = id;
return true;
}
})) {
}
else {
insert = null;
regions = [];
}
}
if (insert == null) {
this._stop();
self.position = null;
break;
}
this.position = {
insert: insert,
regions: regions
};
this._setArrangeSize(insert);
this._start(cur);
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
var insert = {
top: position.top < 0 ? 0 : position.top,
left: position.left < 0 ? 0 : position.left,
width: size.width,
height: size.height
};
this.position = {
insert: insert
};
this._setArrangeSize(insert);
this._start();
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
var p = {
top: position.top < 0 ? 0 : position.top,
left: position.left < 0 ? 0 : position.left,
width: size.width,
height: size.height
};
this._setArrangeSize(p);
var cur = this._getGridPositionAndSize(p);
var layout = [{
x: 0, y: BI.MAX, w: cur.w, h: cur.h, i: cur.i
}].concat(this._getLayoutsByRegions());
layout = this._moveElement(layout, layout[0], cur.x, cur.y, true);
layout = this.compact(layout, true);
var regions = this._setRegionsByLayout(this._cloneRegion(), layout);
var insert = this._getBlockPositionAndSize(layout[0]);
this.position = {
insert: insert,
regions: regions
};
this._applyRegion(regions);
this._setBlockPositionAndSize(insert);
this._start();
break;
}
return this.position;
},
setRegionPosition: function (name, position) {
var self = this, o = this.options;
var offset = this._getScrollOffset();
position = BI.extend(position, {
left: position.left + offset.left,
top: position.top + offset.top
});
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
BI.extend(this.regions[name], {
left: position.left < 0 ? 0 : position.left,
top: position.top < 0 ? 0 : position.top
});
this._applyRegion();
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
if (!position.stop) {
BI.extend(this.regions[name], {
left: position.left < 0 ? 0 : position.left,
top: position.top < 0 ? 0 : position.top
});
var cloned = this._cloneRegion();
var cur = this._getGridPositionAndSize(BI.extend(cloned[name], {
left: position.left < 0 ? 0 : position.left,
top: position.top < 0 ? 0 : position.top
}));
var x = cur.x, y = cur.y;
cur = BI.extend(cur, {
x: 0, y: BI.MAX, i: -1
});
delete cloned[name];
var layout = this._getLayoutsByRegions(cloned);
layout = this._moveElement([cur].concat(layout), cur, x, y, true);
layout = this.compact(layout, true);
var regions = this._getRegionsByLayout(layout);
this._modifyRegion(regions);
this._applyRegion();
this._setBlockPositionAndSize(this._getBlockPositionAndSize(cur));
this.block.setVisible(true);
} else {
BI.extend(this.regions[name], {
left: position.left < 0 ? 0 : position.left,
top: position.top < 0 ? 0 : position.top
});
var cloned = this._cloneRegion();
var layout = this._getLayoutsByRegions(cloned);
layout = this.compact(layout, true);
var regions = this._getRegionsByLayout(layout);
this._modifyRegion(regions);
this._applyRegion();
this.block.setVisible(false);
}
break;
}
},
setContainerSize: function (size) {
var self = this, o = this.options;
var occupied = this._getRegionOccupied();
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
if (this._isArrangeFine()) {
var width = size.width, height = size.height;
var regions = this._cloneRegion();
BI.each(regions, function (i, region) {
region.width = region.width / occupied.width * width;
//region.height = region.height / occupied.height * height;
});
BI.each(regions, function (id, region) {
var lefts = self.locations[id].left;
var tops = self.locations[id].top;
var bottoms = self.locations[id].bottom;
var maxRegion;
if (lefts.length > 0) {
var ids = self._getRegionNames(lefts);
var rs = self._getRegionsByNames(ids);
maxRegion = self._getRegionOccupied(rs);
region.left = maxRegion.left + maxRegion.width / occupied.width * width;
} else {
region.left = 0;
}
if (bottoms.length === 0) {
region.height = height - region.top;
}
//if (tops.length > 0) {
// var ids = self._getRegionNames(tops);
// var rs = self._getRegionsByNames(ids);
// maxRegion = self._getRegionOccupied(rs);
// region.top = maxRegion.top + maxRegion.height / occupied.height * height;
//}
//if (tops.length === 0) {
// region.top = 0;
//}
});
if (this._test(regions)) {
this._modifyRegion(regions);
this._applyRegion();
}
}
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
break;
}
this.resize();
},
scrollTo: function (scroll) {
this.scrollContainer.element.scrollTop(scroll.top);
this.scrollContainer.element.scrollLeft(scroll.left);
},
zoom: function (ratio) {
var self = this, o = this.options;
if (!ratio) {
return;
}
var occupied = this._applyContainer();
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
case BI.Arrangement.LAYOUT_TYPE.FREE:
if (this._isArrangeFine()) {
var width = this.getClientWidth();
var xRatio = (ratio.x || 1) * width / (occupied.left + occupied.width);
//var yRatio = ratio.y * height / (occupied.top + occupied.height);
var regions = this._cloneRegion();
BI.each(regions, function (i, region) {
region.left = region.left * xRatio;
//region.top = region.top * yRatio;
region.width = region.width * xRatio;
//region.height = region.height * yRatio;
});
if (this._test(regions)) {
this._modifyRegion(regions);
this._applyRegion();
}
this.resize();
// } else {
this.relayout();
}
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
if (this._isArrangeFine()) {
var width = this.getClientWidth();
var xRatio = (ratio.x || 1) * width / (occupied.left + occupied.width);
var regions = this._cloneRegion();
BI.each(regions, function (i, region) {
region.left = region.left * xRatio;
region.width = region.width * xRatio;
});
if (this._test(regions)) {
var layout = this._getLayoutsByRegions(regions);
layout = this.compact(layout, true);
regions = this._getRegionsByLayout(layout);
this._modifyRegion(regions);
this._applyRegion();
}
} else {
this.relayout();
}
break;
}
},
resize: function () {
var self = this, o = this.options;
var occupied = this._applyContainer();
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
if (this._isArrangeFine()) {
var width = this.getClientWidth(), height = this.getClientHeight();
var isHeightAdjust = height > occupied.height;
var regions = this._cloneRegion();
BI.each(regions, function (i, region) {
region.width = region.width / occupied.width * width;
//if (isHeightAdjust) {
// region.height = region.height / occupied.height * height;
//}
});
BI.each(regions, function (id, region) {
var lefts = self.locations[id].left;
var tops = self.locations[id].top;
var bottoms = self.locations[id].bottom;
var maxRegion;
if (lefts.length > 0) {
var ids = self._getRegionNames(lefts);
var rs = self._getRegionsByNames(ids);
maxRegion = self._getRegionOccupied(rs);
region.left = maxRegion.left + maxRegion.width / occupied.width * width;
} else {
region.left = 0;
}
if (tops.length === 0) {
region.top = 0;
}
if (isHeightAdjust && bottoms.length === 0) {
region.height = height - region.top;
}
//if (isHeightAdjust && tops.length > 0) {
// var ids = self._getRegionNames(tops);
// var rs = self._getRegionsByNames(ids);
// maxRegion = self._getRegionOccupied(rs);
// region.top = maxRegion.top + maxRegion.height / occupied.height * height;
//}
});
if (this._test(regions)) {
this._modifyRegion(regions);
this._applyRegion();
}
} else {
this.relayout();
}
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
this.zoom(this.ratio);
var regions = this._cloneRegion();
var layout = this._getLayoutsByRegions(regions);
layout = this.compact(layout, true);
regions = this._getRegionsByLayout(layout);
this._modifyRegion(regions);
this._applyRegion();
break;
}
},
relayout: function () {
var self = this, o = this.options;
if (o.isNeedReLayout === false) {
return;
}
//var occupied = this._applyContainer();
switch (o.layoutType) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
if (!this._isArrangeFine()) {
var width = this.getClientWidth(), height = this.getClientHeight();
var clone = BI.toArray(this._cloneRegion());
clone.sort(function (r1, r2) {
if (self._isEqual(r1.top, r2.top)) {
return r1.left - r2.left;
}
return r1.top - r2.top;
});
var count = clone.length;
var cols = 3, rows = Math.floor((count - 1) / 3 + 1);
var w = width / cols, h = height / rows;
var store = {};
BI.each(clone, function (i, region) {
var row = Math.floor(i / 3), col = i % 3;
BI.extend(region, {
top: row * 380,
left: col * w,
width: w,
height: 380
});
if (!store[row]) {
store[row] = {};
}
store[row][col] = region;
});
//非3的倍数
if (count % 3 !== 0) {
var lasts = store[rows - 1];
var perWidth = width / (count % 3);
BI.each(lasts, function (i, region) {
BI.extend(region, {
left: BI.parseInt(i) * perWidth,
width: perWidth
});
});
}
if (this._test(clone)) {
this._populate(clone);
this.resize();
}
} else {
this.resize();
}
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
var width = this.getClientWidth(), height = this.getClientHeight();
var regions = this._cloneRegion();
var clone = BI.toArray(regions);
clone.sort(function (r1, r2) {
if (self._isEqual(r1.top, r2.top)) {
return r1.left - r2.left;
}
return r1.top - r2.top;
});
var count = clone.length;
var cols = 3, rows = Math.floor((count - 1) / 3 + 1);
var w = width / cols, h = height / rows;
var store = {};
BI.each(clone, function (i, region) {
var row = Math.floor(i / 3), col = i % 3;
BI.extend(region, {
top: row * 380,
left: col * w,
width: w,
height: 380
});
if (!store[row]) {
store[row] = {};
}
store[row][col] = region;
});
//非3的倍数
if (count % 3 !== 0) {
var lasts = store[rows - 1];
var perWidth = width / (count % 3);
BI.each(lasts, function (i, region) {
BI.extend(region, {
left: BI.parseInt(i) * perWidth,
width: perWidth
});
});
}
if (this._test(clone)) {
var layout = this._getLayoutsByRegions(regions);
layout = this.compact(layout, true);
regions = this._getRegionsByLayout(layout);
this._modifyRegion(regions);
this._populate(clone);
}
break;
}
},
_populate: function (items) {
this._stop();
this._calculateRegions(items);
this._locationRegion();
this._applyRegion();
},
populate: function (items) {
var self = this;
BI.each(this.regions, function (name, region) {
self.regions[name].el.setVisible(false);
self.drops[name].el.setVisible(false);
delete self.regions[name];
delete self.drops[name];
});
this._populate(items);
this._renderRegion();
}
});
BI.Arrangement.EVENT_SCROLL = "EVENT_SCROLL";
BI.extend(BI.Arrangement, {
PORTION: 24,
GRID_HEIGHT: 60,
LAYOUT_TYPE: {
ADAPTIVE: 0,
FREE: 1,
GRID: 2
}
});
BI.shortcut('bi.arrangement', BI.Arrangement);/**
* 表关联树
*
* Created by GUY on 2015/12/15.
* @class BI.BranchRelation
* @extends BI.Widget
*/
BI.BranchRelation = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.BranchRelation.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-branch-relation-tree",
items: [],
centerOffset: 0,//重心偏移量
direction: BI.Direction.Bottom,
align: BI.VerticalAlign.Top
})
},
_init: function () {
BI.BranchRelation.superclass._init.apply(this, arguments);
this.populate(this.options.items);
},
//树分层
_stratification: function () {
var levels = [];
this.tree.recursion(function (node, route) {
//node.isRoot = route.length <= 1;
node.leaf = node.isLeaf();
if (!levels[route.length - 1]) {
levels[route.length - 1] = [];
}
levels[route.length - 1].push(node);
});
return levels;
},
//计算所有节点的叶子结点个数
_calculateLeaves: function () {
var count = 0;
function track(node) {
var c = 0;
if (node.isLeaf()) {
return 1;
}
BI.each(node.getChildren(), function (i, child) {
c += track(child);
});
node.set("leaves", c);
return c;
}
count = track(this.tree.getRoot());
return count;
},
//树平移
_translate: function (levels) {
var adjust = [];
var maxLevel = levels.length;
BI.each(levels, function (i, nodes) {
if (!adjust[i]) {
adjust[i] = [];
}
BI.each(nodes, function (j, node) {
if (node.isLeaf() && i < maxLevel - 1) {
var newNode = new BI.Node(BI.UUID());
//newNode.isEmptyRoot = node.isRoot || node.isEmptyRoot;
newNode.isNew = true;
//把node向下一层移
var tar = 0;
if (j > 0) {
var c = nodes[j - 1].getLastChild();
tar = levels[i + 1].indexOf(c) + 1;
}
levels[i + 1].splice(tar, 0, node);
//新增一个临时树节点
var index = node.parent.getChildIndex(node.id);
node.parent.removeChildByIndex(index);
node.parent.addChild(newNode, index);
newNode.addChild(node);
adjust[i].push(newNode);
nodes[j] = newNode;
} else {
adjust[i].push(node);
}
})
});
return adjust;
},
//树补白
_fill: function (levels) {
var adjust = [];
var maxLevel = levels.length;
BI.each(levels, function (i, nodes) {
if (!adjust[i]) {
adjust[i] = [];
}
BI.each(nodes, function (j, node) {
if (node.isLeaf() && i < maxLevel - 1) {
var newNode = new BI.Node(BI.UUID());
newNode.leaf = true;
newNode.width = node.width;
newNode.height = node.height;
newNode.isNew = true;
//把node向下一层移
var tar = 0;
if (j > 0) {
var c = nodes[j - 1].getLastChild();
tar = levels[i + 1].indexOf(c) + 1;
}
levels[i + 1].splice(tar, 0, newNode);
//新增一个临时树节点
node.addChild(newNode);
}
adjust[i].push(node);
})
});
return adjust;
},
//树调整
_adjust: function (adjust) {
while (true) {
var isAllNeedAjust = false;
BI.backEach(adjust, function (i, nodes) {
BI.each(nodes, function (j, node) {
if (!node.isNew) {
var needAdjust = true;
BI.any(node.getChildren(), function (k, n) {
if (!n.isNew) {
needAdjust = false;
return true;
}
});
if (!node.isLeaf() && needAdjust === true) {
var allChilds = [];
BI.each(node.getChildren(), function (k, n) {
allChilds = allChilds.concat(n.getChildren());
});
node.removeAllChilds();
BI.each(allChilds, function (k, c) {
node.addChild(c);
});
var newNode = new BI.Node(BI.UUID());
//newNode.isEmptyRoot = node.isRoot || node.isEmptyRoot;
newNode.isNew = true;
var index = node.parent.getChildIndex(node.id);
node.parent.removeChildByIndex(index);
node.parent.addChild(newNode, index);
newNode.addChild(node);
isAllNeedAjust = true;
}
}
})
});
if (isAllNeedAjust === false) {
break;
} else {//树重构
adjust = this._stratification();
}
}
return adjust;
},
_calculateWidth: function () {
var o = this.options;
var width = 0;
function track1(node) {
var w = 0;
if (node.isLeaf()) {
return node.width;
}
BI.each(node.getChildren(), function (i, child) {
w += track1(child);
});
return w;
}
function track2(node) {
var w = 0;
if (node.isLeaf()) {
return node.height;
}
BI.each(node.getChildren(), function (i, child) {
w += track2(child);
});
return w;
}
if (this._isVertical()) {
width = track1(this.tree.getRoot());
} else {
width = track2(this.tree.getRoot());
}
return width;
},
_isVertical: function () {
var o = this.options;
return o.direction === BI.Direction.Top || o.direction === BI.Direction.Bottom;
},
_calculateHeight: function () {
var o = this.options;
var height = 0;
function track1(node) {
var h = 0;
BI.each(node.getChildren(), function (i, child) {
h = Math.max(h, track1(child));
});
return h + (node.height || 0);
}
function track2(node) {
var h = 0;
BI.each(node.getChildren(), function (i, child) {
h = Math.max(h, track2(child));
});
return h + (node.width || 0);
}
if (this._isVertical()) {
height = track1(this.tree.getRoot());
} else {
height = track2(this.tree.getRoot());
}
return height;
},
_calculateXY: function (levels) {
var o = this.options;
var width = this._calculateWidth();
var height = this._calculateHeight();
var levelCount = levels.length;
var allLeavesCount = this._calculateLeaves();
//计算坐标
var xy = {};
var levelHeight = height / levelCount;
BI.each(levels, function (i, nodes) {
//计算权重
var weights = [];
BI.each(nodes, function (j, node) {
weights[j] = (node.get("leaves") || 1) / allLeavesCount;
});
BI.each(nodes, function (j, node) {
//求前j个元素的权重
var weight = BI.sum(weights.slice(0, j));
//求坐标
var x = weight * width + weights[j] * width / 2;
var y = i * levelHeight + levelHeight / 2;
xy[node.id] = {x: x, y: y};
})
});
return xy;
},
_stroke: function (levels, xy) {
var height = this._calculateHeight();
var levelCount = levels.length;
var levelHeight = height / levelCount;
var self = this, o = this.options;
switch (o.direction) {
case BI.Direction.Top:
BI.each(levels, function (i, nodes) {
BI.each(nodes, function (j, node) {
if (node.getChildrenLength() > 0 && !node.leaf) {
var path = "";
var start = xy[node.id];
var split = start.y + levelHeight / 2;
path += "M" + start.x + "," + (start.y + o.centerOffset) + "L" + start.x + "," + split;
var end = [];
BI.each(node.getChildren(), function (t, c) {
var e = end[t] = xy[c.id];
path += "M" + e.x + "," + (e.y + o.centerOffset) + "L" + e.x + "," + split;
});
if (end.length > 0) {
path += "M" + BI.first(end).x + "," + split + "L" + BI.last(end).x + "," + split;
}
self.svg.path(path).attr("stroke", "#d4dadd");
}
})
});
break;
case BI.Direction.Bottom:
BI.each(levels, function (i, nodes) {
BI.each(nodes, function (j, node) {
if (node.getChildrenLength() > 0 && !node.leaf) {
var path = "";
var start = xy[node.id];
var split = start.y - levelHeight / 2;
path += "M" + start.x + "," + (start.y - o.centerOffset) + "L" + start.x + "," + split;
var end = [];
BI.each(node.getChildren(), function (t, c) {
var e = end[t] = xy[c.id];
path += "M" + e.x + "," + (e.y - o.centerOffset) + "L" + e.x + "," + split;
});
if (end.length > 0) {
path += "M" + BI.first(end).x + "," + split + "L" + BI.last(end).x + "," + split;
}
self.svg.path(path).attr("stroke", "#d4dadd");
}
})
});
break;
case BI.Direction.Left:
BI.each(levels, function (i, nodes) {
BI.each(nodes, function (j, node) {
if (node.getChildrenLength() > 0 && !node.leaf) {
var path = "";
var start = xy[node.id];
var split = start.y + levelHeight / 2;
path += "M" + (start.y + o.centerOffset) + "," + start.x + "L" + split + "," + start.x;
var end = [];
BI.each(node.getChildren(), function (t, c) {
var e = end[t] = xy[c.id];
path += "M" + (e.y + o.centerOffset) + "," + e.x + "L" + split + "," + e.x;
});
if (end.length > 0) {
path += "M" + split + "," + BI.first(end).x + "L" + split + "," + BI.last(end).x;
}
self.svg.path(path).attr("stroke", "#d4dadd");
}
})
});
break;
case BI.Direction.Right:
BI.each(levels, function (i, nodes) {
BI.each(nodes, function (j, node) {
if (node.getChildrenLength() > 0 && !node.leaf) {
var path = "";
var start = xy[node.id];
var split = start.y - levelHeight / 2;
path += "M" + (start.y - o.centerOffset) + "," + start.x + "L" + split + "," + start.x;
var end = [];
BI.each(node.getChildren(), function (t, c) {
var e = end[t] = xy[c.id];
path += "M" + (e.y - o.centerOffset) + "," + e.x + "L" + split + "," + e.x;
});
if (end.length > 0) {
path += "M" + split + "," + BI.first(end).x + "L" + split + "," + BI.last(end).x;
}
self.svg.path(path).attr("stroke", "#d4dadd");
}
})
});
break;
}
},
_createBranches: function (levels) {
var self = this, o = this.options;
if (o.direction === BI.Direction.Bottom || o.direction === BI.Direction.Right) {
levels = levels.reverse();
}
var xy = this._calculateXY(levels);
//画图
this._stroke(levels, xy);
},
_isNeedAdjust: function () {
var o = this.options;
return o.direction === BI.Direction.Top && o.align === BI.VerticalAlign.Bottom || o.direction === BI.Direction.Bottom && o.align === BI.VerticalAlign.Top
|| o.direction === BI.Direction.Left && o.align === BI.HorizontalAlign.Right || o.direction === BI.Direction.Right && o.align === BI.HorizontalAlign.Left
},
setValue: function (value) {
},
getValue: function () {
},
_transformToTreeFormat: function (sNodes) {
var i, l;
if (!sNodes) {
return [];
}
if (BI.isArray(sNodes)) {
var r = [];
var tmpMap = [];
for (i = 0, l = sNodes.length; i < l; i++) {
tmpMap[sNodes[i].id] = sNodes[i];
}
for (i = 0, l = sNodes.length; i < l; i++) {
if (tmpMap[sNodes[i].pId] && sNodes[i].id != sNodes[i].pId) {
if (!tmpMap[sNodes[i].pId].children) {
tmpMap[sNodes[i].pId].children = [];
}
tmpMap[sNodes[i].pId].children.push(sNodes[i]);
} else {
r.push(sNodes[i]);
}
}
return r;
} else {
return [sNodes];
}
},
populate: function (items) {
var self = this, o = this.options;
o.items = items || [];
this.empty();
items = this._transformToTreeFormat(o.items);
this.tree = new BI.Tree();
this.tree.initTree(items);
this.svg = BI.createWidget({
type: "bi.svg"
});
//树分层
var levels = this._stratification();
if (this._isNeedAdjust()) {
//树平移
var adjust = this._translate(levels);
//树调整
adjust = this._adjust(adjust);
this._createBranches(adjust);
} else {
var adjust = this._fill(levels);
this._createBranches(adjust);
}
var container = BI.createWidget({
type: "bi.layout",
width: this._isVertical() ? this._calculateWidth() : this._calculateHeight(),
height: this._isVertical() ? this._calculateHeight() : this._calculateWidth()
});
BI.createWidget({
type: "bi.absolute",
element: container,
items: [{
el: this.svg,
top: 0,
left: 0,
right: 0,
bottom: 0
}]
});
if (this._isVertical()) {
items = [{
type: "bi.handstand_branch_tree",
expander: {
direction: o.direction
},
el: {
layouts: [{
type: "bi.horizontal_adapt",
verticalAlign: o.align
}]
},
items: items
}]
} else {
items = [{
type: "bi.branch_tree",
expander: {
direction: o.direction
},
el: {
layouts: [{
type: "bi.vertical"
}, {
type: o.align === BI.HorizontalAlign.Left ? "bi.left" : "bi.right"
}]
},
items: items
}]
}
BI.createWidget({
type: "bi.adaptive",
element: container,
items: items
});
BI.createWidget({
type: "bi.center_adapt",
scrollable: true,
element: this,
items: [container]
});
}
});
BI.BranchRelation.EVENT_CHANGE = "BranchRelation.EVENT_CHANGE";
BI.shortcut("bi.branch_relation", BI.BranchRelation);/**
* 日期控件中的月份下拉框
*
* Created by GUY on 2015/9/7.
* @class BI.MonthDateCombo
* @extends BI.Trigger
*/
BI.MonthDateCombo = BI.inherit(BI.Trigger, {
_defaultConfig: function() {
return BI.extend( BI.MonthDateCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-month-combo",
height: 25
});
},
_init: function() {
BI.MonthDateCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget({
type: "bi.date_triangle_trigger"
});
this.popup = BI.createWidget({
type: "bi.month_popup"
});
this.popup.on(BI.YearPopup.EVENT_CHANGE, function(){
self.setValue(self.popup.getValue());
})
this.combo = BI.createWidget({
type: "bi.combo",
offsetStyle: "center",
element: this,
isNeedAdjustHeight: false,
isNeedAdjustWidth: false,
el: this.trigger,
popup: {
minWidth: 85,
stopPropagation: false,
el: this.popup
}
})
this.combo.on(BI.Combo.EVENT_CHANGE, function(){
self.combo.hideView();
self.fireEvent(BI.MonthDateCombo.EVENT_CHANGE);
});
},
setValue: function(v){
this.trigger.setValue(v + 1);
this.popup.setValue(v);
},
getValue: function(){
return this.popup.getValue();
}
});
BI.MonthDateCombo.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut('bi.month_date_combo', BI.MonthDateCombo);/**
* 年份下拉框
*
* Created by GUY on 2015/9/7.
* @class BI.YearDateCombo
* @extends BI.Trigger
*/
BI.YearDateCombo = BI.inherit(BI.Trigger, {
_defaultConfig: function() {
return BI.extend( BI.YearDateCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-year-combo",
min: '1900-01-01', //最小日期
max: '2099-12-31', //最大日期
height: 25
});
},
_init: function() {
BI.YearDateCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget({
type: "bi.date_triangle_trigger"
});
this.popup = BI.createWidget({
type: "bi.year_popup",
min: o.min,
max: o.max
});
this.popup.on(BI.YearPopup.EVENT_CHANGE, function(){
self.setValue(self.popup.getValue());
self.combo.hideView();
self.fireEvent(BI.YearDateCombo.EVENT_CHANGE);
})
this.combo = BI.createWidget({
type: "bi.combo",
offsetStyle: "center",
element: this,
isNeedAdjustHeight: false,
isNeedAdjustWidth: false,
el: this.trigger,
popup: {
minWidth: 85,
stopPropagation: false,
el: this.popup
}
})
this.combo.on(BI.Combo.EVENT_CHANGE, function(){
self.fireEvent(BI.YearDateCombo.EVENT_CHANGE);
})
},
setValue: function(v){
this.trigger.setValue(v);
this.popup.setValue(v);
},
getValue: function(){
return this.popup.getValue();
}
});
BI.YearDateCombo.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut('bi.year_date_combo', BI.YearDateCombo);/**
* Created by GUY on 2015/9/7.
* @class BI.DatePicker
* @extends BI.Widget
*/
BI.DatePicker = BI.inherit(BI.Widget, {
_defaultConfig: function () {
var conf = BI.DatePicker.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: "bi-date-picker bi-background",
height: 25,
min: '1900-01-01', //最小日期
max: '2099-12-31' //最大日期
})
},
_init: function () {
BI.DatePicker.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this._year = new Date().getFullYear();
this._month = new Date().getMonth();
this.left = BI.createWidget({
type: "bi.icon_button",
cls: "pre-page-h-font",
width: 25,
height: 25
});
this.left.on(BI.IconButton.EVENT_CHANGE, function () {
if (self._month === 0) {
self.setValue({
year: self.year.getValue() - 1,
month: 11
})
} else {
self.setValue({
year: self.year.getValue(),
month: self.month.getValue() - 1
})
}
self.fireEvent(BI.DatePicker.EVENT_CHANGE);
});
this.right = BI.createWidget({
type: "bi.icon_button",
cls: "next-page-h-font",
width: 25,
height: 25
});
this.right.on(BI.IconButton.EVENT_CHANGE, function () {
if (self._month === 11) {
self.setValue({
year: self.year.getValue() + 1,
month: 0
})
} else {
self.setValue({
year: self.year.getValue(),
month: self.month.getValue() + 1
})
}
self.fireEvent(BI.DatePicker.EVENT_CHANGE);
});
this.year = BI.createWidget({
type: "bi.year_date_combo",
min: o.min,
max: o.max
});
this.year.on(BI.YearDateCombo.EVENT_CHANGE, function () {
self.setValue({
year: self.year.getValue(),
month: self.month.getValue()
});
self.fireEvent(BI.DatePicker.EVENT_CHANGE);
})
this.month = BI.createWidget({
type: "bi.month_date_combo"
});
this.month.on(BI.MonthDateCombo.EVENT_CHANGE, function () {
self.setValue({
year: self.year.getValue(),
month: self.month.getValue()
});
self.fireEvent(BI.DatePicker.EVENT_CHANGE);
});
BI.createWidget({
type: "bi.htape",
element: this,
items: [{
el: this.left,
width: 25
}, {
type: "bi.center_adapt",
items: [{
type: "bi.horizontal",
width: 100,
items: [this.year, this.month]
}]
}, {
el: this.right,
width: 25
}]
})
this.setValue({
year: this._year,
month: this._month
})
},
setValue: function (ob) {
this._year = ob.year;
this._month = ob.month;
this.year.setValue(ob.year);
this.month.setValue(ob.month);
},
getValue: function () {
return {
year: this.year.getValue(),
month: this.month.getValue()
}
}
});
BI.DatePicker.EVENT_CHANGE = "EVENT_CHANGE"
BI.shortcut("bi.date_picker", BI.DatePicker);/**
* Created by GUY on 2015/9/7.
* @class BI.DateCalendarPopup
* @extends BI.Widget
*/
BI.DateCalendarPopup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
var conf = BI.DateCalendarPopup.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: "bi-date-calendar-popup",
min: '1900-01-01', //最小日期
max: '2099-12-31', //最大日期
selectedTime: null
})
},
_createNav: function (v) {
var date = BI.Calendar.getDateJSONByPage(v);
var calendar = BI.createWidget({
type: "bi.calendar",
logic: {
dynamic: true
},
min: this.options.min,
max: this.options.max,
year: date.year,
month: date.month,
day: this.selectedTime.day
});
return calendar;
},
_init: function () {
BI.DateCalendarPopup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.today = new Date();
this._year = this.today.getFullYear();
this._month = this.today.getMonth();
this._day = this.today.getDate();
this.selectedTime = o.selectedTime || {
year: this._year,
month: this._month,
day: this._day
};
this.datePicker = BI.createWidget({
type: "bi.date_picker",
min: o.min,
max: o.max
});
this.calendar = BI.createWidget({
direction: "top",
element: this,
logic: {
dynamic: true
},
type: "bi.navigation",
tab: this.datePicker,
cardCreator: BI.bind(this._createNav, this),
afterCardCreated: function () {
},
afterCardShow: function () {
this.setValue(self.selectedTime);
}
});
this.datePicker.on(BI.DatePicker.EVENT_CHANGE, function () {
self.selectedTime = self.datePicker.getValue();
self.selectedTime.day = 1;
self.calendar.setSelect(BI.Calendar.getPageByDateJSON(self.selectedTime));
});
this.calendar.on(BI.Navigation.EVENT_CHANGE, function () {
self.selectedTime = self.calendar.getValue();
self.setValue(self.selectedTime);
self.fireEvent(BI.DateCalendarPopup.EVENT_CHANGE);
});
},
setValue: function (timeOb) {
this.datePicker.setValue(timeOb);
this.calendar.setSelect(BI.Calendar.getPageByDateJSON(timeOb));
this.calendar.setValue(timeOb);
this.selectedTime = timeOb;
},
getValue: function () {
return this.selectedTime;
}
});
BI.DateCalendarPopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.date_calendar_popup", BI.DateCalendarPopup);/**
* 日期控件中的年份或月份trigger
*
* Created by GUY on 2015/9/7.
* @class BI.DateTriangleTrigger
* @extends BI.Trigger
*/
BI.DateTriangleTrigger = BI.inherit(BI.Trigger, {
_const: {
height: 25,
iconWidth: 16,
iconHeight: 13
},
_defaultConfig: function() {
return BI.extend( BI.DateTriangleTrigger.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-date-triangle-trigger pull-down-ha-font cursor-pointer",
height: 25
});
},
_init: function() {
BI.DateTriangleTrigger.superclass._init.apply(this, arguments);
var o = this.options, c = this._const;
this.text = BI.createWidget({
type: "bi.label",
cls: "list-item-text",
textAlign: "right",
text: o.text,
value: o.value,
height: c.height
})
this.icon = BI.createWidget({
type: "bi.icon",
width: c.iconWidth,
height: c.iconHeight
});
BI.createWidget({
type: "bi.center_adapt",
element: this,
items: [{
type: "bi.center_adapt",
width: 50,
height: c.height,
items: [this.text, this.icon]
}]
})
},
setValue: function(v){
this.text.setValue(v);
},
getValue: function(){
return this.text.getValue();
},
setText: function(v){
this.text.setText(v);
},
getText: function(){
return this.item.getText();
},
getKey: function(){
}
});
BI.shortcut('bi.date_triangle_trigger', BI.DateTriangleTrigger);/**
* 日期下拉框
*
* Created by GUY on 2015/9/7.
* @class BI.DateCombo
* @extends BI.Widget
*/
BI.DateCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.DateCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-date-combo",
height: 30
});
},
_init: function () {
BI.DateCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget({
type: "bi.date_trigger"
});
this.trigger.on(BI.DateTrigger.EVENT_TRIGGER_CLICK, function () {
self.combo.toggle();
});
this.popup = BI.createWidget({
type: "bi.date_calendar_popup"
});
this.popup.on(BI.DateCalendarPopup.EVENT_CHANGE, function () {
self.setValue(self.popup.getValue());
});
this.combo = BI.createWidget({
type: "bi.combo",
toggle: false,
element: this,
isNeedAdjustHeight: false,
isNeedAdjustWidth: false,
el: this.trigger,
popup: {
width: 270,
el: this.popup,
stopPropagation: false
}
})
},
setValue: function (v) {
this.trigger.setValue(v);
this.popup.setValue(v);
},
getValue: function () {
return this.popup.getValue();
}
});
BI.shortcut('bi.date_combo', BI.DateCombo);BI.DateTrigger = BI.inherit(BI.Trigger, {
_const: {
hgap: 4,
vgap: 2,
triggerWidth: 30,
yearLength: 4,
yearMonthLength: 7
},
_defaultConfig: function () {
return BI.extend(BI.DateTrigger.superclass._defaultConfig.apply(this, arguments), {
extraCls: "bi-date-trigger bi-border",
min: '1900-01-01', //最小日期
max: '2099-12-31', //最大日期
height: 25
});
},
_init: function () {
BI.DateTrigger.superclass._init.apply(this, arguments);
var self = this, o = this.options, c = this._const;
this.editor = BI.createWidget({
type: "bi.sign_editor",
height: o.height,
validationChecker: function (v) {
var date = v.match(/\d+/g);
self._autoAppend(v, date);
return self._dateCheck(v) && Date.checkLegal(v) && self._checkVoid({
year: date[0],
month: date[1],
day: date[2]
});
},
quitChecker: function () {
return false;
},
hgap: c.hgap,
vgap: c.vgap,
allowBlank: true,
watermark: BI.i18nText("BI-Basic_Unrestricted"),
errorText: function () {
if (self.editor.isEditing()) {
return BI.i18nText("BI-Date_Trigger_Error_Text");
}
return BI.i18nText("BI-Year_Trigger_Invalid_Text");
}
});
this.editor.on(BI.SignEditor.EVENT_KEY_DOWN, function () {
self.fireEvent(BI.DateTrigger.EVENT_KEY_DOWN)
});
this.editor.on(BI.SignEditor.EVENT_FOCUS, function () {
self.fireEvent(BI.DateTrigger.EVENT_FOCUS);
});
this.editor.on(BI.SignEditor.EVENT_STOP, function () {
self.fireEvent(BI.DateTrigger.EVENT_STOP);
});
this.editor.on(BI.SignEditor.EVENT_VALID, function () {
self.fireEvent(BI.DateTrigger.EVENT_VALID);
});
this.editor.on(BI.SignEditor.EVENT_ERROR, function () {
self.fireEvent(BI.DateTrigger.EVENT_ERROR);
});
this.editor.on(BI.SignEditor.EVENT_CONFIRM, function () {
var value = self.editor.getValue();
if (BI.isNotNull(value)) {
self.editor.setState(value);
}
if (BI.isNotEmptyString(value)) {
var date = value.split("-");
self.store_value = {
type: BI.DateTrigger.MULTI_DATE_CALENDAR,
value:{
year: date[0] | 0,
month: date[1] - 1,
day: date[2] | 0
}
};
}
self.fireEvent(BI.DateTrigger.EVENT_CONFIRM);
});
this.editor.on(BI.SignEditor.EVENT_SPACE, function () {
if (self.editor.isValid()) {
self.editor.blur();
}
});
this.editor.on(BI.SignEditor.EVENT_START, function () {
self.fireEvent(BI.DateTrigger.EVENT_START);
});
this.editor.on(BI.SignEditor.EVENT_CHANGE, function () {
self.fireEvent(BI.DateTrigger.EVENT_CHANGE);
});
BI.createWidget({
type: "bi.htape",
element: this,
items: [{
el: BI.createWidget(),
width: 30
}, {
el: this.editor
}]
})
},
_dateCheck: function (date) {
return Date.parseDateTime(date, "%Y-%x-%d").print("%Y-%x-%d") == date || Date.parseDateTime(date, "%Y-%X-%d").print("%Y-%X-%d") == date || Date.parseDateTime(date, "%Y-%x-%e").print("%Y-%x-%e") == date || Date.parseDateTime(date, "%Y-%X-%e").print("%Y-%X-%e") == date;
},
_checkVoid: function (obj) {
return !Date.checkVoid(obj.year, obj.month, obj.day, this.options.min, this.options.max)[0];
},
_autoAppend: function (v, dateObj) {
var self = this;
var date = Date.parseDateTime(v, "%Y-%X-%d").print("%Y-%X-%d");
var yearCheck = function (v) {
return Date.parseDateTime(v, "%Y").print("%Y") == v && date >= self.options.min && date <= self.options.max;
};
var monthCheck = function (v) {
return Date.parseDateTime(v, "%Y-%X").print("%Y-%X") == v && date >= self.options.min && date <= self.options.max;
};
if (BI.isNotNull(dateObj) && Date.checkLegal(v)) {
switch (v.length) {
case this._const.yearLength:
if (yearCheck(v)) {
this.editor.setValue(v + "-");
}
break;
case this._const.yearMonthLength:
if (monthCheck(v)) {
this.editor.setValue(v + "-");
}
break;
}
}
},
setValue: function (v) {
var type, value, self = this;
var date = new Date();
this.store_value = v;
if (BI.isNotNull(v)) {
type = v.type || BI.DateTrigger.MULTI_DATE_CALENDAR; value = v.value;
if(BI.isNull(value)){
value = v;
}
}
var _setInnerValue = function (date, text) {
var dateStr = date.print("%Y-%x-%e");
self.editor.setState(dateStr);
self.editor.setValue(dateStr);
self.setTitle(text + ":" + dateStr);
};
switch (type) {
case BI.DateTrigger.MULTI_DATE_YEAR_PREV:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_PREV];
date = new Date((date.getFullYear() - 1 * value), date.getMonth(), date.getDate());
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_YEAR_AFTER:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_AFTER];
date = new Date((date.getFullYear() + 1 * value), date.getMonth(), date.getDate());
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_YEAR_BEGIN:
var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_BEGIN];
date = new Date(date.getFullYear(), 0, 1);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_YEAR_END:
var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_END];
date = new Date(date.getFullYear(), 11, 31);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_QUARTER_PREV:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_PREV];
date = new Date().getBeforeMulQuarter(value);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_QUARTER_AFTER:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_AFTER];
date = new Date().getAfterMulQuarter(value);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_QUARTER_BEGIN:
var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_BEGIN];
date = new Date().getQuarterStartDate();
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_QUARTER_END:
var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_END];
date = new Date().getQuarterEndDate();
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_MONTH_PREV:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_PREV];
date = new Date().getBeforeMultiMonth(value);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_MONTH_AFTER:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_AFTER];
date = new Date().getAfterMultiMonth(value);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_MONTH_BEGIN:
var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_BEGIN];
date = new Date(date.getFullYear(), date.getMonth(), 1);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_MONTH_END:
var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_END];
date = new Date(date.getFullYear(), date.getMonth(), (date.getLastDateOfMonth()).getDate());
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_WEEK_PREV:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_WEEK_PREV];
date = date.getOffsetDate(-7 * value);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_WEEK_AFTER:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_WEEK_AFTER];
date = date.getOffsetDate(7 * value);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_DAY_PREV:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_PREV];
date = date.getOffsetDate(-1 * value);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_DAY_AFTER:
var text = value + BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_AFTER];
date = date.getOffsetDate(1 * value);
_setInnerValue(date, text);
break;
case BI.DateTrigger.MULTI_DATE_DAY_TODAY:
var text = BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_TODAY];
date = new Date();
_setInnerValue(date, text);
break;
default:
if (BI.isNull(value) || BI.isNull(value.day)) {
this.editor.setState("");
this.editor.setValue("");
this.setTitle("");
} else {
var dateStr = value.year + "-" + (value.month + 1) + "-" + value.day;
this.editor.setState(dateStr);
this.editor.setValue(dateStr);
this.setTitle(dateStr);
}
break;
}
},
getKey: function () {
return this.editor.getValue();
},
getValue: function () {
return this.store_value;
}
});
BI.DateTrigger.MULTI_DATE_YEAR_PREV = 1;
BI.DateTrigger.MULTI_DATE_YEAR_AFTER = 2;
BI.DateTrigger.MULTI_DATE_YEAR_BEGIN = 3;
BI.DateTrigger.MULTI_DATE_YEAR_END = 4;
BI.DateTrigger.MULTI_DATE_MONTH_PREV = 5;
BI.DateTrigger.MULTI_DATE_MONTH_AFTER = 6;
BI.DateTrigger.MULTI_DATE_MONTH_BEGIN = 7;
BI.DateTrigger.MULTI_DATE_MONTH_END = 8;
BI.DateTrigger.MULTI_DATE_QUARTER_PREV = 9;
BI.DateTrigger.MULTI_DATE_QUARTER_AFTER = 10;
BI.DateTrigger.MULTI_DATE_QUARTER_BEGIN = 11;
BI.DateTrigger.MULTI_DATE_QUARTER_END = 12;
BI.DateTrigger.MULTI_DATE_WEEK_PREV = 13;
BI.DateTrigger.MULTI_DATE_WEEK_AFTER = 14;
BI.DateTrigger.MULTI_DATE_DAY_PREV = 15;
BI.DateTrigger.MULTI_DATE_DAY_AFTER = 16;
BI.DateTrigger.MULTI_DATE_DAY_TODAY = 17;
BI.DateTrigger.MULTI_DATE_PARAM = 18;
BI.DateTrigger.MULTI_DATE_CALENDAR = 19;
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM = {};
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_PREV] = BI.i18nText("BI-Multi_Date_Year_Prev");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_AFTER] = BI.i18nText("BI-Multi_Date_Year_Next");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_BEGIN] = BI.i18nText("BI-Multi_Date_Year_Begin");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_YEAR_END] = BI.i18nText("BI-Multi_Date_Year_End");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_PREV] = BI.i18nText("BI-Multi_Date_Quarter_Prev");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_AFTER] = BI.i18nText("BI-Multi_Date_Quarter_Next");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_BEGIN] = BI.i18nText("BI-Multi_Date_Quarter_Begin");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_QUARTER_END] = BI.i18nText("BI-Multi_Date_Quarter_End");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_PREV] = BI.i18nText("BI-Multi_Date_Month_Prev");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_AFTER] = BI.i18nText("BI-Multi_Date_Month_Next");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_BEGIN] = BI.i18nText("BI-Multi_Date_Month_Begin");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_MONTH_END] = BI.i18nText("BI-Multi_Date_Month_End");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_WEEK_PREV] = BI.i18nText("BI-Multi_Date_Week_Prev");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_WEEK_AFTER] = BI.i18nText("BI-Multi_Date_Week_Next");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_PREV] = BI.i18nText("BI-Multi_Date_Day_Prev");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_AFTER] = BI.i18nText("BI-Multi_Date_Day_Next");
BI.DateTrigger.MULTI_DATE_SEGMENT_NUM[BI.DateTrigger.MULTI_DATE_DAY_TODAY] = BI.i18nText("BI-Multi_Date_Today");
BI.DateTrigger.EVENT_FOCUS = "EVENT_FOCUS";
BI.DateTrigger.EVENT_START = "EVENT_START";
BI.DateTrigger.EVENT_STOP = "EVENT_STOP";
BI.DateTrigger.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.DateTrigger.EVENT_CHANGE = "EVENT_CHANGE";
BI.DateTrigger.EVENT_VALID = "EVENT_VALID";
BI.DateTrigger.EVENT_ERROR = "EVENT_ERROR";
BI.DateTrigger.EVENT_TRIGGER_CLICK = "EVENT_TRIGGER_CLICK";
BI.DateTrigger.EVENT_KEY_DOWN = "EVENT_KEY_DOWN";
BI.shortcut("bi.date_trigger", BI.DateTrigger);/**
* Created by zcf on 2017/2/20.
*/
BI.DatePaneWidget = BI.inherit(BI.Widget, {
_defaultConfig: function () {
var conf = BI.DatePaneWidget.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: "bi-date-pane-widget",
min: '1900-01-01', //最小日期
max: '2099-12-31', //最大日期
selectedTime: null
})
},
_init: function () {
BI.DatePaneWidget.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.today = new Date();
this._year = this.today.getFullYear();
this._month = this.today.getMonth();
this.selectedTime = o.selectedTime || {
year: this._year,
month: this._month
};
this.datePicker = BI.createWidget({
type: "bi.date_picker",
min: o.min,
max: o.max
});
this.datePicker.on(BI.DatePicker.EVENT_CHANGE, function () {
self.selectedTime = self.datePicker.getValue();
// self.selectedTime.day = 1;
self.calendar.setSelect(BI.Calendar.getPageByDateJSON(self.selectedTime));
});
this.calendar = BI.createWidget({
direction: "top",
element: this,
logic: {
dynamic: false
},
type: "bi.navigation",
tab: this.datePicker,
cardCreator: BI.bind(this._createNav, this)
// afterCardCreated: function () {
//
// },
//
// afterCardShow: function () {
// // this.setValue(self.selectedTime);
// }
});
this.calendar.on(BI.Navigation.EVENT_CHANGE, function () {
self.selectedTime = self.calendar.getValue();
self.calendar.empty();
self.setValue(self.selectedTime);
self.fireEvent(BI.DateCalendarPopup.EVENT_CHANGE);
});
},
_createNav: function (v) {
var date = BI.Calendar.getDateJSONByPage(v);
var calendar = BI.createWidget({
type: "bi.calendar",
logic: {
dynamic: false
},
min: this.options.min,
max: this.options.max,
year: date.year,
month: date.month,
day: this.selectedTime.day
});
return calendar;
},
_getNewCurrentDate: function () {
var today = new Date();
return {
year: today.getFullYear(),
month: today.getMonth()
}
},
_setCalenderValue: function (date) {
this.calendar.setSelect(BI.Calendar.getPageByDateJSON(date));
this.calendar.setValue(date);
this.selectedTime = date;
},
_setDatePicker: function (timeOb) {
if (BI.isNull(timeOb) || BI.isNull(timeOb.year) || BI.isNull(timeOb.month)) {
this.datePicker.setValue(this._getNewCurrentDate());
} else {
this.datePicker.setValue(timeOb);
}
},
_setCalendar: function (timeOb) {
if (BI.isNull(timeOb) || BI.isNull(timeOb.day)) {
this.calendar.empty();
this._setCalenderValue(this._getNewCurrentDate());
} else {
this._setCalenderValue(timeOb)
}
},
setValue: function (timeOb) {
this._setDatePicker(timeOb);
this._setCalendar(timeOb);
},
getValue: function () {
return this.selectedTime;
}
});
BI.shortcut("bi.date_pane_widget", BI.DatePaneWidget);/**
* 带有方向的pathchooser
*
* Created by GUY on 2016/4/21.
* @class BI.DirectionPathChooser
* @extends BI.Widget
*/
BI.DirectionPathChooser = BI.inherit(BI.Widget, {
_const: {
lineColor: "#808080",
selectLineColor: "#009de3"
},
_defaultConfig: function () {
return BI.extend(BI.DirectionPathChooser.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-excel-table",
items: []
});
},
_init: function () {
BI.DirectionPathChooser.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.pathChooser = BI.createWidget({
type: "bi.path_chooser",
element: this,
items: o.items
});
this.pathChooser.on(BI.PathChooser.EVENT_CHANGE, function (start, index) {
//self._unselectAllArrows();
self._setValue(start, index);
self.fireEvent(BI.DirectionPathChooser.EVENT_CHANGE);
});
this._drawArrows();
},
_unselectAllArrows: function () {
var self = this, lineColor = this._const.lineColor;
BI.each(this.arrows, function (region, rs) {
BI.each(rs, function (idx, arrows) {
BI.each(arrows, function (i, arrow) {
arrow.attr({fill: lineColor, stroke: lineColor});
});
});
});
},
_drawOneArrow: function (dot, direction) {
//0,1,2,3 上右下左
var lineColor = this._const.lineColor;
var selectLineColor = this._const.selectLineColor;
var svg = this.pathChooser.svg;
var path = "";
switch (direction) {
case 0:
path = "M" + dot.x + "," + dot.y
+ "L" + (dot.x - 3) + "," + (dot.y + 5)
+ "L" + (dot.x + 3) + "," + (dot.y + 5)
+ "L" + dot.x + "," + dot.y;
break;
case 1:
path = "M" + dot.x + "," + dot.y
+ "L" + (dot.x - 5) + "," + (dot.y - 3)
+ "L" + (dot.x - 5) + "," + (dot.y + 3)
+ "L" + dot.x + "," + dot.y;
break;
case 2:
path = "M" + dot.x + "," + dot.y
+ "L" + (dot.x - 3) + "," + (dot.y - 5)
+ "L" + (dot.x + 3) + "," + (dot.y - 5)
+ "L" + dot.x + "," + dot.y;
break;
case 3:
path = "M" + dot.x + "," + dot.y
+ "L" + (dot.x + 5) + "," + (dot.y - 3)
+ "L" + (dot.x + 5) + "," + (dot.y + 3)
+ "L" + dot.x + "," + dot.y;
break;
}
return svg.path(path).attr({fill: lineColor, stroke: lineColor});
},
_drawArrows: function () {
var self = this, o = this.options;
var routes = this.pathChooser.routes;
var pathes = this.pathChooser.pathes;
var store = this.pathChooser.store;
this.arrows = {};
BI.each(routes, function (region, ps) {
self.arrows[region] = [];
BI.each(ps, function (idx, path) {
self.arrows[region][idx] = [];
var dots = pathes[region][idx];
BI.each(dots, function (i, dot) {
if (i > 0 && i < dots.length - 1) {
var arrow;
if (dot.y === dots[i - 1].y) {
if (dots[i + 1].y != dot.y) {
if (store[path[path.length - 2]].direction === -1) {
if (i - 1 > 0) {
arrow = self._drawOneArrow(dots[i - 1], 3);
}
} else {
arrow = self._drawOneArrow(dots[i], 1);
}
}
} else if (dot.x === dots[i - 1].x) {
if (dot.y > dots[i - 1].y) {
if (store[BI.first(path)].direction === -1) {
arrow = self._drawOneArrow(dots[i - 1], 0);
} else {
arrow = self._drawOneArrow(dot, 2);
}
} else {
if (store[path[path.length - 2]].direction === -1) {
arrow = self._drawOneArrow(dots[i - 1], 2);
} else {
arrow = self._drawOneArrow(dot, 0);
}
}
}
if (arrow) {
self.arrows[region][idx].push(arrow);
}
}
});
BI.each(path, function (i, node) {
if (i !== 0) {
var arrow;
var from = path[i - 1];
if (store[from].direction === -1) {
var regionIndex = self.pathChooser.getRegionIndexById(from);
var x = getXoffsetByRegionIndex(regionIndex, -1);
var y = getYByXoffset(dots, x);
arrow = self._drawOneArrow({x: x, y: y}, 3);
} else {
var regionIndex = self.pathChooser.getRegionIndexById(node);
var x = getXoffsetByRegionIndex(regionIndex);
var y = getYByXoffset(dots, x);
arrow = self._drawOneArrow({x: x, y: y}, 1);
}
if (arrow) {
self.arrows[region][idx].push(arrow);
}
}
});
})
});
function getXoffsetByRegionIndex(regionIndex, diregion) {
if (diregion === -1) {
return 100 * (regionIndex + 1) - 20;
}
return 100 * regionIndex + 20;
}
function getYByXoffset(dots, xoffset) {
var finded = BI.find(dots, function (i, dot) {
if (i > 0) {
if (dots[i - 1].x < xoffset && dots[i].x > xoffset) {
return true;
}
}
});
return finded.y;
}
},
_setValue: function (start, index) {
var self = this;
var lineColor = this._const.lineColor;
var selectLineColor = this._const.selectLineColor;
var routes = this.pathChooser.routes;
var starts = this.pathChooser.start;
var each = [start];
if (starts.contains(start)) {
each = starts;
}
BI.each(each, function (i, s) {
BI.each(self.arrows[s], function (j, arrows) {
BI.each(arrows, function (k, arrow) {
arrow.attr({fill: lineColor, stroke: lineColor}).toFront();
});
});
});
BI.each(this.arrows[start][index], function (i, arrow) {
arrow.attr({fill: selectLineColor, stroke: selectLineColor}).toFront();
});
var current = BI.last(routes[start][index]);
while (current && routes[current] && routes[current].length === 1) {
BI.each(self.arrows[current][0], function (i, arrow) {
arrow.attr({fill: selectLineColor, stroke: selectLineColor}).toFront();
});
current = BI.last(routes[current][0]);
}
},
setValue: function (v) {
this.pathChooser.setValue(v);
this._unselectAllArrows();
var routes = this.pathChooser.routes;
var nodes = BI.keys(routes), self = this;
var result = [], array = [];
BI.each(v, function (i, val) {
if (BI.contains(nodes, val)) {
if (array.length > 0) {
array.push(val);
result.push(array);
array = [];
}
}
array.push(val);
});
if (array.length > 0) {
result.push(array);
}
//画这n条路径
BI.each(result, function (idx, path) {
var start = path[0];
var index = BI.findIndex(routes[start], function (idx, p) {
if (BI.isEqual(path, p)) {
return true;
}
});
if (index >= 0) {
self._setValue(start, index);
}
});
},
getValue: function () {
return this.pathChooser.getValue();
},
populate: function (items) {
this.pathChooser.populate(items);
this._drawArrows();
}
});
BI.DirectionPathChooser.EVENT_CHANGE = "DirectionPathChooser.EVENT_CHANGE";
BI.shortcut('bi.direction_path_chooser', BI.DirectionPathChooser);/**
* Created by roy on 15/8/14.
*/
BI.DownListCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.DownListCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-down-list-combo",
invalid: false,
height: 25,
items: [],
adjustLength: 0,
el: {}
})
},
_init: function () {
BI.DownListCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.popupview = BI.createWidget({
type: "bi.down_list_popup",
items: o.items,
chooseType: o.chooseType
});
this.popupview.on(BI.DownListPopup.EVENT_CHANGE, function (value) {
self.fireEvent(BI.DownListCombo.EVENT_CHANGE, value);
self.downlistcombo.hideView();
});
this.popupview.on(BI.DownListPopup.EVENT_SON_VALUE_CHANGE, function (value, fatherValue) {
self.fireEvent(BI.DownListCombo.EVENT_SON_VALUE_CHANGE, value, fatherValue);
self.downlistcombo.hideView();
});
this.downlistcombo = BI.createWidget({
element: this,
type: 'bi.combo',
isNeedAdjustWidth: false,
adjustLength: o.adjustLength,
el: BI.createWidget(o.el, {
type: "bi.icon_trigger",
extraCls: o.iconCls ? o.iconCls : "pull-down-font",
width: o.width,
height: o.height
}),
popup: {
el: this.popupview,
stopPropagation: true,
maxHeight: 1000
}
});
this.downlistcombo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.DownListCombo.EVENT_BEFORE_POPUPVIEW);
});
},
hideView: function () {
this.downlistcombo.hideView();
},
populate: function (items) {
this.popupview.populate(items);
},
setValue: function (v) {
this.popupview.setValue(v);
},
getValue: function () {
return this.popupview.getValue()
}
});
BI.DownListCombo.EVENT_CHANGE = "EVENT_CHANGE";
BI.DownListCombo.EVENT_SON_VALUE_CHANGE = "EVENT_SON_VALUE_CHANGE";
BI.DownListCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.shortcut("bi.down_list_combo", BI.DownListCombo);/**
* Created by roy on 15/9/6.
*/
BI.DownListGroup = BI.inherit(BI.Widget, {
constants: {
iconCls: "check-mark-ha-font"
},
_defaultConfig: function () {
return BI.extend(BI.DownListGroup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-down-list-group",
items: [
{
el: {}
}
]
})
},
_init: function () {
BI.DownListGroup.superclass._init.apply(this, arguments);
var o = this.options, self = this;
this.downlistgroup = BI.createWidget({
element: this,
type: "bi.button_tree",
items: o.items,
chooseType: 0,//0单选,1多选
layouts: [{
type: "bi.vertical",
hgap: 0,
vgap: 0
}]
});
this.downlistgroup.on(BI.Controller.EVENT_CHANGE, function (type) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
if(type === BI.Events.CLICK) {
self.fireEvent(BI.DownListGroup.EVENT_CHANGE, arguments);
}
})
},
getValue:function(){
return this.downlistgroup.getValue();
},
setValue:function(v){
this.downlistgroup.setValue(v);
}
})
BI.DownListGroup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.down_list_group", BI.DownListGroup);BI.DownListItem = BI.inherit(BI.Single, {
_defaultConfig: function () {
var conf = BI.DownListItem.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: "bi-down-list-item bi-list-item-active",
cls: "",
height: 25,
logic: {
dynamic: true
},
selected: false,
iconHeight: null,
iconWidth: null,
textHgap: 0,
textVgap: 0,
textLgap: 0,
textRgap: 0
})
},
_init: function () {
BI.DownListItem.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.text = BI.createWidget({
type: "bi.icon_text_item",
element: this,
height: o.height,
text: o.text,
value: o.value,
logic: o.logic,
selected: o.selected,
disabled: o.disabled,
iconHeight: o.iconHeight,
iconWidth: o.iconWidth,
textHgap: o.textHgap,
textVgap: o.textVgap,
textLgap: o.textLgap,
textRgap: o.textRgap,
father: o.father
});
this.text.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.text.on(BI.IconTextItem.EVENT_CHANGE, function () {
self.fireEvent(BI.DownListItem.EVENT_CHANGE);
});
// this.setSelected(o.selected);
},
doRedMark: function () {
this.text.doRedMark.apply(this.text, arguments);
},
unRedMark: function () {
this.text.unRedMark.apply(this.text, arguments);
},
isSelected: function () {
return this.text.isSelected();
},
setSelected: function (b) {
this.text.setSelected(b);
// if (b === true) {
// this.element.addClass("dot-e-font");
// } else {
// this.element.removeClass("dot-e-font");
// }
},
setValue: function (v) {
this.text.setValue(v);
},
getValue: function () {
return this.text.getValue();
}
});
BI.DownListItem.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.down_list_item", BI.DownListItem);BI.DownListGroupItem = BI.inherit(BI.BasicButton, {
_defaultConfig: function () {
var conf = BI.DownListGroupItem.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: (conf.baseCls || "") + " bi-down-list-group-item",
logic: {
dynamic: false
},
// invalid: true,
iconCls1: "dot-e-font",
iconCls2: "pull-right-e-font"
})
},
_init: function () {
BI.DownListGroupItem.superclass._init.apply(this, arguments);
var o = this.options;
var self = this;
this.text = BI.createWidget({
type: "bi.label",
cls: "list-group-item-text",
textAlign: "left",
text: o.text,
value: o.value,
height: o.height
});
this.icon1 = BI.createWidget({
type: "bi.icon_button",
cls: o.iconCls1,
width: 25,
forceNotSelected: true
});
this.icon2 = BI.createWidget({
type: "bi.icon_button",
cls: o.iconCls2,
width: 25,
forceNotSelected: true
});
var blank = BI.createWidget({
type: "bi.layout",
width: 25
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: this.icon2,
top: 0,
bottom: 0,
right: 0
}]
});
BI.createWidget(BI.extend({
element: this
}, BI.LogicFactory.createLogic("horizontal", BI.extend(o.logic, {
items: BI.LogicFactory.createLogicItemsByDirection("left", this.icon1, this.text, blank)
}))));
this.element.hover(function () {
if (self.isEnabled()) {
self.hover();
}
}, function () {
if (self.isEnabled()) {
self.dishover()
}
});
},
hover: function () {
BI.DownListGroupItem.superclass.hover.apply(this, arguments);
this.icon1.element.addClass("hover");
this.icon2.element.addClass("hover");
},
dishover: function () {
BI.DownListGroupItem.superclass.dishover.apply(this, arguments);
this.icon1.element.removeClass("hover");
this.icon2.element.removeClass("hover");
},
doClick: function () {
BI.DownListGroupItem.superclass.doClick.apply(this, arguments);
if (this.isValid()) {
this.fireEvent(BI.DownListGroupItem.EVENT_CHANGE, this.getValue());
}
},
doRedMark: function () {
this.text.doRedMark.apply(this.text, arguments);
},
unRedMark: function () {
this.text.unRedMark.apply(this.text, arguments);
},
setValue: function (v) {
var self = this, o = this.options;
v = BI.isArray(v) ? v : [v];
BI.find(v, function (idx, value) {
if (BI.contains(o.childValues, value)) {
self.icon1.setSelected(true);
return true;
} else {
self.icon1.setSelected(false);
}
})
}
});
BI.DownListGroupItem.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.down_list_group_item", BI.DownListGroupItem);/**
* Created by roy on 15/9/8.
* 处理popup中的item分组样式
* 一个item分组中的成员大于一时,该分组设置为单选,并且默认状态第一个成员设置为已选择项
*/
BI.DownListPopup = BI.inherit(BI.Pane, {
constants: {
nextIcon: "pull-right-e-font",
height: 25,
iconHeight: 12,
iconWidth: 12,
hgap: 0,
vgap: 0,
border: 1
},
_defaultConfig: function () {
var conf = BI.DownListPopup.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: "bi-down-list-popup",
items: [],
chooseType: BI.Selection.Multi
})
},
_init: function () {
BI.DownListPopup.superclass._init.apply(this, arguments);
this.singleValues = [];
this.childValueMap = {};
this.fatherValueMap = {};
var self = this, o = this.options, children = this._createChildren(o.items);
this.popup = BI.createWidget({
type: "bi.button_tree",
items: BI.createItems(children,
{}, {
adjustLength: -2
}
),
layouts: [{
type: "bi.vertical",
hgap: this.constants.hgap,
vgap: this.constants.vgap
}],
chooseType: o.chooseType
});
this.popup.on(BI.ButtonTree.EVENT_CHANGE, function (value, object) {
var changedValue = value;
if (BI.isNotNull(self.childValueMap[value])) {
changedValue = self.childValueMap[value];
self.fireEvent(BI.DownListPopup.EVENT_SON_VALUE_CHANGE, changedValue, self.fatherValueMap[value])
} else {
self.fireEvent(BI.DownListPopup.EVENT_CHANGE, changedValue, object);
}
if (!self.singleValues.contains(changedValue)) {
var item = self.getValue();
var result = [];
BI.each(item, function (i, valueObject) {
if (valueObject.value != changedValue) {
result.push(valueObject);
}
});
self.setValue(result);
}
});
BI.createWidget({
type: "bi.vertical",
element: this,
items: [this.popup]
});
},
_createChildren: function (items) {
var self = this, result = [];
BI.each(items, function (i, it) {
var item_done = {
type: "bi.down_list_group",
items: []
};
BI.each(it, function (i, item) {
if (BI.isNotEmptyArray(item.children) && !BI.isEmpty(item.el)) {
item.type = "bi.combo_group";
item.cls = "down-list-group";
item.trigger = "hover";
item.isNeedAdjustWidth = false;
item.el.title = item.el.title || item.el.text;
item.el.type = "bi.down_list_group_item";
item.el.logic = {
dynamic: true
};
item.el.height = self.constants.height;
item.el.iconCls2 = self.constants.nextIcon;
item.popup = {
lgap: 4,
el: {
type: "bi.button_tree",
chooseType: 0,
layouts: [{
type: "bi.vertical"
}]
}
};
item.el.childValues = [];
BI.each(item.children, function (i, child) {
var fatherValue = BI.deepClone(item.el.value);
var childValue = BI.deepClone(child.value);
self.singleValues.push(child.value);
child.type = "bi.down_list_item";
child.extraCls = " child-down-list-item";
child.title = child.title || child.text;
child.textRgap = 10;
child.isNeedAdjustWidth = false;
child.logic = {
dynamic: true
};
child.father = fatherValue;
self.fatherValueMap[self._createChildValue(fatherValue, childValue)] = fatherValue;
self.childValueMap[self._createChildValue(fatherValue, childValue)] = childValue;
child.value = self._createChildValue(fatherValue, childValue);
item.el.childValues.push(child.value);
})
} else {
item.type = "bi.down_list_item";
item.title = item.title || item.text;
item.textRgap = 10;
item.isNeedAdjustWidth = false;
item.logic = {
dynamic: true
}
}
var el_done = {};
el_done.el = item;
item_done.items.push(el_done);
});
if (self._isGroup(item_done.items)) {
BI.each(item_done.items, function (i, item) {
self.singleValues.push(item.el.value);
})
}
result.push(item_done);
if (self._needSpliter(i, items.length)) {
var spliter_container = BI.createWidget({
type: "bi.vertical",
items: [{
el: {
type: "bi.layout",
cls: "bi-down-list-spliter bi-border-top cursor-pointer",
height: 0
}
}],
cls: "bi-down-list-spliter-container cursor-pointer",
lgap: 10,
rgap: 10
});
result.push(spliter_container);
}
});
return result;
},
_isGroup: function (i) {
return i.length > 1;
},
_needSpliter: function (i, itemLength) {
return i < itemLength - 1;
},
_createChildValue: function (fatherValue, childValue) {
return fatherValue + "_" + childValue
},
populate: function (items) {
BI.DownListPopup.superclass.populate.apply(this, arguments);
var self = this;
self.childValueMap = {};
self.fatherValueMap = {};
self.singleValues = [];
var children = self._createChildren(items);
var popupItem = BI.createItems(children,
{}, {
adjustLength: -2
}
);
self.popup.populate(popupItem);
},
setValue: function (valueItem) {
var self = this;
var valueArray = [];
BI.each(valueItem, function (i, item) {
var value;
if (BI.isNotNull(item.childValue)) {
value = self._createChildValue(item.value, item.childValue);
} else {
value = item.value;
}
valueArray.push(value);
}
);
this.popup.setValue(valueArray);
},
getValue: function () {
var self = this, result = [];
var values = this.popup.getValue();
BI.each(values, function (i, value) {
var valueItem = {};
if (BI.isNotNull(self.childValueMap[value])) {
var fartherValue = self.fatherValueMap[value];
valueItem.childValue = self.childValueMap[value];
valueItem.value = fartherValue;
} else {
valueItem.value = value;
}
result.push(valueItem);
});
return result;
}
});
BI.DownListPopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.DownListPopup.EVENT_SON_VALUE_CHANGE = "EVENT_SON_VALUE_CHANGE";
BI.shortcut("bi.down_list_popup", BI.DownListPopup);/**
*
* Created by GUY on 2016/3/28.
* @class BI.ExcelTableCell
* @extends BI.Widget
*/
BI.ExcelTableCell = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.ExcelTableCell.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-excel-table-cell",
text: ""
});
},
_init: function () {
BI.ExcelTableCell.superclass._init.apply(this, arguments);
var self = this, o = this.options;
BI.createWidget({
type: "bi.label",
element: this,
textAlign: "left",
whiteSpace: "normal",
height: this.options.height,
text: this.options.text,
value: this.options.value
})
}
});
BI.shortcut('bi.excel_table_cell', BI.ExcelTableCell);/**
*
* Created by GUY on 2016/3/28.
* @class BI.ExcelTableHeaderCell
* @extends BI.Widget
*/
BI.ExcelTableHeaderCell = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.ExcelTableHeaderCell.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-excel-table-header-cell bi-background",
text: ""
});
},
_init: function () {
BI.ExcelTableHeaderCell.superclass._init.apply(this, arguments);
var self = this, o = this.options;
BI.createWidget({
type: "bi.label",
element: this,
textAlign: BI.HorizontalAlign.Center,
whiteSpace: "normal",
height: this.options.height,
text: this.options.text,
value: this.options.value
})
}
});
BI.shortcut('bi.excel_table_header_cell', BI.ExcelTableHeaderCell);/**
* Excel表格
*
* Created by GUY on 2016/3/28.
* @class BI.ExcelTable
* @extends BI.Widget
*/
BI.ExcelTable = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.ExcelTable.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-excel-table",
el: {
type: "bi.responsive_table"
},
isNeedResize: false,
isResizeAdapt: true,
isNeedMerge: false,//是否需要合并单元格
mergeCols: [], //合并的单元格列号
mergeRule: function (row1, row2) { //合并规则, 默认相等时合并
return BI.isEqual(row1, row2);
},
columnSize: [],
headerRowSize: 37,
footerRowSize: 37,
rowSize: 37,
regionColumnSize: false,
items: [] //二维数组
});
},
_init: function () {
BI.ExcelTable.superclass._init.apply(this, arguments);
var self = this, o = this.options;
var mergeCols = [];
BI.each(o.mergeCols, function (i, col) {
mergeCols.push(col + 1);
});
this.table = BI.createWidget(o.el, {
type: "bi.table_view",
element: this,
isNeedFreeze: false,
isNeedMerge: o.isNeedMerge,
mergeCols: mergeCols,
mergeRule: o.mergeRule,
columnSize: [""].concat(o.columnSize),
headerRowSize: 18,
rowSize: o.rowSize,
regionColumnSize: o.regionColumnSize || [82, ""]
});
if (BI.isNotEmptyArray(o.items)) {
this.populate(o.items);
}
BI.nextTick(function () {
self.setRegionColumnSize(o.regionColumnSize || [82, ""]);
});
},
resize: function () {
this.table.resize();
},
setColumnSize: function (columnSize) {
this.table.setColumnSize(columnSize);
},
getColumnSize: function () {
return this.table.getColumnSize();
},
getCalculateColumnSize: function () {
return this.table.getCalculateColumnSize();
},
setHeaderColumnSize: function (columnSize) {
this.table.setHeaderColumnSize(columnSize);
},
setRegionColumnSize: function (columnSize) {
this.table.setRegionColumnSize(columnSize);
},
getRegionColumnSize: function () {
return this.table.getRegionColumnSize();
},
getCalculateRegionColumnSize: function () {
return this.table.getCalculateRegionColumnSize();
},
getCalculateRegionRowSize: function () {
return this.table.getCalculateRegionRowSize();
},
getClientRegionColumnSize: function () {
return this.table.getClientRegionColumnSize();
},
getScrollRegionColumnSize: function () {
return this.table.getScrollRegionColumnSize();
},
getScrollRegionRowSize: function () {
return this.table.getScrollRegionRowSize();
},
hasVerticalScroll: function () {
return this.table.hasVerticalScroll();
},
setVerticalScroll: function (scrollTop) {
this.table.setVerticalScroll(scrollTop);
},
setLeftHorizontalScroll: function (scrollLeft) {
this.table.setLeftHorizontalScroll(scrollLeft);
},
setRightHorizontalScroll: function (scrollLeft) {
this.table.setRightHorizontalScroll(scrollLeft);
},
getVerticalScroll: function () {
return this.table.getVerticalScroll();
},
getLeftHorizontalScroll: function () {
return this.table.getLeftHorizontalScroll();
},
getRightHorizontalScroll: function () {
return this.table.getRightHorizontalScroll();
},
getColumns: function () {
return this.table.getColumns();
},
resizeHeader: function () {
this.table.resize();
this.table._resizeHeader && this.table._resizeHeader();
},
attr: function (key,value) {
var self = this;
if (BI.isObject(key)) {
BI.each(key, function (k, v) {
self.attr(k, v);
});
return;
}
BI.ExcelTable.superclass.attr.apply(this, arguments);
switch (key){
case "mergeCols":
var mCols = [];
BI.each(value, function (i, col) {
mCols.push(col + 1);
});
value=mCols;
break;
}
this.table.attr.apply(this.table, arguments);
},
populate: function (rows) {
var self = this;
var columnSize = this.getColumnSize();
var items = [];
var header = [{
type: "bi.excel_table_header_cell"
}];
if (BI.isNotNull(rows)) {
BI.each(columnSize, function (i, size) {
header.push({
type: "bi.excel_table_header_cell",
text: BI.int2Abc(i + 1)
});
});
BI.each(rows, function (i, row) {
items.push([{
type: "bi.excel_table_header_cell",
text: (i + 1)
}].concat(row));
});
}
this.table.populate(items, [header]);
},
destroy: function () {
this.table.destroy();
BI.ExcelTable.superclass.destroy.apply(this, arguments);
}
});
BI.shortcut('bi.excel_table', BI.ExcelTable);/**
* 文件管理控件组
*
* Created by GUY on 2015/12/11.
* @class BI.FileManagerButtonGroup
* @extends BI.Widget
*/
BI.FileManagerButtonGroup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.FileManagerButtonGroup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-file-manager-button_group",
items: []
})
},
_init: function () {
BI.FileManagerButtonGroup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.button_group = BI.createWidget({
type: "bi.button_tree",
element: this,
chooseType: BI.Selection.Multi,
items: this._formatItems(o.items),
layouts: [{
type: "bi.vertical"
}]
});
this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
},
_formatItems: function (items) {
var self = this, o = this.options;
BI.each(items, function (i, item) {
if (item.children && item.children.length > 0) {
item.type = "bi.file_manager_folder_item";
} else {
item.type = "bi.file_manager_file_item";
}
});
return items;
},
setValue: function (v) {
this.button_group.setValue(v);
},
getValue: function () {
return this.button_group.getValue();
},
getNotSelectedValue: function () {
return this.button_group.getNotSelectedValue();
},
getAllLeaves: function () {
return this.button_group.getAllLeaves();
},
getAllButtons: function () {
return this.button_group.getAllButtons();
},
getSelectedButtons: function () {
return this.button_group.getSelectedButtons();
},
getNotSelectedButtons: function () {
return this.button_group.getNotSelectedButtons();
},
populate: function (items) {
this.button_group.populate(this._formatItems(items));
}
});
BI.FileManagerButtonGroup.EVENT_CHANGE = "FileManagerButtonGroup.EVENT_CHANGE";
BI.shortcut("bi.file_manager_button_group", BI.FileManagerButtonGroup);/**
* 文件管理控件
*
* Created by GUY on 2015/12/11.
* @class BI.FileManager
* @extends BI.Widget
*/
BI.FileManager = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.FileManager.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-file-manager",
el: {},
items: []
})
},
_init: function () {
BI.FileManager.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.tree = new BI.Tree();
var items = BI.Tree.transformToTreeFormat(o.items);
this.tree.initTree(items);
this.selectedValues = [];
this.nav = BI.createWidget({
type: "bi.file_manager_nav",
items: BI.deepClone(items)
});
this.nav.on(BI.FileManagerNav.EVENT_CHANGE, function (value, obj) {
if (value == "-1") {//根节点
self.populate({children: self.tree.toJSON()});
} else {
var node = self.tree.search(obj.attr("id"));
self.populate(BI.extend({id: node.id}, node.get("data"), {children: self.tree.toJSON(node)}));
}
self.setValue(self.selectedValues);
});
this.list = BI.createWidget(o.el, {
type: "bi.file_manager_list",
items: items
});
this.list.on(BI.Controller.EVENT_CHANGE, function (type, selected, obj) {
if (type === BI.Events.CHANGE) {
var node = self.tree.search(obj.attr("id"));
self.populate(BI.extend({id: node.id}, node.get("data"), {children: self.tree.toJSON(node)}));
} else if (type === BI.Events.CLICK) {
var values = [];
if (obj instanceof BI.MultiSelectBar) {
var t = self.list.getValue();
selected = t.type === BI.Selection.All;
values = BI.concat(t.assist, t.value);
} else {
values = obj.getAllLeaves();
}
BI.each(values, function (i, v) {
if (selected === true) {
self.selectedValues.pushDistinct(v);
} else {
self.selectedValues.remove(v);
}
});
}
self.setValue(self.selectedValues);
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: this.list,
left: 0,
right: 0,
top: 0,
bottom: 10
}, {
el: this.nav,
left: 40,
right: 100,
top: 0
}]
});
},
setValue: function (value) {
this.selectedValues = value || [];
this.list.setValue(this.selectedValues);
},
getValue: function () {
var obj = this.list.getValue();
var res = obj.type === BI.Selection.All ? obj.assist : obj.value;
res.pushDistinctArray(this.selectedValues);
return res;
},
_populate: function (items) {
this.list.populate(items);
},
getSelectedValue: function () {
return this.nav.getValue()[0];
},
getSelectedId: function () {
return this.nav.getId()[0];
},
populate: function (node) {
var clone = BI.deepClone(node);
this._populate(node.children);
this.nav.populate(clone);
}
});
BI.FileManager.EVENT_CHANGE = "FileManager.EVENT_CHANGE";
BI.shortcut("bi.file_manager", BI.FileManager);/**
* 文件管理控件
*
* Created by GUY on 2015/12/11.
* @class BI.FileManagerFileItem
* @extends BI.Single
*/
BI.FileManagerFileItem = BI.inherit(BI.Single, {
_defaultConfig: function () {
return BI.extend(BI.FileManagerFileItem.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-file-manager-file-item bi-list-item bi-border-bottom",
height: 30
})
},
_init: function () {
BI.FileManagerFileItem.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.checked = BI.createWidget({
type: "bi.multi_select_bar",
text: "",
width: 36,
height: o.height
});
this.checked.on(BI.Controller.EVENT_CHANGE, function () {
arguments[2] = self;
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
BI.createWidget({
type: "bi.htape",
element: this,
items: [{
el: this.checked,
width: 36
}, {
el: {
type: "bi.icon_button",
cls: "create-by-me-file-font"
},
width: 20
}, {
el: {
type: "bi.label",
textAlign: "left",
height: o.height,
text: o.text,
value: o.value
}
}]
})
},
getAllLeaves: function(){
return [this.options.value];
},
isSelected: function () {
return this.checked.isSelected();
},
setSelected: function (v) {
this.checked.setSelected(v);
}
});
BI.FileManagerFileItem.EVENT_CHANGE = "FileManagerFileItem.EVENT_CHANGE";
BI.shortcut("bi.file_manager_file_item", BI.FileManagerFileItem);/**
* 文件管理控件
*
* Created by GUY on 2015/12/11.
* @class BI.FileManagerFolderItem
* @extends BI.Single
*/
BI.FileManagerFolderItem = BI.inherit(BI.Single, {
_defaultConfig: function () {
return BI.extend(BI.FileManagerFolderItem.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-file-manager-folder-item bi-list-item bi-border-bottom",
height: 30
})
},
_init: function () {
BI.FileManagerFolderItem.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.checked = BI.createWidget({
type: "bi.multi_select_bar",
text: "",
width: 36,
height: o.height
});
this.checked.on(BI.Controller.EVENT_CHANGE, function () {
arguments[2] = self;
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.button = BI.createWidget({
type: "bi.text_button",
textAlign: "left",
height: o.height,
text: o.text,
value: o.value
});
this.button.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.CHANGE, o.value, self);
});
this.tree = new BI.Tree();
this.tree.initTree([{
id: o.id,
children: o.children
}]);
this.selectValue = [];
BI.createWidget({
type: "bi.htape",
element: this,
items: [{
el: this.checked,
width: 36
}, {
el: {
type: "bi.icon_button",
cls: "create-by-me-folder-font"
},
width: 20
}, {
el: this.button
}]
})
},
setAllSelected: function (v) {
this.checked.setSelected(v);
this.selectValue = [];
},
setHalfSelected: function (v) {
this.checked.setHalfSelected(v);
if(!v){
this.selectValue = [];
}
},
setValue: function (v) {
var self = this, o = this.options;
var isHalf = false;
var selectValue = [];
this.tree.traverse(function (node) {
if (node.isLeaf()) {
if (BI.contains(v, node.get("data").value)) {
selectValue.push(node.get("data").value);
} else {
isHalf = true;
}
}
});
this.setAllSelected(selectValue.length > 0 && !isHalf);
this.setHalfSelected(selectValue.length > 0 && isHalf);
if (this.checked.isHalfSelected()) {
this.selectValue = selectValue;
}
},
getAllButtons: function () {
return [this];
},
getAllLeaves: function () {
var o = this.options;
var res = [];
this.tree.traverse(function (node) {
if (node.isLeaf()) {
res.push(node.get("data").value)
}
});
return res;
},
getNotSelectedValue: function () {
var self = this, o = this.options;
var res = [];
var isAllSelected = this.checked.isSelected();
if (isAllSelected === true) {
return res;
}
var isHalfSelected = this.checked.isHalfSelected();
this.tree.traverse(function (node) {
if (node.isLeaf()) {
var v = node.get("data").value;
if (isHalfSelected === true) {
if (!BI.contains(self.selectValue, node.get("data").value)) {
res.push(v);
}
} else {
res.push(v);
}
}
});
return res;
},
getValue: function () {
var res = [];
if (this.checked.isSelected()) {
this.tree.traverse(function (node) {
if (node.isLeaf()) {
res.push(node.get("data").value);
}
});
return res;
}
if (this.checked.isHalfSelected()) {
return this.selectValue;
}
return [];
}
});
BI.FileManagerFolderItem.EVENT_CHANGE = "FileManagerFolderItem.EVENT_CHANGE";
BI.shortcut("bi.file_manager_folder_item", BI.FileManagerFolderItem);/**
* 文件管理控件列表
*
* Created by GUY on 2015/12/11.
* @class BI.FileManagerList
* @extends BI.Widget
*/
BI.FileManagerList = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.FileManagerList.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-file-manager-list",
el: {},
items: []
})
},
_init: function () {
BI.FileManagerList.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.list = BI.createWidget({
type: "bi.select_list",
element: this,
items: o.items,
toolbar: {
type: "bi.multi_select_bar",
height: 40,
text: ""
},
el: {
type: "bi.list_pane",
el: BI.isWidget(o.el) ? o.el : BI.extend({
type: "bi.file_manager_button_group"
}, o.el)
}
});
this.list.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
},
setValue: function (v) {
this.list.setValue({
value: v
});
},
getValue: function () {
return this.list.getValue();
},
populate: function (items) {
this.list.populate(items);
this.list.setToolBarVisible(true);
}
});
BI.FileManagerList.EVENT_CHANGE = "FileManagerList.EVENT_CHANGE";
BI.shortcut("bi.file_manager_list", BI.FileManagerList);/**
* 文件管理导航按钮
*
* Created by GUY on 2015/12/11.
* @class BI.FileManagerNavButton
* @extends BI.Widget
*/
BI.FileManagerNavButton = BI.inherit(BI.Widget, {
_const: {
normal_color: "#ffffff",
select_color: "#f4f4f4"
},
_defaultConfig: function () {
return BI.extend(BI.FileManagerNavButton.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-file-manager-nav-button",
selected: false,
height: 40
})
},
_init: function () {
BI.FileManagerNavButton.superclass._init.apply(this, arguments);
var self = this, o = this.options, c = this._const;
this.button = BI.createWidget({
type: "bi.text_button",
cls: "file-manager-nav-button-text bi-card",
once: true,
selected: o.selected,
text: o.text,
title: o.text,
value: o.value,
height: o.height,
lgap: 20,
rgap: 10
});
this.button.on(BI.Controller.EVENT_CHANGE, function () {
arguments[2] = self;
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var svg = BI.createWidget({
type: "bi.svg",
cls: "file-manager-nav-button-triangle",
width: 15,
height: o.height
});
var path = svg.path("M0,0L15,20L0,40").attr({
"stroke": c.select_color,
"fill": o.selected ? c.select_color : c.normal_color
});
this.button.on(BI.TextButton.EVENT_CHANGE, function () {
if (this.isSelected()) {
path.attr("fill", c.select_color);
} else {
path.attr("fill", c.normal_color);
}
});
BI.createWidget({
type: "bi.default",
element: this,
items: [this.button]
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: svg,
right: -15,
top: 0,
bottom: 0
}]
})
},
isSelected: function () {
return this.button.isSelected();
},
setValue: function (v) {
this.button.setValue(v);
},
getValue: function () {
return this.button.getValue();
},
populate: function (items) {
}
});
BI.FileManagerNavButton.EVENT_CHANGE = "FileManagerNavButton.EVENT_CHANGE";
BI.shortcut("bi.file_manager_nav_button", BI.FileManagerNavButton);/**
* 文件管理导航
*
* Created by GUY on 2015/12/11.
* @class BI.FileManagerNav
* @extends BI.Widget
*/
BI.FileManagerNav = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.FileManagerNav.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-file-manager-nav bi-border-left",
height: 40,
items: []
})
},
_init: function () {
BI.FileManagerNav.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.tree = new BI.Tree();
this.refreshTreeData(o.items);
this.tree.getRoot().set("data", {
text: BI.i18nText("BI-Created_By_Me"),
value: BI.FileManagerNav.ROOT_CREATE_BY_ME,
id: BI.FileManagerNav.ROOT_CREATE_BY_ME
});
this.button_group = BI.createWidget({
type: "bi.button_group",
element: this,
items: [{
type: "bi.file_manager_nav_button",
text: BI.i18nText("BI-Created_By_Me"),
selected: true,
id: BI.FileManagerNav.ROOT_CREATE_BY_ME,
value: BI.FileManagerNav.ROOT_CREATE_BY_ME
}],
layouts: [{
type: "bi.horizontal"
}]
});
this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.button_group.on(BI.ButtonGroup.EVENT_CHANGE, function (value, obj) {
self.fireEvent(BI.FileManagerNav.EVENT_CHANGE, arguments);
});
},
_getAllParents: function (id) {
var node, res = [];
if (!id) {
node = this.tree.getRoot();
} else {
node = this.tree.search(id);
}
while (node.parent) {
res.push(node);
node = node.parent;
}
res.push(node);
return res.reverse();
},
_formatNodes: function (nodes) {
var res = [];
BI.each(nodes, function (i, node) {
res.push(BI.extend({
type: "bi.file_manager_nav_button",
id: node.id
}, node.get("data")));
});
BI.last(res).selected = true;
return res;
},
getValue: function () {
return this.button_group.getValue();
},
getId: function () {
var ids = [];
BI.each(this.button_group.getSelectedButtons(), function (i, btn) {
ids.push(btn.attr("id"));
});
return ids;
},
refreshTreeData: function(items){
this.tree.initTree(BI.Tree.transformToTreeFormat(items));
this.tree.getRoot().set("data", {
text: BI.i18nText("BI-Created_By_Me"),
value: BI.FileManagerNav.ROOT_CREATE_BY_ME,
id: BI.FileManagerNav.ROOT_CREATE_BY_ME
});
},
populate: function (node) {
var parents = BI.isNull(node) ? [this.tree.getRoot()] : this._getAllParents(node.id);
this.button_group.populate(this._formatNodes(parents));
}
});
BI.extend(BI.FileManagerNav, {
ROOT_CREATE_BY_ME: "-1"
});
BI.FileManagerNav.EVENT_CHANGE = "FileManagerNav.EVENT_CHANGE";
BI.shortcut("bi.file_manager_nav", BI.FileManagerNav);/**
* Created by windy on 2017/3/13.
* 数值微调器
*/
BI.FineTuningNumberEditor = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.FineTuningNumberEditor.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-fine-tuning-number-editor bi-border",
value: -1
})
},
_init: function () {
BI.FineTuningNumberEditor.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.editor = BI.createWidget({
type: "bi.sign_editor",
value: this._alertInEditorValue(o.value),
errorText: BI.i18nText("BI-Please_Input_Natural_Number"),
validationChecker: function(v){
return BI.isNaturalNumber(v) || self._alertOutEditorValue(v) === -1;
}
});
this.editor.on(BI.TextEditor.EVENT_CONFIRM, function(){
self._finetuning(0);
self.fireEvent(BI.FineTuningNumberEditor.EVENT_CONFIRM);
});
this.topBtn = BI.createWidget({
type: "bi.icon_button",
trigger: "lclick,",
cls: "column-pre-page-h-font top-button bi-border-left bi-border-bottom"
});
this.topBtn.on(BI.IconButton.EVENT_CHANGE, function(){
self._finetuning(1);
self.fireEvent(BI.FineTuningNumberEditor.EVENT_CONFIRM);
});
this.bottomBtn = BI.createWidget({
type: "bi.icon_button",
trigger: "lclick,",
cls: "column-next-page-h-font bottom-button bi-border-left bi-border-top"
});
this.bottomBtn.on(BI.IconButton.EVENT_CHANGE, function(){
self._finetuning(-1);
self.fireEvent(BI.FineTuningNumberEditor.EVENT_CONFIRM);
});
this._finetuning(0);
BI.createWidget({
type: "bi.htape",
element: this,
items: [this.editor, {
el: {
type: "bi.grid",
columns: 1,
rows: 2,
items: [{
column: 0,
row: 0,
el: this.topBtn
}, {
column: 0,
row: 1,
el: this.bottomBtn
}]
},
width: 30
}]
});
},
_alertOutEditorValue: function(v){
return v === BI.i18nText("BI-Basic_Auto") ? -1 : v;
},
_alertInEditorValue: function(v){
return BI.parseInt(v) === -1 ? BI.i18nText("BI-Basic_Auto") : v;
},
//微调
_finetuning: function(add){
var v = BI.parseInt(this._alertOutEditorValue(this.editor.getValue()));
this.editor.setValue(this._alertInEditorValue(v + add));
this.bottomBtn.setEnable((v + add) > -1);
},
getValue: function () {
var v = this.editor.getValue();
return this._alertOutEditorValue(v);
},
setValue: function (v) {
this.editor.setValue(this._alertInEditorValue(v));
this._finetuning(0);
}
});
BI.FineTuningNumberEditor.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.shortcut("bi.fine_tuning_number_editor", BI.FineTuningNumberEditor);/**
* 交互行为布局
*
*
* Created by GUY on 2016/7/23.
* @class BI.InteractiveArrangement
* @extends BI.Widget
*/
BI.InteractiveArrangement = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.InteractiveArrangement.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-interactive-arrangement",
resizable: true,
isNeedReLayout: true,
isNeedResizeContainer: true,
layoutType: BI.Arrangement.LAYOUT_TYPE.FREE,
items: []
});
},
_init: function () {
BI.InteractiveArrangement.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.arrangement = BI.createWidget({
type: "bi.adaptive_arrangement",
element: this,
resizable: o.resizable,
isNeedReLayout: o.isNeedReLayout,
isNeedResizeContainer: o.isNeedResizeContainer,
layoutType: o.layoutType,
items: o.items
});
this.arrangement.on(BI.AdaptiveArrangement.EVENT_SCROLL, function () {
self.fireEvent(BI.InteractiveArrangement.EVENT_SCROLL, arguments);
});
this.arrangement.on(BI.AdaptiveArrangement.EVENT_RESIZE, function () {
self.fireEvent(BI.InteractiveArrangement.EVENT_RESIZE, arguments);
});
this.arrangement.on(BI.AdaptiveArrangement.EVENT_ELEMENT_RESIZE, function (id, size) {
var p = self._getRegionClientPosition(id);
self.draw({
left: p.left,
top: p.top
}, size, id);
});
this.arrangement.on(BI.AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE, function (id, size) {
self.stopDraw();
self.setRegionSize(id, size);
});
this.tags = [];
},
_isEqual: function (num1, num2) {
return this.arrangement._isEqual(num1, num2);
},
_getScrollOffset: function () {
return this.arrangement._getScrollOffset();
},
_positionAt: function (position, regions) {
var self = this;
regions = regions || this.getAllRegions();
var left = [], center = [], right = [], top = [], middle = [], bottom = [];
BI.each(regions, function (i, region) {
var client = self._getRegionClientPosition(region.id);
if (Math.abs(client.left - position.left) <= 3) {
left.push(region);
}
if (Math.abs(client.left + client.width / 2 - position.left) <= 3) {
center.push(region);
}
if (Math.abs(client.left + client.width - position.left) <= 3) {
right.push(region);
}
if (Math.abs(client.top - position.top) <= 3) {
top.push(region);
}
if (Math.abs(client.top + client.height / 2 - position.top) <= 3) {
middle.push(region);
}
if (Math.abs(client.top + client.height - position.top) <= 3) {
bottom.push(region);
}
});
return {
left: left,
center: center,
right: right,
top: top,
middle: middle,
bottom: bottom
}
},
_getRegionClientPosition: function (name) {
var region = this.getRegionByName(name);
var offset = this.arrangement._getScrollOffset();
return {
top: region.top - offset.top,
left: region.left - offset.left,
width: region.width,
height: region.height,
id: region.id
}
},
_vAlign: function (position, regions) {
var self = this;
var vs = this._positionAt(position, regions);
var positions = [];
var l;
if (vs.left.length > 0) {
l = this._getRegionClientPosition(vs.left[0].id).left;
} else if (vs.right.length > 0) {
var temp = this._getRegionClientPosition(vs.right[0].id);
l = temp.left + temp.width;
}
var rs = vs.left.concat(vs.right);
BI.each(rs, function (i, region) {
var p = self._getRegionClientPosition(region.id);
if (self._isEqual(p.left, l) || self._isEqual(p.left + p.width, l)) {
var topPoint = {
top: p.top + p.height / 2,
left: l
};
positions.push({
id: region.id,
start: topPoint,
end: {
left: l,
top: position.top
}
});
}
});
return positions;
},
_leftAlign: function (position, size, regions) {
var self = this;
return this._vAlign({
left: position.left,
top: position.top + size.height / 2
}, regions);
},
_rightAlign: function (position, size, regions) {
var self = this;
return this._vAlign({
left: position.left + size.width,
top: position.top + size.height / 2
}, regions);
},
_hAlign: function (position, regions) {
var self = this;
var hs = this._positionAt(position, regions);
var positions = [];
var t;
if (hs.top.length > 0) {
var temp = this._getRegionClientPosition(hs.top[0].id);
t = temp.top;
} else if (hs.bottom.length > 0) {
var temp = this._getRegionClientPosition(hs.bottom[0].id);
t = temp.top + temp.height;
}
var rs = hs.top.concat(hs.bottom);
BI.each(rs, function (i, region) {
var p = self._getRegionClientPosition(region.id);
if (self._isEqual(p.top, t) || self._isEqual(p.top + p.height, t)) {
var leftPoint = {
top: t,
left: p.left + p.width / 2
};
positions.push({
id: p.id,
start: leftPoint,
end: {
left: position.left,
top: t
}
});
}
});
return positions;
},
_topAlign: function (position, size, regions) {
var self = this;
return this._hAlign({
left: position.left + size.width / 2,
top: position.top
}, regions);
},
_bottomAlign: function (position, size, regions) {
var self = this;
return this._hAlign({
left: position.left + size.width / 2,
top: position.top + size.height
}, regions);
},
_centerAlign: function (position, size, regions) {
var self = this;
var cs = this._positionAt({
left: position.left + size.width / 2,
top: position.top + size.height / 2
}, regions);
var positions = [];
var l;
if (cs.center.length > 0) {
var temp = this._getRegionClientPosition(cs.center[0].id);
l = temp.left + temp.width / 2;
}
BI.each(cs.center, function (i, region) {
var p = self._getRegionClientPosition(region.id);
if (self._isEqual(p.left + p.width / 2, l)) {
var topPoint = {
top: p.top + p.height / 2,
left: p.left + p.width / 2
};
positions.push({
id: p.id,
start: topPoint,
end: {
left: l,
top: position.top + size.height / 2
}
});
}
});
return positions;
},
_middleAlign: function (position, size, regions) {
var self = this;
var cs = this._positionAt({
left: position.left + size.width / 2,
top: position.top + size.height / 2
}, regions);
var positions = [];
var t;
if (cs.middle.length > 0) {
var temp = this._getRegionClientPosition(cs.middle[0].id);
t = temp.top + temp.height / 2;
}
BI.each(cs.middle, function (i, region) {
var p = self._getRegionClientPosition(region.id);
if (self._isEqual(p.top + p.height / 2, t)) {
var topPoint = {
top: p.top + p.height / 2,
left: p.left + p.width / 2
};
positions.push({
id: p.id,
start: topPoint,
end: {
left: position.left + size.width / 2,
top: t
}
});
}
});
return positions;
},
_drawOneTag: function (start, end) {
var s = BI.createWidget({
type: "bi.icon_button",
//invisible: true,
width: 13,
height: 13,
cls: "drag-tag-font interactive-arrangement-dragtag-icon"
});
var e = BI.createWidget({
type: "bi.icon_button",
//invisible: true,
width: 13,
height: 13,
cls: "drag-tag-font interactive-arrangement-dragtag-icon"
});
if (this._isEqual(start.left, end.left)) {
var line = BI.createWidget({
type: "bi.layout",
//invisible: true,
cls: "interactive-arrangement-dragtag-line",
width: 1,
height: Math.abs(start.top - end.top)
});
} else {
var line = BI.createWidget({
type: "bi.layout",
//invisible: true,
cls: "interactive-arrangement-dragtag-line",
height: 1,
width: Math.abs(start.left - end.left)
});
}
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: s,
left: start.left - 6,
top: start.top - 7
}, {
el: e,
left: end.left - 6,
top: end.top - 7
}, {
el: line,
left: Math.min(start.left, end.left),
top: Math.min(start.top, end.top)
}]
});
this.tags.push(s);
this.tags.push(e);
this.tags.push(line);
},
stopDraw: function () {
BI.each(this.tags, function (i, w) {
w.destroy();
});
this.tags = [];
},
_getRegionExcept: function (name, regions) {
var other = [];
BI.each(regions || this.getAllRegions(), function (i, region) {
if (!(name && region.id === name)) {
other.push(region);
}
});
return other;
},
getClientWidth: function () {
return this.arrangement.getClientWidth();
},
getClientHeight: function () {
return this.arrangement.getClientHeight();
},
getPosition: function (name, position, size) {
var regions = this.getAllRegions();
var me;
if (name) {
me = this._getRegionClientPosition(name);
}
var other = this._getRegionExcept(name, regions);
position = position || {
left: me.left,
top: me.top
};
size = size || {
width: me.width,
height: me.height
};
var left = this._leftAlign(position, size, other);
var right = this._rightAlign(position, size, other);
var top = this._topAlign(position, size, other, other);
var bottom = this._bottomAlign(position, size, other);
var center = this._centerAlign(position, size, other);
var middle = this._middleAlign(position, size, other);
BI.each(center, function (i, pos) {
position.left = pos.end.left - size.width / 2;
});
BI.each(right, function (i, pos) {
position.left = pos.end.left - size.width;
});
BI.each(left, function (i, pos) {
position.left = pos.end.left;
});
BI.each(middle, function (i, pos) {
position.top = pos.end.top - size.height / 2;
});
BI.each(bottom, function (i, pos) {
position.top = pos.end.top - size.height;
});
BI.each(top, function (i, pos) {
position.top = pos.end.top;
});
return position;
},
//position不动 变size
getSize: function (name, position, size) {
var regions = this.getAllRegions();
var me;
if (name) {
me = this._getRegionClientPosition(name);
}
var other = this._getRegionExcept(name, regions);
position = position || {
left: me.left,
top: me.top
};
size = size || {
width: me.width,
height: me.height
};
var left = this._leftAlign(position, size, other);
var right = this._rightAlign(position, size, other);
var top = this._topAlign(position, size, other, other);
var bottom = this._bottomAlign(position, size, other);
var center = this._centerAlign(position, size, other);
var middle = this._middleAlign(position, size, other);
BI.each(center, function (i, pos) {
size.width = (pos.end.left - position.left) * 2;
});
BI.each(right, function (i, pos) {
size.width = pos.end.left - position.left;
});
BI.each(left, function (i, pos) {
});
BI.each(middle, function (i, pos) {
size.height = (pos.end.top - position.top) * 2;
});
BI.each(bottom, function (i, pos) {
size.height = pos.end.top - position.top;
});
BI.each(top, function (i, pos) {
});
return size;
},
draw: function (position, size, name) {
var self = this;
this.stopDraw();
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
case BI.Arrangement.LAYOUT_TYPE.FREE:
var other = this._getRegionExcept(name);
var left = this._leftAlign(position, size, other);
var right = this._rightAlign(position, size, other);
var top = this._topAlign(position, size, other);
var bottom = this._bottomAlign(position, size, other);
var center = this._centerAlign(position, size, other);
var middle = this._middleAlign(position, size, other);
BI.each(center, function (i, pos) {
self._drawOneTag(pos.start, pos.end);
});
BI.each(right, function (i, pos) {
self._drawOneTag(pos.start, pos.end);
});
BI.each(left, function (i, pos) {
self._drawOneTag(pos.start, pos.end);
});
BI.each(middle, function (i, pos) {
self._drawOneTag(pos.start, pos.end);
});
BI.each(bottom, function (i, pos) {
self._drawOneTag(pos.start, pos.end);
});
BI.each(top, function (i, pos) {
self._drawOneTag(pos.start, pos.end);
});
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
break;
}
},
getDirectRelativeRegions: function (name, direction) {
return this.arrangement.getDirectRelativeRegions(name, direction);
},
addRegion: function (region, position) {
this.stopDraw();
return this.arrangement.addRegion(region, position);
},
deleteRegion: function (name) {
return this.arrangement.deleteRegion(name);
},
setRegionSize: function (name, size) {
size = this.getSize(name, null, size);
return this.arrangement.setRegionSize(name, size);
},
setPosition: function (position, size) {
var self = this;
this.stopDraw();
if (position.left > 0 && position.top > 0) {
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
position = this.getPosition(null, position, size);
this.draw(position, size);
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
break;
}
}
var at = this.arrangement.setPosition(position, size);
return at;
},
setRegionPosition: function (name, position) {
if (position.left > 0 && position.top > 0) {
switch (this.getLayoutType()) {
case BI.Arrangement.LAYOUT_TYPE.ADAPTIVE:
break;
case BI.Arrangement.LAYOUT_TYPE.FREE:
position = this.getPosition(name, position);
break;
case BI.Arrangement.LAYOUT_TYPE.GRID:
break;
}
}
return this.arrangement.setRegionPosition(name, position);
},
scrollTo: function (scroll) {
this.arrangement.scrollTo(scroll);
},
zoom: function (ratio) {
this.arrangement.zoom(ratio);
},
resize: function () {
return this.arrangement.resize();
},
relayout: function () {
return this.arrangement.relayout();
},
setLayoutType: function (type) {
this.arrangement.setLayoutType(type);
},
getLayoutType: function () {
return this.arrangement.getLayoutType();
},
getLayoutRatio: function () {
return this.arrangement.getLayoutRatio();
},
getHelper: function () {
return this.arrangement.getHelper();
},
getRegionByName: function (name) {
return this.arrangement.getRegionByName(name);
},
getAllRegions: function () {
return this.arrangement.getAllRegions();
},
revoke: function () {
return this.arrangement.revoke();
},
populate: function (items) {
var self = this;
this.arrangement.populate(items);
}
});
BI.InteractiveArrangement.EVENT_RESIZE = "InteractiveArrangement.EVENT_RESIZE";
BI.InteractiveArrangement.EVENT_SCROLL = "InteractiveArrangement.EVENT_SCROLL";
BI.shortcut('bi.interactive_arrangement', BI.InteractiveArrangement);/**
* 月份下拉框
*
* Created by GUY on 2015/8/28.
* @class BI.MonthCombo
* @extends BI.Trigger
*/
BI.MonthCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MonthCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-month-combo",
behaviors: {},
height: 25
});
},
_init: function () {
BI.MonthCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget({
type: "bi.month_trigger"
});
this.trigger.on(BI.MonthTrigger.EVENT_CONFIRM, function (v) {
if (this.getKey() && this.getKey() !== self.storeValue) {
self.setValue(this.getValue());
} else if (!this.getKey()) {
self.setValue();
}
self.fireEvent(BI.MonthCombo.EVENT_CONFIRM);
});
this.trigger.on(BI.MonthTrigger.EVENT_FOCUS, function () {
self.storeValue = this.getKey();
});
this.trigger.on(BI.MonthTrigger.EVENT_START, function () {
self.combo.hideView();
});
this.trigger.on(BI.MonthTrigger.EVENT_STOP, function () {
if (!self.combo.isViewVisible()) {
self.combo.showView();
}
});
this.trigger.on(BI.MonthTrigger.EVENT_CHANGE, function () {
self.combo.isViewVisible() && self.combo.hideView();
});
this.popup = BI.createWidget({
type: "bi.month_popup",
behaviors: o.behaviors
});
this.popup.on(BI.MonthPopup.EVENT_CHANGE, function () {
self.setValue(self.popup.getValue());
self.combo.hideView();
self.fireEvent(BI.MonthCombo.EVENT_CONFIRM);
});
this.combo = BI.createWidget({
type: "bi.combo",
element: this,
isNeedAdjustHeight: false,
isNeedAdjustWidth: false,
el: this.trigger,
popup: {
minWidth: 85,
el: this.popup
}
});
this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.MonthCombo.EVENT_BEFORE_POPUPVIEW);
});
},
setValue: function (v) {
this.trigger.setValue(v);
this.popup.setValue(v);
},
getValue: function () {
return this.popup.getValue();
}
});
BI.MonthCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.MonthCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.shortcut('bi.month_combo', BI.MonthCombo);/**
* 月份展示面板
*
* Created by GUY on 2015/9/2.
* @class BI.MonthPopup
* @extends BI.Trigger
*/
BI.MonthPopup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MonthPopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-month-popup",
behaviors: {}
});
},
_init: function () {
BI.MonthPopup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
//纵向排列月
var month = [0, 6, 1, 7, 2, 8, 3, 9, 4, 10, 5, 11];
var items = [];
items.push(month.slice(0, 2));
items.push(month.slice(2, 4));
items.push(month.slice(4, 6));
items.push(month.slice(6, 8));
items.push(month.slice(8, 10));
items.push(month.slice(10, 12));
items = BI.map(items, function (i, item) {
return BI.map(item, function (j, td) {
return {
type: "bi.text_item",
cls: "bi-list-item-active",
textAlign: "center",
whiteSpace: "nowrap",
once: false,
forceSelected: true,
height: 23,
width: 38,
value: td,
text: td + 1
};
});
});
this.month = BI.createWidget({
type: "bi.button_group",
element: this,
behaviors: o.behaviors,
items: BI.createItems(items, {}),
layouts: [BI.LogicFactory.createLogic("table", BI.extend({
dynamic: true
}, {
columns: 2,
rows: 6,
columnSize: [1 / 2, 1 / 2],
rowSize: 25
})), {
type: "bi.center_adapt",
vgap: 1,
hgap: 2
}]
});
this.month.on(BI.Controller.EVENT_CHANGE, function (type) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
if (type === BI.Events.CLICK) {
self.fireEvent(BI.MonthPopup.EVENT_CHANGE);
}
})
},
getValue: function () {
return this.month.getValue()[0];
},
setValue: function (v) {
this.month.setValue([v]);
}
});
BI.MonthPopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.month_popup", BI.MonthPopup);/**
* 月份trigger
*
* Created by GUY on 2015/8/21.
* @class BI.MonthTrigger
* @extends BI.Trigger
*/
BI.MonthTrigger = BI.inherit(BI.Trigger, {
_const: {
hgap: 4,
vgap: 2,
triggerWidth: 25,
errorText: BI.i18nText("BI-Month_Trigger_Error_Text")
},
_defaultConfig: function () {
return BI.extend(BI.MonthTrigger.superclass._defaultConfig.apply(this, arguments), {
extraCls: "bi-month-trigger bi-border",
height: 25
});
},
_init: function () {
BI.MonthTrigger.superclass._init.apply(this, arguments);
var self = this, o = this.options, c = this._const;
this.editor = BI.createWidget({
type: "bi.sign_editor",
height: o.height,
validationChecker: function (v) {
return v === "" || (BI.isPositiveInteger(v) && v >= 1 && v <= 12);
},
quitChecker: function (v) {
return false;
},
hgap: c.hgap,
vgap: c.vgap,
allowBlank: true,
errorText: c.errorText
});
this.editor.on(BI.SignEditor.EVENT_FOCUS, function () {
self.fireEvent(BI.MonthTrigger.EVENT_FOCUS);
});
this.editor.on(BI.SignEditor.EVENT_CHANGE, function () {
self.fireEvent(BI.MonthTrigger.EVENT_CHANGE);
});
this.editor.on(BI.SignEditor.EVENT_CONFIRM, function () {
var value = self.editor.getValue();
if (BI.isNotNull(value)) {
self.editor.setValue(value);
self.editor.setTitle(value);
}
self.fireEvent(BI.MonthTrigger.EVENT_CONFIRM);
});
this.editor.on(BI.SignEditor.EVENT_SPACE, function () {
if (self.editor.isValid()) {
self.editor.blur();
}
});
this.editor.on(BI.SignEditor.EVENT_START, function () {
self.fireEvent(BI.MonthTrigger.EVENT_START);
});
this.editor.on(BI.SignEditor.EVENT_STOP, function () {
self.fireEvent(BI.MonthTrigger.EVENT_STOP);
});
BI.createWidget({
element: this,
type: 'bi.htape',
items: [
{
el: this.editor
}, {
el: {
type: "bi.text_button",
text: BI.i18nText("BI-Multi_Date_Month"),
baseCls: "bi-trigger-month-text",
width: c.triggerWidth
},
width: c.triggerWidth
}, {
el: {
type: "bi.trigger_icon_button",
width: c.triggerWidth
},
width: c.triggerWidth
}
]
});
},
setValue: function (v) {
if(BI.isNotNull(v)){
this.editor.setState(v + 1);
this.editor.setValue(v + 1);
this.editor.setTitle(v + 1);
return;
}
this.editor.setState();
this.editor.setValue();
this.editor.setTitle();
},
getKey: function () {
return this.editor.getValue() | 0;
},
getValue: function () {
return this.editor.getValue() - 1;
}
});
BI.MonthTrigger.EVENT_FOCUS = "EVENT_FOCUS";
BI.MonthTrigger.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.MonthTrigger.EVENT_START = "EVENT_START";
BI.MonthTrigger.EVENT_STOP = "EVENT_STOP";
BI.MonthTrigger.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.month_trigger", BI.MonthTrigger);/**
* @class BI.MultiLayerSelectTreeCombo
* @extends BI.Widget
*/
BI.MultiLayerSelectTreeCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSelectTreeCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multilayer_select_tree-combo",
isDefaultInit: false,
height: 30,
text: "",
items: []
});
},
_init: function () {
BI.MultiLayerSelectTreeCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget({
type: "bi.single_tree_trigger",
text: o.text,
height: o.height,
items: o.items
});
this.popup = BI.createWidget({
type: "bi.multilayer_select_tree_popup",
isDefaultInit: o.isDefaultInit,
items: o.items
});
this.combo = BI.createWidget({
type: "bi.combo",
element: this,
adjustLength: 2,
el: this.trigger,
popup: {
el: this.popup
}
});
this.combo.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.popup.on(BI.MultiLayerSelectTreePopup.EVENT_CHANGE, function () {
self.setValue(self.popup.getValue());
self.combo.hideView();
self.fireEvent(BI.MultiLayerSelectTreeCombo.EVENT_CHANGE);
});
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.trigger.setValue(v);
this.popup.setValue(v);
},
getValue: function () {
return this.popup.getValue();
},
populate: function (items) {
this.combo.populate(items);
}
});
BI.MultiLayerSelectTreeCombo.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.multilayer_select_tree_combo", BI.MultiLayerSelectTreeCombo);/**
* guy
* 二级树
* @class BI.MultiLayerSelectLevelTree
* @extends BI.Select
*/
BI.MultiLayerSelectLevelTree = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSelectLevelTree.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multilayer-select-level-tree",
isDefaultInit: false,
items: [],
itemsCreator: BI.emptyFn
})
},
_init: function () {
BI.MultiLayerSelectLevelTree.superclass._init.apply(this, arguments);
this.initTree(this.options.items);
},
_formatItems: function (nodes, layer) {
var self = this;
BI.each(nodes, function (i, node) {
var extend = {};
node.layer = layer;
if (!BI.isKey(node.id)) {
node.id = BI.UUID();
}
if (node.isParent === true || BI.isNotEmptyArray(node.children)) {
switch (i) {
case 0 :
extend.type = "bi.multilayer_select_tree_first_plus_group_node";
break;
case nodes.length - 1 :
extend.type = "bi.multilayer_select_tree_last_plus_group_node";
break;
default :
extend.type = "bi.multilayer_select_tree_mid_plus_group_node";
break;
}
BI.defaults(node, extend);
self._formatItems(node.children, layer + 1);
} else {
switch (i) {
case nodes.length - 1:
extend.type = "bi.multilayer_single_tree_last_tree_leaf_item";
break;
default :
extend.type = "bi.multilayer_single_tree_mid_tree_leaf_item";
}
BI.defaults(node, extend);
}
});
return nodes;
},
_assertId: function (sNodes) {
BI.each(sNodes, function (i, node) {
node.id = node.id || BI.UUID();
});
},
//构造树结构,
initTree: function (nodes) {
var self = this, o = this.options;
this.empty();
this._assertId(nodes);
this.tree = BI.createWidget({
type: "bi.custom_tree",
element: this,
expander: {
type: "bi.select_tree_expander",
isDefaultInit: o.isDefaultInit,
el: {},
popup: {
type: "bi.custom_tree"
}
},
items: this._formatItems(BI.Tree.transformToTreeFormat(nodes), 0),
itemsCreator: o.itemsCreator,
el: {
type: "bi.button_tree",
chooseType: BI.Selection.Single,
layouts: [{
type: "bi.vertical"
}]
}
});
this.tree.on(BI.Controller.EVENT_CHANGE, function (type) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
if (type === BI.Events.CLICK) {
self.fireEvent(BI.MultiLayerSelectLevelTree.EVENT_CHANGE, arguments);
}
})
},
populate: function (nodes) {
this.tree.populate(this._formatItems(BI.Tree.transformToTreeFormat(nodes), 0));
},
setValue: function (v) {
this.tree.setValue(v);
},
getValue: function () {
return this.tree.getValue();
},
getAllLeaves: function () {
return this.tree.getAllLeaves();
},
getNodeById: function (id) {
return this.tree.getNodeById(id);
},
getNodeByValue: function (id) {
return this.tree.getNodeByValue(id);
}
});
BI.MultiLayerSelectLevelTree.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.multilayer_select_level_tree", BI.MultiLayerSelectLevelTree);/**
* Created by GUY on 2016/1/26.
*
* @class BI.MultiLayerSelectTreePopup
* @extends BI.Pane
*/
BI.MultiLayerSelectTreePopup = BI.inherit(BI.Pane, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSelectTreePopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multilayer-select-tree-popup",
tipText: BI.i18nText("BI-No_Selected_Item"),
isDefaultInit: false,
itemsCreator: BI.emptyFn,
items: []
});
},
_init: function () {
BI.MultiLayerSelectTreePopup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.tree = BI.createWidget({
type: 'bi.multilayer_select_level_tree',
isDefaultInit: o.isDefaultInit,
items: o.items,
itemsCreator: o.itemsCreator
});
BI.createWidget({
type: "bi.vertical",
scrolly: false,
scrollable: true,
element: this,
items: [this.tree]
});
this.tree.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.tree.on(BI.MultiLayerSelectLevelTree.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiLayerSelectTreePopup.EVENT_CHANGE);
});
this.check();
},
getValue: function () {
return this.tree.getValue();
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.tree.setValue(v);
},
populate: function (items) {
BI.MultiLayerSelectTreePopup.superclass.populate.apply(this, arguments);
this.tree.populate(items);
}
});
BI.MultiLayerSelectTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.multilayer_select_tree_popup", BI.MultiLayerSelectTreePopup);/**
* 加号表示的组节点
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSelectTreeFirstPlusGroupNode
* @extends BI.NodeButton
*/
BI.MultiLayerSelectTreeFirstPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.MultiLayerSelectTreeFirstPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
extraCls: "bi-multilayer-select-tree-first-plus-group-node bi-list-item-active",
layer: 0,//第几层级
id: "",
pId: "",
readonly: true,
open: false,
height: 25
})
},
_init: function () {
BI.MultiLayerSelectTreeFirstPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.node = BI.createWidget({
type: "bi.select_tree_first_plus_group_node",
stopPropagation: true,
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
open: o.open,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
self.setSelected(self.isSelected());
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.node);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
isOnce: function () {
return true;
},
doRedMark: function () {
this.node.doRedMark.apply(this.node, arguments);
},
unRedMark: function () {
this.node.unRedMark.apply(this.node, arguments);
},
isSelected: function () {
return this.node.isSelected();
},
setSelected: function (b) {
BI.MultiLayerSelectTreeFirstPlusGroupNode.superclass.setSelected.apply(this, arguments);
this.node.setSelected(b);
},
doClick: function () {
BI.NodeButton.superclass.doClick.apply(this, arguments);
this.node.setSelected(this.isSelected());
},
setOpened: function (v) {
BI.MultiLayerSelectTreeFirstPlusGroupNode.superclass.setOpened.apply(this, arguments);
this.node.setOpened(v);
}
});
BI.shortcut("bi.multilayer_select_tree_first_plus_group_node", BI.MultiLayerSelectTreeFirstPlusGroupNode);/**
* 加号表示的组节点
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSelectTreeLastPlusGroupNode
* @extends BI.NodeButton
*/
BI.MultiLayerSelectTreeLastPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.MultiLayerSelectTreeLastPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
extraCls: "bi-multilayer-select-tree-last-plus-group-node bi-list-item-active",
layer: 0,//第几层级
id: "",
pId: "",
readonly: true,
open: false,
height: 25
})
},
_init: function () {
BI.MultiLayerSelectTreeLastPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.node = BI.createWidget({
type: "bi.select_tree_last_plus_group_node",
stopPropagation: true,
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
open: o.open,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
self.setSelected(self.isSelected());
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.node);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
doRedMark: function () {
this.node.doRedMark.apply(this.node, arguments);
},
unRedMark: function () {
this.node.unRedMark.apply(this.node, arguments);
},
isSelected: function () {
return this.node.isSelected();
},
setSelected: function (b) {
BI.MultiLayerSelectTreeLastPlusGroupNode.superclass.setSelected.apply(this, arguments);
this.node.setSelected(b);
},
doClick: function () {
BI.MultiLayerSelectTreeLastPlusGroupNode.superclass.doClick.apply(this, arguments);
this.node.setSelected(this.isSelected());
},
setOpened: function (v) {
BI.MultiLayerSelectTreeLastPlusGroupNode.superclass.setOpened.apply(this, arguments);
this.node.setOpened(v);
}
});
BI.shortcut("bi.multilayer_select_tree_last_plus_group_node", BI.MultiLayerSelectTreeLastPlusGroupNode);/**
* 加号表示的组节点
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSelectTreeMidPlusGroupNode
* @extends BI.NodeButton
*/
BI.MultiLayerSelectTreeMidPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.MultiLayerSelectTreeMidPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
extraCls: "bi-multilayer-select-tree-mid-plus-group-node bi-list-item-active",
layer: 0,//第几层级
id: "",
pId: "",
readonly: true,
open: false,
height: 25
})
},
_init: function () {
BI.MultiLayerSelectTreeMidPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.node = BI.createWidget({
type: "bi.select_tree_mid_plus_group_node",
stopPropagation: true,
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
open: o.open,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
self.setSelected(self.isSelected());
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.node);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
doRedMark: function () {
this.node.doRedMark.apply(this.node, arguments);
},
unRedMark: function () {
this.node.unRedMark.apply(this.node, arguments);
},
isSelected: function () {
return this.node.isSelected();
},
setSelected: function (b) {
BI.MultiLayerSelectTreeMidPlusGroupNode.superclass.setSelected.apply(this, arguments);
this.node.setSelected(b);
},
doClick: function () {
BI.MultiLayerSelectTreeMidPlusGroupNode.superclass.doClick.apply(this, arguments);
this.node.setSelected(this.isSelected());
},
setOpened: function (v) {
BI.MultiLayerSelectTreeMidPlusGroupNode.superclass.setOpened.apply(this, arguments);
this.node.setOpened(v);
}
});
BI.shortcut("bi.multilayer_select_tree_mid_plus_group_node", BI.MultiLayerSelectTreeMidPlusGroupNode);/**
* 多层级下拉单选树
* Created by GUY on 2016/1/26.
*
* @class BI.MultiLayerSingleTreeCombo
* @extends BI.Widget
*/
BI.MultiLayerSingleTreeCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSingleTreeCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multilayer-singletree-combo",
isDefaultInit: false,
height: 30,
text: "",
itemsCreator: BI.emptyFn,
items: []
});
},
_init: function () {
BI.MultiLayerSingleTreeCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget({
type: "bi.single_tree_trigger",
text: o.text,
height: o.height,
items: o.items
});
this.popup = BI.createWidget({
type: "bi.multilayer_single_tree_popup",
isDefaultInit: o.isDefaultInit,
items: o.items
});
this.combo = BI.createWidget({
type: "bi.combo",
element: this,
adjustLength: 2,
el: this.trigger,
popup: {
el: this.popup
}
});
this.combo.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.popup.on(BI.MultiLayerSingleTreePopup.EVENT_CHANGE, function () {
self.setValue(self.popup.getValue());
self.combo.hideView();
self.fireEvent(BI.MultiLayerSingleTreeCombo.EVENT_CHANGE);
});
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.trigger.setValue(v);
this.popup.setValue(v);
},
getValue: function () {
return this.popup.getValue();
},
populate: function (items) {
this.combo.populate(items);
}
});
BI.MultiLayerSingleTreeCombo.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.multilayer_single_tree_combo", BI.MultiLayerSingleTreeCombo);/**
* guy
* 二级树
* @class BI.MultiLayerSingleLevelTree
* @extends BI.Single
*/
BI.MultiLayerSingleLevelTree = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSingleLevelTree.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multilayer-single-level-tree",
isDefaultInit: false,
items: [],
itemsCreator: BI.emptyFn
})
},
_init: function () {
BI.MultiLayerSingleLevelTree.superclass._init.apply(this, arguments);
this.initTree(this.options.items);
},
_formatItems: function (nodes, layer) {
var self = this;
BI.each(nodes, function (i, node) {
var extend = {};
node.layer = layer;
if (!BI.isKey(node.id)) {
node.id = BI.UUID();
}
if (node.isParent === true || BI.isNotEmptyArray(node.children)) {
switch (i) {
case 0 :
extend.type = "bi.multilayer_single_tree_first_plus_group_node";
break;
case nodes.length - 1 :
extend.type = "bi.multilayer_single_tree_last_plus_group_node";
break;
default :
extend.type = "bi.multilayer_single_tree_mid_plus_group_node";
break;
}
BI.defaults(node, extend);
self._formatItems(node.children, layer + 1);
} else {
switch (i) {
case nodes.length - 1:
extend.type = "bi.multilayer_single_tree_last_tree_leaf_item";
break;
default :
extend.type = "bi.multilayer_single_tree_mid_tree_leaf_item";
}
BI.defaults(node, extend);
}
});
return nodes;
},
_assertId: function (sNodes) {
BI.each(sNodes, function (i, node) {
node.id = node.id || BI.UUID();
});
},
//构造树结构,
initTree: function (nodes) {
var self = this, o = this.options;
this.empty();
this._assertId(nodes);
this.tree = BI.createWidget({
type: "bi.custom_tree",
element: this,
expander: {
isDefaultInit: o.isDefaultInit,
el: {},
popup: {
type: "bi.custom_tree"
}
},
items: this._formatItems(BI.Tree.transformToTreeFormat(nodes), 0),
itemsCreator: function (op, callback) {
o.itemsCreator(op, function (items) {
callback(BI.Tree.transformToTreeFormat(items), 0)
})
},
el: {
type: "bi.button_tree",
chooseType: BI.Selection.Single,
layouts: [{
type: "bi.vertical"
}]
}
});
this.tree.on(BI.Controller.EVENT_CHANGE, function (type, v) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
if (type === BI.Events.CLICK) {
self.fireEvent(BI.MultiLayerSingleLevelTree.EVENT_CHANGE, v);
}
})
},
populate: function (nodes) {
this.tree.populate(this._formatItems(BI.Tree.transformToTreeFormat(nodes), 0));
},
setValue: function (v) {
this.tree.setValue(v);
},
getValue: function () {
return this.tree.getValue();
},
getAllLeaves: function () {
return this.tree.getAllLeaves();
},
getNodeById: function (id) {
return this.tree.getNodeById(id);
},
getNodeByValue: function (id) {
return this.tree.getNodeByValue(id);
}
});
BI.MultiLayerSingleLevelTree.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.multilayer_single_level_tree", BI.MultiLayerSingleLevelTree);
/**
* Created by GUY on 2016/1/26.
*
* @class BI.MultiLayerSingleTreePopup
* @extends BI.Pane
*/
BI.MultiLayerSingleTreePopup = BI.inherit(BI.Pane, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSingleTreePopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multilayer-singletree-popup",
tipText: BI.i18nText("BI-No_Selected_Item"),
isDefaultInit: false,
itemsCreator: BI.emptyFn,
items: []
});
},
_init: function () {
BI.MultiLayerSingleTreePopup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.tree = BI.createWidget({
type: 'bi.multilayer_single_level_tree',
isDefaultInit: o.isDefaultInit,
items: o.items,
itemsCreator: o.itemsCreator
});
BI.createWidget({
type: "bi.vertical",
scrolly: false,
scrollable: true,
element: this,
items: [this.tree]
});
this.tree.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.tree.on(BI.MultiLayerSingleLevelTree.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiLayerSingleTreePopup.EVENT_CHANGE);
});
this.check();
},
getValue: function () {
return this.tree.getValue();
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.tree.setValue(v);
},
populate: function (items) {
BI.MultiLayerSingleTreePopup.superclass.populate.apply(this, arguments);
this.tree.populate(items);
}
});
BI.MultiLayerSingleTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.multilayer_single_tree_popup", BI.MultiLayerSingleTreePopup);/**
* 加号表示的组节点
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSingleTreeFirstPlusGroupNode
* @extends BI.NodeButton
*/
BI.MultiLayerSingleTreeFirstPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.MultiLayerSingleTreeFirstPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
extraCls: "bi-multilayer-single-tree-first-plus-group-node bi-list-item",
layer: 0,//第几层级
id: "",
pId: "",
open: false,
height: 25
})
},
_init: function () {
BI.MultiLayerSingleTreeFirstPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.node = BI.createWidget({
type: "bi.first_plus_group_node",
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
open: o.open,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {//本身实现click功能
return;
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.node);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
doRedMark: function () {
this.node.doRedMark.apply(this.node, arguments);
},
unRedMark: function () {
this.node.unRedMark.apply(this.node, arguments);
},
doClick: function () {
BI.MultiLayerSingleTreeFirstPlusGroupNode.superclass.doClick.apply(this, arguments);
this.node.setSelected(this.isSelected());
},
setOpened: function (v) {
BI.MultiLayerSingleTreeFirstPlusGroupNode.superclass.setOpened.apply(this, arguments);
if (BI.isNotNull(this.node)) {
this.node.setOpened(v);
}
}
});
BI.shortcut("bi.multilayer_single_tree_first_plus_group_node", BI.MultiLayerSingleTreeFirstPlusGroupNode);/**
* 加号表示的组节点
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSingleTreeLastPlusGroupNode
* @extends BI.NodeButton
*/
BI.MultiLayerSingleTreeLastPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.MultiLayerSingleTreeLastPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
extraCls: "bi-multilayer-single-tree-last-plus-group-node bi-list-item",
layer: 0,//第几层级
id: "",
pId: "",
open: false,
height: 25
})
},
_init: function () {
BI.MultiLayerSingleTreeLastPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.node = BI.createWidget({
type: "bi.last_plus_group_node",
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
open: o.open,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {//本身实现click功能
return;
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.node);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
doRedMark: function () {
this.node.doRedMark.apply(this.node, arguments);
},
unRedMark: function () {
this.node.unRedMark.apply(this.node, arguments);
},
doClick: function () {
BI.MultiLayerSingleTreeLastPlusGroupNode.superclass.doClick.apply(this, arguments);
this.node.setSelected(this.isSelected());
},
setOpened: function (v) {
BI.MultiLayerSingleTreeLastPlusGroupNode.superclass.setOpened.apply(this, arguments);
if (BI.isNotNull(this.node)) {
this.node.setOpened(v);
}
}
});
BI.shortcut("bi.multilayer_single_tree_last_plus_group_node", BI.MultiLayerSingleTreeLastPlusGroupNode);/**
* 加号表示的组节点
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSingleTreeMidPlusGroupNode
* @extends BI.NodeButton
*/
BI.MultiLayerSingleTreeMidPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.MultiLayerSingleTreeMidPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
extraCls: "bi-multilayer-single-tree-mid-plus-group-node bi-list-item",
layer: 0,//第几层级
id: "",
pId: "",
open: false,
height: 25
})
},
_init: function () {
BI.MultiLayerSingleTreeMidPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.node = BI.createWidget({
type: "bi.mid_plus_group_node",
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
open: o.open,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.node.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {//本身实现click功能
return;
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.node);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
doRedMark: function () {
this.node.doRedMark.apply(this.node, arguments);
},
unRedMark: function () {
this.node.unRedMark.apply(this.node, arguments);
},
doClick: function () {
BI.MultiLayerSingleTreeMidPlusGroupNode.superclass.doClick.apply(this, arguments);
this.node.setSelected(this.isSelected());
},
setOpened: function (v) {
BI.MultiLayerSingleTreeMidPlusGroupNode.superclass.setOpened.apply(this, arguments);
if (BI.isNotNull(this.node)) {
this.node.setOpened(v);
}
}
});
BI.shortcut("bi.multilayer_single_tree_mid_plus_group_node", BI.MultiLayerSingleTreeMidPlusGroupNode);/**
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSingleTreeFirstTreeLeafItem
* @extends BI.BasicButton
*/
BI.MultiLayerSingleTreeFirstTreeLeafItem = BI.inherit(BI.BasicButton, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSingleTreeFirstTreeLeafItem.superclass._defaultConfig.apply(this, arguments), {
extraCls: "bi-multilayer-single-tree-first-tree-leaf-item bi-list-item-active",
logic: {
dynamic: false
},
layer: 0,
id: "",
pId: "",
height: 25
})
},
_init: function () {
BI.MultiLayerSingleTreeFirstTreeLeafItem.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.item = BI.createWidget({
type: "bi.first_tree_leaf_item",
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.item.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {//本身实现click功能
return;
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.item);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
doRedMark: function () {
this.item.doRedMark.apply(this.item, arguments);
},
unRedMark: function () {
this.item.unRedMark.apply(this.item, arguments);
},
doHighLight: function () {
this.item.doHighLight.apply(this.item, arguments);
},
unHighLight: function () {
this.item.unHighLight.apply(this.item, arguments);
},
getId: function () {
return this.options.id;
},
getPId: function () {
return this.options.pId;
},
doClick: function () {
BI.MultiLayerSingleTreeFirstTreeLeafItem.superclass.doClick.apply(this, arguments);
this.item.setSelected(this.isSelected());
},
setSelected: function (v) {
BI.MultiLayerSingleTreeFirstTreeLeafItem.superclass.setSelected.apply(this, arguments);
this.item.setSelected(v);
}
});
BI.shortcut("bi.multilayer_single_tree_first_tree_leaf_item", BI.MultiLayerSingleTreeFirstTreeLeafItem);/**
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSingleTreeLastTreeLeafItem
* @extends BI.BasicButton
*/
BI.MultiLayerSingleTreeLastTreeLeafItem = BI.inherit(BI.BasicButton, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSingleTreeLastTreeLeafItem.superclass._defaultConfig.apply(this, arguments), {
extraCls: "bi-multilayer-single-tree-last-tree-leaf-item bi-list-item-active",
logic: {
dynamic: false
},
layer: 0,
id: "",
pId: "",
height: 25
})
},
_init: function () {
BI.MultiLayerSingleTreeLastTreeLeafItem.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.item = BI.createWidget({
type: "bi.last_tree_leaf_item",
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.item.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {//本身实现click功能
return;
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.item);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
doRedMark: function () {
this.item.doRedMark.apply(this.item, arguments);
},
unRedMark: function () {
this.item.unRedMark.apply(this.item, arguments);
},
doHighLight: function () {
this.item.doHighLight.apply(this.item, arguments);
},
unHighLight: function () {
this.item.unHighLight.apply(this.item, arguments);
},
getId: function () {
return this.options.id;
},
getPId: function () {
return this.options.pId;
},
doClick: function () {
BI.MultiLayerSingleTreeLastTreeLeafItem.superclass.doClick.apply(this, arguments);
this.item.setSelected(this.isSelected());
},
setSelected: function (v) {
BI.MultiLayerSingleTreeLastTreeLeafItem.superclass.setSelected.apply(this, arguments);
this.item.setSelected(v);
}
});
BI.shortcut("bi.multilayer_single_tree_last_tree_leaf_item", BI.MultiLayerSingleTreeLastTreeLeafItem);/**
*
* Created by GUY on 2016/1/27.
* @class BI.MultiLayerSingleTreeMidTreeLeafItem
* @extends BI.BasicButton
*/
BI.MultiLayerSingleTreeMidTreeLeafItem = BI.inherit(BI.BasicButton, {
_defaultConfig: function () {
return BI.extend(BI.MultiLayerSingleTreeMidTreeLeafItem.superclass._defaultConfig.apply(this, arguments), {
extraCls: "bi-multilayer-single-tree-mid-tree-leaf-item bi-list-item-active",
logic: {
dynamic: false
},
layer: 0,
id: "",
pId: "",
height: 25
})
},
_init: function () {
BI.MultiLayerSingleTreeMidTreeLeafItem.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.item = BI.createWidget({
type: "bi.mid_tree_leaf_item",
logic: {
dynamic: true
},
id: o.id,
pId: o.pId,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.item.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {//本身实现click功能
return;
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
var items = [];
BI.count(0, o.layer, function () {
items.push({
type: "bi.layout",
cls: "base-line-conn-background",
width: 13,
height: o.height
})
});
items.push(this.item);
BI.createWidget({
type: "bi.td",
element: this,
columnSize: BI.makeArray(o.layer, 13),
items: [items]
})
},
doRedMark: function () {
this.item.doRedMark.apply(this.item, arguments);
},
unRedMark: function () {
this.item.unRedMark.apply(this.item, arguments);
},
doHighLight: function () {
this.item.doHighLight.apply(this.item, arguments);
},
unHighLight: function () {
this.item.unHighLight.apply(this.item, arguments);
},
getId: function () {
return this.options.id;
},
getPId: function () {
return this.options.pId;
},
doClick: function () {
BI.MultiLayerSingleTreeMidTreeLeafItem.superclass.doClick.apply(this, arguments);
this.item.setSelected(this.isSelected());
},
setSelected: function (v) {
BI.MultiLayerSingleTreeMidTreeLeafItem.superclass.setSelected.apply(this, arguments);
this.item.setSelected(v);
}
});
BI.shortcut("bi.multilayer_single_tree_mid_tree_leaf_item", BI.MultiLayerSingleTreeMidTreeLeafItem);/**
*
* @class BI.MultiSelectCheckPane
* @extends BI.Widget
*/
BI.MultiSelectCheckPane = BI.inherit(BI.Widget, {
constants: {
height: 25,
lgap: 10,
tgap: 5
},
_defaultConfig: function () {
return BI.extend(BI.MultiSelectCheckPane.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multi-select-check-pane bi-background",
items: [],
itemsCreator: BI.emptyFn,
valueFormatter: BI.emptyFn,
onClickContinueSelect: BI.emptyFn
});
},
_init: function () {
BI.MultiSelectCheckPane.superclass._init.apply(this, arguments);
var self = this, opts = this.options;
this.storeValue = {};
this.display = BI.createWidget({
type: 'bi.display_selected_list',
items: opts.items,
itemsCreator: function (op, callback) {
op = BI.extend(op || {}, {
selectedValues: self.storeValue.value
});
if (self.storeValue.type === BI.Selection.Multi) {
callback({
items: BI.map(self.storeValue.value, function (i, v) {
var txt = opts.valueFormatter(v) || v;
return {
text: txt,
value: v,
title: txt
}
})
});
return;
}
opts.itemsCreator(op, callback);
}
});
this.continueSelect = BI.createWidget({
type: 'bi.text_button',
text: BI.i18nText('BI-Continue_Select'),
cls: 'multi-select-check-selected bi-high-light'
});
this.continueSelect.on(BI.TextButton.EVENT_CHANGE, function () {
opts.onClickContinueSelect();
});
BI.createWidget({
type: 'bi.vtape',
element: this,
items: [{
height: this.constants.height,
el: {
type: 'bi.left',
cls: 'multi-select-continue-select',
items: [
{
el: {
type: "bi.label",
text: BI.i18nText('BI-Selected_Data')
},
lgap: this.constants.lgap,
tgap: this.constants.tgap
},
{
el: this.continueSelect,
lgap: this.constants.lgap,
tgap: this.constants.tgap
}]
}
}, {
height: 'fill',
el: this.display
}]
});
},
setValue: function (v) {
this.storeValue = v || {};
},
empty: function () {
this.display.empty();
},
populate: function () {
this.display.populate.apply(this.display, arguments);
}
});
BI.shortcut("bi.multi_select_check_pane", BI.MultiSelectCheckPane);/**
*
*
* 查看已选弹出层的展示面板
* @class BI.DisplaySelectedList
* @extends BI.Widget
*/
BI.DisplaySelectedList = BI.inherit(BI.Pane, {
constants: {
height: 25,
lgap: 10
},
_defaultConfig: function () {
return BI.extend(BI.DisplaySelectedList.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-display-list",
itemsCreator: BI.emptyFn,
items: []
});
},
_init: function () {
BI.DisplaySelectedList.superclass._init.apply(this, arguments);
var self = this, opts = this.options;
this.hasNext = false;
this.button_group = BI.createWidget({
type: "bi.list_pane",
element: this,
el: {
type: "bi.loader",
isDefaultInit: false,
logic: {
dynamic: true,
scrolly: true
},
items: this._createItems(opts.items),
chooseType: BI.ButtonGroup.CHOOSE_TYPE_MULTI,
layouts: [{
type: "bi.vertical",
lgap: 10
}]
},
itemsCreator: function (options, callback) {
opts.itemsCreator(options, function (ob) {
self.hasNext = !!ob.hasNext;
callback(self._createItems(ob.items));
})
},
hasNext: function () {
return self.hasNext;
}
});
},
_createItems: function (items) {
return BI.createItems(items, {
type: 'bi.icon_text_item',
cls: 'cursor-default check-font display-list-item bi-tips',
once: true,
invalid: true,
selected: true,
height: this.constants.height,
logic: {
dynamic: true
}
});
},
empty: function () {
this.button_group.empty();
},
populate: function (items) {
if (arguments.length === 0) {
this.button_group.populate();
} else {
this.button_group.populate(this._createItems(items));
}
}
});
BI.shortcut('bi.display_selected_list', BI.DisplaySelectedList);/**
*
* @class BI.MultiSelectCombo
* @extends BI.Single
*/
BI.MultiSelectCombo = BI.inherit(BI.Single, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-combo',
itemsCreator: BI.emptyFn,
valueFormatter: BI.emptyFn,
height: 28
});
},
_init: function () {
BI.MultiSelectCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
var assertShowValue = function () {
BI.isKey(self._startValue) && self.storeValue.value[self.storeValue.type === BI.Selection.All ? "remove" : "pushDistinct"](self._startValue);
self.trigger.getSearcher().setState(self.storeValue);
self.trigger.getCounter().setButtonChecked(self.storeValue);
};
this.storeValue = {};
this.trigger = BI.createWidget({
type: "bi.multi_select_trigger",
height: o.height,
// adapter: this.popup,
masker: {
offset: {
left: 1,
top: 1,
right: 2,
bottom: 33
}
},
valueFormatter: o.valueFormatter,
itemsCreator: function (op, callback) {
o.itemsCreator(op, function (res) {
if (op.times === 1 && BI.isNotNull(op.keywords)) {
self.trigger.setValue(self.getValue());
}
callback.apply(self, arguments);
});
}
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_START, function () {
self._setStartValue("");
this.getSearcher().setValue(self.storeValue);
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_STOP, function () {
self._setStartValue("");
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_PAUSE, function () {
if (this.getSearcher().hasMatched()) {
var keyword = this.getSearcher().getKeyword();
self._join({
type: BI.Selection.Multi,
value: [keyword]
}, function () {
self.combo.setValue(self.storeValue);
self._setStartValue(keyword);
assertShowValue();
self.populate();
self._setStartValue("");
})
}
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_SEARCHING, function (keywords) {
var last = BI.last(keywords);
keywords = BI.initial(keywords || []);
if (keywords.length > 0) {
self._joinKeywords(keywords, function () {
if (BI.isEndWithBlank(last)) {
self.combo.setValue(self.storeValue);
assertShowValue();
self.combo.populate();
self._setStartValue("");
} else {
self.combo.setValue(self.storeValue);
assertShowValue();
}
});
}
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_CHANGE, function (value, obj) {
if (obj instanceof BI.MultiSelectBar) {
self._joinAll(this.getValue(), function () {
assertShowValue();
});
} else {
self._join(this.getValue(), function () {//安徽省 北京
assertShowValue();
});
}
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW, function () {
this.getCounter().setValue(self.storeValue);
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_COUNTER_CLICK, function () {
if (!self.combo.isViewVisible()) {
self.combo.showView();
}
});
this.combo = BI.createWidget({
type: "bi.combo",
toggle: false,
el: this.trigger,
adjustLength: 1,
popup: {
type: 'bi.multi_select_popup_view',
ref: function () {
self.popup = this;
self.trigger.setAdapter(this);
},
listeners: [{
eventName: BI.MultiSelectPopupView.EVENT_CHANGE,
action: function () {
self.storeValue = this.getValue();
self._adjust(function () {
assertShowValue();
});
}
}, {
eventName: BI.MultiSelectPopupView.EVENT_CLICK_CONFIRM,
action: function () {
self._defaultState();
}
}, {
eventName: BI.MultiSelectPopupView.EVENT_CLICK_CLEAR,
action: function () {
self.setValue();
self._defaultState();
}
}],
itemsCreator: o.itemsCreator,
valueFormatter: o.valueFormatter,
onLoaded: function () {
BI.nextTick(function () {
self.combo.adjustWidth();
self.combo.adjustHeight();
self.trigger.getCounter().adjustView();
self.trigger.getSearcher().adjustView();
});
}
},
hideChecker: function (e) {
return triggerBtn.element.find(e.target).length === 0;
}
});
this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
this.setValue(self.storeValue);
BI.nextTick(function () {
self.populate();
});
});
this.combo.on(BI.Combo.EVENT_AFTER_HIDEVIEW, function () {
//important:关闭弹出时又可能没有退出编辑状态
self.trigger.stopEditing();
self.fireEvent(BI.MultiSelectCombo.EVENT_CONFIRM);
});
var triggerBtn = BI.createWidget({
type: "bi.trigger_icon_button",
width: o.height,
height: o.height,
cls: "multi-select-trigger-icon-button bi-border-left"
});
triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
self.trigger.getCounter().hideView();
if (self.combo.isViewVisible()) {
self.combo.hideView();
} else {
self.combo.showView();
}
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: this.combo,
left: 0,
right: 0,
top: 0,
bottom: 0
}, {
el: triggerBtn,
right: 0,
top: 0,
bottom: 0
}]
})
},
_defaultState: function () {
this.trigger.stopEditing();
this.combo.hideView();
},
_assertValue: function (val) {
val || (val = {});
val.type || (val.type = BI.Selection.Multi);
val.value || (val.value = []);
},
_makeMap: function (values) {
return BI.makeObject(values || []);
},
_joinKeywords: function (keywords, callback) {
var self = this, o = this.options;
this._assertValue(this.storeValue);
o.itemsCreator({
type: BI.MultiSelectCombo.REQ_GET_ALL_DATA,
keywords: keywords
}, function (ob) {
var values = BI.pluck(ob.items, "value");
digest(values);
});
function digest(items) {
var selectedMap = self._makeMap(items);
BI.each(keywords, function (i, val) {
if (BI.isNotNull(selectedMap[val])) {
self.storeValue.value[self.storeValue.type === BI.Selection.Multi ? "pushDistinct" : "remove"](val);
}
});
self._adjust(callback);
}
},
_joinAll: function (res, callback) {
var self = this, o = this.options;
this._assertValue(res);
o.itemsCreator({
type: BI.MultiSelectCombo.REQ_GET_ALL_DATA,
keywords: [this.trigger.getKey()]
}, function (ob) {
var items = BI.pluck(ob.items, "value");
if (self.storeValue.type === res.type) {
var change = false;
var map = self._makeMap(self.storeValue.value);
BI.each(items, function (i, v) {
if (BI.isNotNull(map[v])) {
change = true;
delete map[v];
}
});
change && (self.storeValue.value = BI.values(map));
self._adjust(callback);
return;
}
var selectedMap = self._makeMap(self.storeValue.value);
var notSelectedMap = self._makeMap(res.value);
var newItems = [];
BI.each(items, function (i, item) {
if (BI.isNotNull(selectedMap[items[i]])) {
delete selectedMap[items[i]];
}
if (BI.isNull(notSelectedMap[items[i]])) {
newItems.push(item);
}
});
self.storeValue.value = newItems.concat(BI.values(selectedMap));
self._adjust(callback);
})
},
_adjust: function (callback) {
var self = this, o = this.options;
if (!this._count) {
o.itemsCreator({
type: BI.MultiSelectCombo.REQ_GET_DATA_LENGTH
}, function (res) {
self._count = res.count;
adjust();
callback();
});
} else {
adjust();
callback();
}
function adjust() {
if (self.storeValue.type === BI.Selection.All && self.storeValue.value.length >= self._count) {
self.storeValue = {
type: BI.Selection.Multi,
value: []
}
} else if (self.storeValue.type === BI.Selection.Multi && self.storeValue.value.length >= self._count) {
self.storeValue = {
type: BI.Selection.All,
value: []
}
}
}
},
_join: function (res, callback) {
var self = this, o = this.options;
this._assertValue(res);
this._assertValue(this.storeValue);
if (this.storeValue.type === res.type) {
var map = this._makeMap(this.storeValue.value);
BI.each(res.value, function (i, v) {
if (!map[v]) {
self.storeValue.value.push(v);
map[v] = v;
}
});
var change = false;
BI.each(res.assist, function (i, v) {
if (BI.isNotNull(map[v])) {
change = true;
delete map[v];
}
});
change && (this.storeValue.value = BI.values(map));
self._adjust(callback);
return;
}
this._joinAll(res, callback);
},
_setStartValue: function (value) {
this._startValue = value;
this.popup.setStartValue(value);
},
setValue: function (v) {
this.storeValue = v || {};
this._assertValue(this.storeValue);
this.combo.setValue(this.storeValue);
},
getValue: function () {
return this.storeValue;
},
populate: function () {
this._count = null;
this.combo.populate.apply(this.combo, arguments);
}
});
BI.extend(BI.MultiSelectCombo, {
REQ_GET_DATA_LENGTH: 0,
REQ_GET_ALL_DATA: -1
});
BI.MultiSelectCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.shortcut('bi.multi_select_combo', BI.MultiSelectCombo);/**
* 多选加载数据面板
* Created by guy on 15/11/2.
* @class BI.MultiSelectLoader
* @extends Widget
*/
BI.MultiSelectLoader = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectLoader.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-loader',
logic: {
dynamic: true
},
el: {
height: 400
},
valueFormatter: BI.emptyFn,
itemsCreator: BI.emptyFn,
onLoaded: BI.emptyFn
});
},
_init: function () {
BI.MultiSelectLoader.superclass._init.apply(this, arguments);
var self = this, opts = this.options;
var hasNext = false;
this.button_group = BI.createWidget({
type: "bi.select_list",
element: this,
logic: opts.logic,
el: BI.extend({
onLoaded: opts.onLoaded,
el: {
type: "bi.loader",
isDefaultInit: false,
logic: {
dynamic: true,
scrolly: true
},
el: {
chooseType: BI.ButtonGroup.CHOOSE_TYPE_MULTI,
behaviors: {
redmark: function () {
return true;
}
},
layouts: [{
type: "bi.vertical"
}]
}
}
}, opts.el),
itemsCreator: function (op, callback) {
var startValue = self._startValue;
self.storeValue && (op = BI.extend(op || {}, {
selectedValues: BI.isKey(startValue) && self.storeValue.type === BI.Selection.Multi
? self.storeValue.value.concat(startValue) : self.storeValue.value
}));
opts.itemsCreator(op, function (ob) {
hasNext = ob.hasNext;
var firstItems = [];
if (op.times === 1 && self.storeValue) {
var json = BI.map(self.storeValue.value, function (i, v) {
var txt = opts.valueFormatter(v) || v;
return {
text: txt,
value: v,
title: txt,
selected: self.storeValue.type === BI.Selection.Multi
}
});
if (BI.isKey(self._startValue) && !self.storeValue.value.contains(self._startValue)) {
var txt = opts.valueFormatter(startValue) || startValue;
json.unshift({
text: txt,
value: startValue,
title: txt,
selected: true
})
}
firstItems = self._createItems(json);
}
callback(firstItems.concat(self._createItems(ob.items)), ob.keyword || "");
if (op.times === 1 && self.storeValue) {
BI.isKey(startValue) && self.storeValue.value[self.storeValue.type === BI.Selection.All ? "remove" : "pushDistinct"](startValue);
self.setValue(self.storeValue);
}
(op.times === 1) && self._scrollToTop();
});
},
hasNext: function () {
return hasNext;
}
});
this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.button_group.on(BI.SelectList.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiSelectLoader.EVENT_CHANGE, arguments);
});
},
_createItems: function (items) {
return BI.createItems(items, {
type: "bi.multi_select_item",
logic: this.options.logic,
height: 25,
selected: this.isAllSelected()
})
},
_scrollToTop: function () {
var self = this;
BI.delay(function () {
self.button_group.element.scrollTop(0);
}, 30);
},
isAllSelected: function () {
return this.button_group.isAllSelected();
},
_assertValue: function (val) {
val || (val = {});
val.type || (val.type = BI.Selection.Multi);
val.value || (val.value = []);
},
setStartValue: function (v) {
this._startValue = v;
},
setValue: function (v) {
this.storeValue = v || {};
this._assertValue(this.storeValue);
this.button_group.setValue(this.storeValue);
},
getValue: function () {
return this.button_group.getValue();
},
getAllButtons: function () {
return this.button_group.getAllButtons();
},
empty: function () {
this.button_group.empty();
},
populate: function (items) {
this.button_group.populate.apply(this.button_group, arguments);
},
resetHeight: function (h) {
this.button_group.resetHeight(h);
},
resetWidth: function (w) {
this.button_group.resetWidth(w);
}
});
BI.MultiSelectLoader.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut('bi.multi_select_loader', BI.MultiSelectLoader);/**
* 带加载的多选下拉面板
* @class BI.MultiSelectPopupView
* @extends Widget
*/
BI.MultiSelectPopupView = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectPopupView.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-popup-view',
maxWidth: 'auto',
minWidth: 135,
maxHeight: 400,
valueFormatter: BI.emptyFn,
itemsCreator: BI.emptyFn,
onLoaded: BI.emptyFn
});
},
_init: function () {
BI.MultiSelectPopupView.superclass._init.apply(this, arguments);
var self = this, opts = this.options;
this.loader = BI.createWidget({
type: "bi.multi_select_loader",
itemsCreator: opts.itemsCreator,
valueFormatter: opts.valueFormatter,
onLoaded: opts.onLoaded
});
this.popupView = BI.createWidget({
type: "bi.multi_popup_view",
stopPropagation: false,
maxWidth: opts.maxWidth,
minWidth: opts.minWidth,
maxHeight: opts.maxHeight,
element: this,
buttons: [BI.i18nText('BI-Basic_Clears'), BI.i18nText('BI-Basic_Sure')],
el: this.loader
});
this.popupView.on(BI.MultiPopupView.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiSelectPopupView.EVENT_CHANGE);
});
this.popupView.on(BI.MultiPopupView.EVENT_CLICK_TOOLBAR_BUTTON, function (index) {
switch (index) {
case 0:
self.fireEvent(BI.MultiSelectPopupView.EVENT_CLICK_CLEAR);
break;
case 1:
self.fireEvent(BI.MultiSelectPopupView.EVENT_CLICK_CONFIRM);
break;
}
});
},
isAllSelected: function () {
return this.loader.isAllSelected();
},
setStartValue: function (v) {
this.loader.setStartValue(v);
},
setValue: function (v) {
this.popupView.setValue(v);
},
getValue: function () {
return this.popupView.getValue();
},
populate: function (items) {
this.popupView.populate.apply(this.popupView, arguments);
},
resetHeight: function (h) {
this.popupView.resetHeight(h);
},
resetWidth: function (w) {
this.popupView.resetWidth(w);
}
});
BI.MultiSelectPopupView.EVENT_CHANGE = "EVENT_CHANGE";
BI.MultiSelectPopupView.EVENT_CLICK_CONFIRM = "EVENT_CLICK_CONFIRM";
BI.MultiSelectPopupView.EVENT_CLICK_CLEAR = "EVENT_CLICK_CLEAR";
BI.shortcut('bi.multi_select_popup_view', BI.MultiSelectPopupView);/**
*
* 复选下拉框
* @class BI.MultiSelectTrigger
* @extends BI.Trigger
*/
BI.MultiSelectTrigger = BI.inherit(BI.Trigger, {
constants: {
height: 14,
rgap: 4,
lgap: 4
},
_defaultConfig: function () {
return BI.extend(BI.MultiSelectTrigger.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multi-select-trigger bi-border",
itemsCreator: BI.emptyFn,
valueFormatter: BI.emptyFn,
searcher: {},
switcher: {},
adapter: null,
masker: {}
});
},
_init: function () {
BI.MultiSelectTrigger.superclass._init.apply(this, arguments);
var self = this, o = this.options;
if (o.height) {
this.setHeight(o.height - 2);
}
this.searcher = BI.createWidget(o.searcher, {
type: "bi.multi_select_searcher",
height: o.height,
itemsCreator: o.itemsCreator,
valueFormatter: o.valueFormatter,
popup: {},
adapter: o.adapter,
masker: o.masker
});
this.searcher.on(BI.MultiSelectSearcher.EVENT_START, function () {
self.fireEvent(BI.MultiSelectTrigger.EVENT_START);
});
this.searcher.on(BI.MultiSelectSearcher.EVENT_PAUSE, function () {
self.fireEvent(BI.MultiSelectTrigger.EVENT_PAUSE);
});
this.searcher.on(BI.MultiSelectSearcher.EVENT_SEARCHING, function () {
self.fireEvent(BI.MultiSelectTrigger.EVENT_SEARCHING, arguments);
});
this.searcher.on(BI.MultiSelectSearcher.EVENT_STOP, function () {
self.fireEvent(BI.MultiSelectTrigger.EVENT_STOP);
});
this.searcher.on(BI.MultiSelectSearcher.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiSelectTrigger.EVENT_CHANGE, arguments);
});
this.numberCounter = BI.createWidget(o.switcher, {
type: 'bi.multi_select_check_selected_switcher',
valueFormatter: o.valueFormatter,
itemsCreator: o.itemsCreator,
adapter: o.adapter,
masker: o.masker
});
this.numberCounter.on(BI.MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE, function () {
self.fireEvent(BI.MultiSelectTrigger.EVENT_COUNTER_CLICK);
});
this.numberCounter.on(BI.MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW);
});
var wrapNumberCounter = BI.createWidget({
type: 'bi.right_vertical_adapt',
hgap: 4,
items: [{
el: this.numberCounter
}]
});
var wrapper = BI.createWidget({
type: 'bi.htape',
element: this,
items: [
{
el: this.searcher,
width: 'fill'
}, {
el: wrapNumberCounter,
width: 0
}, {
el: BI.createWidget(),
width: 30
}]
});
this.numberCounter.on(BI.Events.VIEW, function (b) {
BI.nextTick(function () {//自动调整宽度
wrapper.attr("items")[1].width = (b === true ? self.numberCounter.element.outerWidth() + 8 : 0);
wrapper.resize();
});
});
this.element.click(function (e) {
if (self.element.__isMouseInBounds__(e) && !self.numberCounter.element.__isMouseInBounds__(e)) {
self.numberCounter.hideView();
}
});
},
getCounter: function () {
return this.numberCounter;
},
getSearcher: function () {
return this.searcher;
},
stopEditing: function () {
this.searcher.stopSearch();
this.numberCounter.hideView();
},
setAdapter: function (adapter) {
this.searcher.setAdapter(adapter);
this.numberCounter.setAdapter(adapter);
},
setValue: function (ob) {
this.searcher.setValue(ob);
this.numberCounter.setValue(ob);
},
getKey: function () {
return this.searcher.getKey();
},
getValue: function () {
return this.searcher.getValue();
}
});
BI.MultiSelectTrigger.EVENT_TRIGGER_CLICK = "EVENT_TRIGGER_CLICK";
BI.MultiSelectTrigger.EVENT_COUNTER_CLICK = "EVENT_COUNTER_CLICK";
BI.MultiSelectTrigger.EVENT_CHANGE = "EVENT_CHANGE";
BI.MultiSelectTrigger.EVENT_START = "EVENT_START";
BI.MultiSelectTrigger.EVENT_STOP = "EVENT_STOP";
BI.MultiSelectTrigger.EVENT_PAUSE = "EVENT_PAUSE";
BI.MultiSelectTrigger.EVENT_SEARCHING = "EVENT_SEARCHING";
BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW = "EVENT_BEFORE_COUNTER_POPUPVIEW";
BI.shortcut('bi.multi_select_trigger', BI.MultiSelectTrigger);/**
* 多选加载数据搜索loader面板
* Created by guy on 15/11/4.
* @class BI.MultiSelectSearchLoader
* @extends Widget
*/
BI.MultiSelectSearchLoader = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectSearchLoader.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-search-loader',
itemsCreator: BI.emptyFn,
keywordGetter: BI.emptyFn,
valueFormatter: BI.emptyFn,
});
},
_init: function () {
BI.MultiSelectSearchLoader.superclass._init.apply(this, arguments);
var self = this, opts = this.options;
var hasNext = false;
this.button_group = BI.createWidget({
type: "bi.select_list",
element: this,
logic: {
dynamic: false
},
el: {
tipText: BI.i18nText("BI-No_Select"),
el: {
type: "bi.loader",
isDefaultInit: false,
logic: {
dynamic: true,
scrolly: true
},
el: {
chooseType: BI.ButtonGroup.CHOOSE_TYPE_MULTI,
behaviors: {
redmark: function () {
return true;
}
},
layouts: [{
type: "bi.vertical"
}]
}
}
},
itemsCreator: function (op, callback) {
self.storeValue && (op = BI.extend(op || {}, {
selectedValues: self.storeValue.value
}));
opts.itemsCreator(op, function (ob) {
var keyword = ob.keyword = opts.keywordGetter();
hasNext = ob.hasNext;
var firstItems = [];
if (op.times === 1 && self.storeValue) {
var json = self._filterValues(self.storeValue);
firstItems = self._createItems(json);
}
callback(firstItems.concat(self._createItems(ob.items)), keyword);
if (op.times === 1 && self.storeValue) {
self.setValue(self.storeValue);
}
});
},
hasNext: function () {
return hasNext;
}
});
this.button_group.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.button_group.on(BI.SelectList.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiSelectSearchLoader.EVENT_CHANGE, arguments);
});
},
_createItems: function (items) {
return BI.createItems(items, {
type: "bi.multi_select_item",
logic: {
dynamic: false
},
height: 25,
selected: this.isAllSelected()
})
},
isAllSelected: function () {
return this.button_group.isAllSelected();
},
_filterValues: function (src) {
var o = this.options;
var keyword = o.keywordGetter();
var values = BI.deepClone(src.value) || [];
var newValues = BI.map(values, function (i, v) {
return {
text: o.valueFormatter(v) || v,
value: v
};
});
if (BI.isKey(keyword)) {
var search = BI.Func.getSearchResult(newValues, keyword);
values = search.matched.concat(search.finded);
}
return BI.map(values, function (i, v) {
return {
text: v.text,
title: v.text,
value: v.value,
selected: src.type === BI.Selection.All
}
})
},
setValue: function (v) {
this.storeValue = v;
this.button_group.setValue(v);
},
getValue: function () {
return this.button_group.getValue();
},
getAllButtons: function () {
return this.button_group.getAllButtons();
},
empty: function () {
this.button_group.empty();
},
populate: function (items) {
this.button_group.populate.apply(this.button_group, arguments);
},
resetHeight: function (h) {
this.button_group.resetHeight(h);
},
resetWidth: function (w) {
this.button_group.resetWidth(w);
}
});
BI.MultiSelectSearchLoader.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut('bi.multi_select_search_loader', BI.MultiSelectSearchLoader);/**
*
* 在搜索框中输入文本弹出的面板
* @class BI.MultiSelectSearchPane
* @extends Widget
*/
BI.MultiSelectSearchPane = BI.inherit(BI.Widget, {
constants: {
height: 25,
lgap: 10,
tgap: 5
},
_defaultConfig: function () {
return BI.extend(BI.MultiSelectSearchPane.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multi-select-search-pane bi-card",
itemsCreator: BI.emptyFn,
valueFormatter: BI.emptyFn,
keywordGetter: BI.emptyFn
});
},
_init: function () {
BI.MultiSelectSearchPane.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.tooltipClick = BI.createWidget({
type: "bi.label",
invisible: true,
text: BI.i18nText('BI-Click_Blank_To_Select'),
cls: 'multi-select-toolbar',
height: this.constants.height
});
this.loader = BI.createWidget({
type: "bi.multi_select_search_loader",
keywordGetter: o.keywordGetter,
valueFormatter: o.valueFormatter,
itemsCreator: function (op, callback) {
o.itemsCreator.apply(self, [op, function (res) {
callback(res);
self.setKeyword(o.keywordGetter());
}]);
}
});
this.loader.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.resizer = BI.createWidget({
type: "bi.vtape",
element: this,
items: [{
el: this.tooltipClick,
height: 0
}, {
el: this.loader
}]
});
this.tooltipClick.setVisible(false);
},
setKeyword: function (keyword) {
var btn;
var isVisible = this.loader.getAllButtons().length > 0 && (btn = this.loader.getAllButtons()[0]) && (keyword === btn.getValue());
if (isVisible !== this.tooltipClick.isVisible()) {
this.tooltipClick.setVisible(isVisible);
this.resizer.attr("items")[0].height = (isVisible ? this.constants.height : 0);
this.resizer.resize();
}
},
isAllSelected: function () {
return this.loader.isAllSelected();
},
hasMatched: function () {
return this.tooltipClick.isVisible();
},
setValue: function (v) {
this.loader.setValue(v);
},
getValue: function () {
return this.loader.getValue();
},
empty: function () {
this.loader.empty();
},
populate: function (items) {
this.loader.populate.apply(this.loader, arguments);
}
});
BI.MultiSelectSearchPane.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.multi_select_search_pane", BI.MultiSelectSearchPane);/**
* 查看已选按钮
* Created by guy on 15/11/3.
* @class BI.MultiSelectCheckSelectedButton
* @extends BI.Single
*/
BI.MultiSelectCheckSelectedButton = BI.inherit(BI.Single, {
_const: {
checkSelected: BI.i18nText('BI-Check_Selected')
},
_defaultConfig: function () {
return BI.extend(BI.MultiSelectCheckSelectedButton.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-check-selected-button bi-high-light',
itemsCreator: BI.emptyFn
});
},
_init: function () {
BI.MultiSelectCheckSelectedButton.superclass._init.apply(this, arguments);
var self = this;
this.numberCounter = BI.createWidget({
type: 'bi.text_button',
element: this,
hgap: 4,
text: "0",
textAlign: 'center',
textHeight: 15
});
this.numberCounter.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.numberCounter.on(BI.TextButton.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiSelectCheckSelectedButton.EVENT_CHANGE, arguments);
});
this.numberCounter.element.hover(function () {
self.numberCounter.setTag(self.numberCounter.getText());
self.numberCounter.setText(self._const.checkSelected);
}, function () {
self.numberCounter.setText(self.numberCounter.getTag());
});
this.setVisible(false);
},
setValue: function (ob) {
var self = this, o = this.options;
ob || (ob = {});
ob.type || (ob.type = BI.Selection.Multi);
ob.value || (ob.value = []);
if (ob.type === BI.Selection.All) {
o.itemsCreator({
type: BI.MultiSelectCombo.REQ_GET_DATA_LENGTH
}, function (res) {
var length = res.count - ob.value.length;
BI.nextTick(function(){
self.numberCounter.setText(length);
self.setVisible(length > 0);
});
});
return;
}
BI.nextTick(function(){
self.numberCounter.setText(ob.value.length);
self.setVisible(ob.value.length > 0);
})
},
getValue: function () {
}
});
BI.MultiSelectCheckSelectedButton.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut('bi.multi_select_check_selected_button', BI.MultiSelectCheckSelectedButton);/**
* 多选输入框
* Created by guy on 15/11/3.
* @class BI.MultiSelectEditor
* @extends Widget
*/
BI.MultiSelectEditor = BI.inherit(BI.Widget, {
_const: {
checkSelected: BI.i18nText('BI-Check_Selected')
},
_defaultConfig: function () {
return BI.extend(BI.MultiSelectEditor.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-editor',
el: {}
});
},
_init: function () {
BI.MultiSelectEditor.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.editor = BI.createWidget(o.el, {
type: 'bi.state_editor',
element: this,
height: o.height,
watermark: BI.i18nText('BI-Basic_Search'),
allowBlank: true
});
this.editor.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.editor.on(BI.StateEditor.EVENT_PAUSE, function () {
self.fireEvent(BI.MultiSelectEditor.EVENT_PAUSE);
});
this.editor.on(BI.StateEditor.EVENT_CLICK_LABEL, function () {
});
},
focus: function () {
this.editor.focus();
},
blur: function () {
this.editor.blur();
},
setState: function (state) {
this.editor.setState(state);
},
setValue: function (v) {
this.editor.setValue(v);
},
getValue: function () {
var v = this.editor.getState();
if (BI.isArray(v) && v.length > 0) {
return v[v.length - 1];
} else {
return "";
}
},
getKeywords: function () {
var val = this.editor.getLastValidValue();
var keywords = val.match(/[\S]+/g);
if (BI.isEndWithBlank(val)) {
return keywords.concat([' ']);
}
return keywords;
},
populate: function (items) {
}
});
BI.MultiSelectEditor.EVENT_PAUSE = "MultiSelectEditor.EVENT_PAUSE";
BI.shortcut('bi.multi_select_editor', BI.MultiSelectEditor);/**
* searcher
* Created by guy on 15/11/3.
* @class BI.MultiSelectSearcher
* @extends Widget
*/
BI.MultiSelectSearcher = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectSearcher.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-searcher',
itemsCreator: BI.emptyFn,
el: {},
popup: {},
valueFormatter: BI.emptyFn,
adapter: null,
masker: {}
});
},
_init: function () {
BI.MultiSelectSearcher.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.editor = BI.createWidget(o.el, {
type: 'bi.multi_select_editor',
height: o.height
});
this.searcher = BI.createWidget({
type: "bi.searcher",
element: this,
height: o.height,
isAutoSearch: false,
isAutoSync: false,
onSearch: function (op, callback) {
callback();
},
el: this.editor,
popup: BI.extend({
type: "bi.multi_select_search_pane",
valueFormatter: o.valueFormatter,
keywordGetter: function () {
return self.editor.getValue();
},
itemsCreator: function (op, callback) {
op.keyword = self.editor.getValue();
this.setKeyword(op.keyword);
o.itemsCreator(op, callback);
}
}, o.popup),
adapter: o.adapter,
masker: o.masker
});
this.searcher.on(BI.Searcher.EVENT_START, function () {
self.fireEvent(BI.MultiSelectSearcher.EVENT_START);
});
this.searcher.on(BI.Searcher.EVENT_PAUSE, function () {
if (this.hasMatched()) {
}
self.fireEvent(BI.MultiSelectSearcher.EVENT_PAUSE);
});
this.searcher.on(BI.Searcher.EVENT_STOP, function () {
self.fireEvent(BI.MultiSelectSearcher.EVENT_STOP);
});
this.searcher.on(BI.Searcher.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiSelectSearcher.EVENT_CHANGE, arguments);
});
this.searcher.on(BI.Searcher.EVENT_SEARCHING, function () {
var keywords = this.getKeywords();
self.fireEvent(BI.MultiSelectSearcher.EVENT_SEARCHING, keywords);
});
},
adjustView: function () {
this.searcher.adjustView();
},
isSearching: function () {
return this.searcher.isSearching();
},
stopSearch: function () {
this.searcher.stopSearch();
},
getKeyword: function () {
return this.editor.getValue();
},
hasMatched: function () {
return this.searcher.hasMatched();
},
hasChecked: function () {
return this.searcher.getView() && this.searcher.getView().hasChecked();
},
setAdapter: function (adapter) {
this.searcher.setAdapter(adapter);
},
setState: function (ob) {
var o = this.options;
ob || (ob = {});
ob.value || (ob.value = []);
if (ob.type === BI.Selection.All) {
if (BI.size(ob.assist) === 1) {
this.editor.setState(o.valueFormatter(ob.assist[0] + "") || (ob.assist[0] + ""));
} else {
this.editor.setState(BI.size(ob.value) > 0 ? BI.Selection.Multi : BI.Selection.All);
}
} else {
if (BI.size(ob.value) === 1) {
this.editor.setState(o.valueFormatter(ob.value[0] + "") || (ob.value[0] + ""));
} else {
this.editor.setState(BI.size(ob.value) > 0 ? BI.Selection.Multi : BI.Selection.None);
}
}
},
setValue: function (ob) {
this.setState(ob);
this.searcher.setValue(ob);
},
getKey: function () {
return this.editor.getValue();
},
getValue: function () {
return this.searcher.getValue();
},
populate: function (items) {
this.searcher.populate.apply(this.searcher, arguments);
}
});
BI.MultiSelectSearcher.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.MultiSelectSearcher.EVENT_CHANGE = "EVENT_CHANGE";
BI.MultiSelectSearcher.EVENT_START = "EVENT_START";
BI.MultiSelectSearcher.EVENT_STOP = "EVENT_STOP";
BI.MultiSelectSearcher.EVENT_PAUSE = "EVENT_PAUSE";
BI.MultiSelectSearcher.EVENT_SEARCHING = "EVENT_SEARCHING";
BI.shortcut('bi.multi_select_searcher', BI.MultiSelectSearcher);/**
* 查看已选switcher
* Created by guy on 15/11/3.
* @class BI.MultiSelectCheckSelectedSwitcher
* @extends Widget
*/
BI.MultiSelectCheckSelectedSwitcher = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectCheckSelectedSwitcher.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-check-selected-switcher',
itemsCreator: BI.emptyFn,
valueFormatter: BI.emptyFn,
el: {},
popup: {},
adapter: null,
masker: {}
});
},
_init: function () {
BI.MultiSelectCheckSelectedSwitcher.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.button = BI.createWidget(o.el, {
type: "bi.multi_select_check_selected_button",
itemsCreator: o.itemsCreator
});
this.button.on(BI.Events.VIEW, function () {
self.fireEvent(BI.Events.VIEW, arguments);
});
this.switcher = BI.createWidget({
type: "bi.switcher",
toggle: false,
element: this,
el: this.button,
popup: BI.extend({
type: "bi.multi_select_check_pane",
valueFormatter: o.valueFormatter,
itemsCreator: o.itemsCreator,
onClickContinueSelect: function () {
self.switcher.hideView();
}
}, o.popup),
adapter: o.adapter,
masker: o.masker
});
this.switcher.on(BI.Switcher.EVENT_TRIGGER_CHANGE, function () {
self.fireEvent(BI.MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE);
});
this.switcher.on(BI.Switcher.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW);
});
this.switcher.on(BI.Switcher.EVENT_AFTER_POPUPVIEW, function () {
var me = this;
BI.nextTick(function () {
me.populate();
});
});
this.switcher.element.click(function (e) {
e.stopPropagation();
});
},
adjustView: function () {
this.switcher.adjustView();
},
hideView: function () {
this.switcher.empty();
this.switcher.hideView();
},
setAdapter: function (adapter) {
this.switcher.setAdapter(adapter);
},
setValue: function (v) {
this.switcher.setValue(v);
},
setButtonChecked: function (v) {
this.button.setValue(v)
},
getValue: function () {
},
populate: function (items) {
this.switcher.populate.apply(this.switcher, arguments);
}
});
BI.MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE = "MultiSelectCheckSelectedSwitcher.EVENT_TRIGGER_CHANGE";
BI.MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW = "MultiSelectCheckSelectedSwitcher.EVENT_BEFORE_POPUPVIEW";
BI.shortcut('bi.multi_select_check_selected_switcher', BI.MultiSelectCheckSelectedSwitcher);/**
* Created by zcf_1 on 2017/5/2.
*/
BI.MultiSelectList = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectList.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-list',
itemsCreator: BI.emptyFn,
valueFormatter: BI.emptyFn
})
},
_init: function () {
BI.MultiSelectList.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.storeValue = {};
var assertShowValue = function () {
BI.isKey(self._startValue) && self.storeValue.value[self.storeValue.type === BI.Selection.All ? "remove" : "pushDistinct"](self._startValue);
self.trigger.setValue(self.storeValue);
};
this.adapter = BI.createWidget({
type: "bi.multi_select_loader",
cls: "popup-multi-select-list bi-border-left bi-border-right bi-border-bottom",
itemsCreator: o.itemsCreator,
valueFormatter: o.valueFormatter,
// onLoaded: o.onLoaded,
el: {
height: ""
}
});
this.adapter.on(BI.MultiSelectLoader.EVENT_CHANGE, function () {
self.storeValue = this.getValue();
self._adjust(function () {
assertShowValue();
self.fireEvent(BI.MultiSelectList.EVENT_CHANGE);
});
});
this.searcherPane = BI.createWidget({
type: "bi.multi_select_search_pane",
cls: "bi-border-left bi-border-right bi-border-bottom",
valueFormatter: o.valueFormatter,
keywordGetter: function () {
return self.trigger.getKeyword();
},
itemsCreator: function (op, callback) {
op.keyword = self.trigger.getKeyword();
this.setKeyword(op.keyword);
o.itemsCreator(op, callback);
}
});
this.searcherPane.setVisible(false);
this.trigger = BI.createWidget({
type: "bi.searcher",
isAutoSearch: false,
isAutoSync: false,
onSearch: function (op, callback) {
callback();
},
adapter: this.adapter,
popup: this.searcherPane,
height: 200,
masker: false,
listeners: [{
eventName: BI.Searcher.EVENT_START,
action: function () {
self._showSearcherPane();
self._setStartValue("");
this.setValue(self.storeValue);
}
}, {
eventName: BI.Searcher.EVENT_STOP,
action: function () {
self._showAdapter();
self._setStartValue("");
self.adapter.setValue(self.storeValue);
//需要刷新回到初始界面,否则搜索的结果不能放在最前面
self.adapter.populate();
}
}, {
eventName: BI.Searcher.EVENT_PAUSE,
action: function () {
if (this.hasMatched()) {
var keyword = this.getKeyword();
self._join({
type: BI.Selection.Multi,
value: [keyword]
}, function () {
self._showAdapter();
self.adapter.setValue(self.storeValue);
self._setStartValue(keyword);
assertShowValue();
self._setStartValue("");
self.fireEvent(BI.MultiSelectList.EVENT_CHANGE);
})
} else {
self._showAdapter();
}
}
}, {
eventName: BI.Searcher.EVENT_SEARCHING,
action: function () {
var keywords = this.getKeyword();
var last = BI.last(keywords);
keywords = BI.initial(keywords || []);
if (keywords.length > 0) {
self._joinKeywords(keywords, function () {
if (BI.isEndWithBlank(last)) {
self.adapter.setValue(self.storeValue);
assertShowValue();
self.adapter.populate();
self._setStartValue("");
} else {
self.adapter.setValue(self.storeValue);
assertShowValue();
}
});
}
}
}, {
eventName: BI.Searcher.EVENT_CHANGE,
action: function (value, obj) {
if (obj instanceof BI.MultiSelectBar) {
self._joinAll(this.getValue(), function () {
assertShowValue();
});
} else {
self._join(this.getValue(), function () {//安徽省 北京
assertShowValue();
});
}
}
}]
});
BI.createWidget({
type: "bi.vtape",
element: this,
items: [{
el: this.trigger,
height: 30
}, {
el: this.adapter,
height: "fill"
}]
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: this.searcherPane,
top: 30,
bottom: 0,
left: 0,
right: 0
}]
})
},
_showAdapter: function () {
this.adapter.setVisible(true);
this.searcherPane.setVisible(false);
},
_showSearcherPane: function () {
this.searcherPane.setVisible(true);
this.adapter.setVisible(false);
},
_defaultState: function () {
this.trigger.stopEditing();
},
_assertValue: function (val) {
val || (val = {});
val.type || (val.type = BI.Selection.Multi);
val.value || (val.value = []);
},
_makeMap: function (values) {
return BI.makeObject(values || []);
},
_joinKeywords: function (keywords, callback) {
var self = this, o = this.options;
this._assertValue(this.storeValue);
if (!this._allData) {
o.itemsCreator({
type: BI.MultiSelectList.REQ_GET_ALL_DATA
}, function (ob) {
self._allData = BI.pluck(ob.items, "value");
digest(self._allData);
})
} else {
digest(this._allData)
}
function digest(items) {
var selectedMap = self._makeMap(items);
BI.each(keywords, function (i, val) {
if (BI.isNotNull(selectedMap[val])) {
self.storeValue.value[self.storeValue.type === BI.Selection.Multi ? "pushDistinct" : "remove"](val);
}
});
self._adjust(callback);
}
},
_joinAll: function (res, callback) {
var self = this, o = this.options;
this._assertValue(res);
o.itemsCreator({
type: BI.MultiSelectList.REQ_GET_ALL_DATA,
keyword: self.trigger.getKeyword()
}, function (ob) {
var items = BI.pluck(ob.items, "value");
if (self.storeValue.type === res.type) {
var change = false;
var map = self._makeMap(self.storeValue.value);
BI.each(items, function (i, v) {
if (BI.isNotNull(map[v])) {
change = true;
delete map[v];
}
});
change && (self.storeValue.value = BI.values(map));
self._adjust(callback);
return;
}
var selectedMap = self._makeMap(self.storeValue.value);
var notSelectedMap = self._makeMap(res.value);
var newItems = [];
BI.each(items, function (i, item) {
if (BI.isNotNull(selectedMap[items[i]])) {
delete selectedMap[items[i]];
}
if (BI.isNull(notSelectedMap[items[i]])) {
newItems.push(item);
}
});
self.storeValue.value = newItems.concat(BI.values(selectedMap));
self._adjust(callback);
})
},
_adjust: function (callback) {
var self = this, o = this.options;
if (!this._count) {
o.itemsCreator({
type: BI.MultiSelectList.REQ_GET_DATA_LENGTH
}, function (res) {
self._count = res.count;
adjust();
callback();
});
} else {
adjust();
callback();
}
function adjust() {
if (self.storeValue.type === BI.Selection.All && self.storeValue.value.length >= self._count) {
self.storeValue = {
type: BI.Selection.Multi,
value: []
}
} else if (self.storeValue.type === BI.Selection.Multi && self.storeValue.value.length >= self._count) {
self.storeValue = {
type: BI.Selection.All,
value: []
}
}
}
},
_join: function (res, callback) {
var self = this, o = this.options;
this._assertValue(res);
this._assertValue(this.storeValue);
if (this.storeValue.type === res.type) {
var map = this._makeMap(this.storeValue.value);
BI.each(res.value, function (i, v) {
if (!map[v]) {
self.storeValue.value.push(v);
map[v] = v;
}
});
var change = false;
BI.each(res.assist, function (i, v) {
if (BI.isNotNull(map[v])) {
change = true;
delete map[v];
}
});
change && (this.storeValue.value = BI.values(map));
self._adjust(callback);
return;
}
this._joinAll(res, callback);
},
_setStartValue: function (value) {
this._startValue = value;
this.adapter.setStartValue(value);
},
isAllSelected: function () {
return this.adapter.isAllSelected();
},
resize: function () {
// this.trigger.getCounter().adjustView();
// this.trigger.adjustView();
},
setValue: function (v) {
this.storeValue = v || {};
this._assertValue(this.storeValue);
this.adapter.setValue(this.storeValue);
this.trigger.setValue(this.storeValue);
},
getValue: function () {
return this.storeValue;
},
populate: function () {
this._count = null;
this._allData = null;
this.adapter.populate.apply(this.adapter, arguments);
this.trigger.populate.apply(this.trigger, arguments);
}
});
BI.extend(BI.MultiSelectList, {
REQ_GET_DATA_LENGTH: 0,
REQ_GET_ALL_DATA: -1
});
BI.MultiSelectList.EVENT_CHANGE = "BI.MultiSelectList.EVENT_CHANGE";
BI.shortcut("bi.multi_select_list", BI.MultiSelectList);/**
* Created by zcf_1 on 2017/5/11.
*/
BI.MultiSelectTree = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectTree.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-select-tree',
itemsCreator: BI.emptyFn
})
},
_init: function () {
BI.MultiSelectTree.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.storeValue = {value: {}};
this.adapter = BI.createWidget({
type: "bi.multi_select_tree_popup",
itemsCreator: o.itemsCreator
});
this.adapter.on(BI.MultiSelectTreePopup.EVENT_CHANGE, function () {
if (self.searcher.isSearching()) {
self.storeValue = {value: self.searcherPane.getValue()};
} else {
self.storeValue = {value: self.adapter.getValue()};
}
self.setSelectedValue(self.storeValue.value);
self.fireEvent(BI.MultiSelectTree.EVENT_CHANGE);
});
//搜索中的时候用的是parttree,同adapter中的synctree不一样
this.searcherPane = BI.createWidget({
type: "bi.multi_tree_search_pane",
cls: "bi-border-left bi-border-right bi-border-bottom",
keywordGetter: function () {
return self.searcher.getKeyword();
},
itemsCreator: function (op, callback) {
op.keyword = self.searcher.getKeyword();
o.itemsCreator(op, callback);
}
});
this.searcherPane.setVisible(false);
this.searcher = BI.createWidget({
type: "bi.searcher",
isAutoSearch: false,
isAutoSync: false,
onSearch: function (op, callback) {
callback({
keyword: self.searcher.getKeyword()
});
},
adapter: this.adapter,
popup: this.searcherPane,
masker: false,
listeners: [{
eventName: BI.Searcher.EVENT_START,
action: function () {
self._showSearcherPane();
// self.storeValue = {value: self.adapter.getValue()};
// self.searcherPane.setSelectedValue(self.storeValue.value);
}
}, {
eventName: BI.Searcher.EVENT_STOP,
action: function () {
self._showAdapter();
// self.storeValue = {value: self.searcherPane.getValue()};
// self.adapter.setSelectedValue(self.storeValue.value);
BI.nextTick(function () {
self.adapter.populate();
});
}
}, {
eventName: BI.Searcher.EVENT_CHANGE,
action: function () {
if (self.searcher.isSearching()) {
self.storeValue = {value: self.searcherPane.getValue()};
} else {
self.storeValue = {value: self.adapter.getValue()};
}
self.setSelectedValue(self.storeValue.value);
self.fireEvent(BI.MultiSelectTree.EVENT_CHANGE);
}
}, {
eventName: BI.Searcher.EVENT_PAUSE,
action: function () {
self._showAdapter();
}
}]
});
BI.createWidget({
type: "bi.vtape",
element: this,
items: [{
el: this.searcher,
height: 30
}, {
el: this.adapter,
height: "fill"
}]
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: this.searcherPane,
top: 30,
bottom: 0,
left: 0,
right: 0
}]
})
},
_showAdapter: function () {
this.adapter.setVisible(true);
this.searcherPane.setVisible(false);
},
_showSearcherPane: function () {
this.searcherPane.setVisible(true);
this.adapter.setVisible(false);
},
resize: function () {
},
setSelectedValue: function (v) {
this.storeValue.value = v || {};
this.adapter.setSelectedValue(v);
this.searcherPane.setSelectedValue(v);
this.searcher.setValue({
value: v || {}
});
},
setValue: function (v) {
this.adapter.setValue(v);
},
stopSearch: function () {
this.searcher.stopSearch();
},
updateValue: function (v) {
this.adapter.updateValue(v);
},
getValue: function () {
return this.storeValue.value;
},
populate: function () {
this.searcher.populate.apply(this.searcher, arguments);
this.adapter.populate.apply(this.adapter, arguments);
}
});
BI.MultiSelectTree.EVENT_CHANGE = "BI.MultiSelectTree.EVENT_CHANGE";
BI.shortcut("bi.multi_select_tree", BI.MultiSelectTree);/**
* Created by zcf on 2016/12/21.
*/
BI.MultiSelectTreePopup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiSelectTreePopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multi-select-tree-popup bi-border-left bi-border-right bi-border-bottom",
itemsCreator: BI.emptyFn
});
},
_init: function () {
BI.MultiSelectTreePopup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.popup = BI.createWidget({
type: "bi.async_tree",
element: this,
itemsCreator: o.itemsCreator
});
this.popup.on(BI.TreeView.EVENT_AFTERINIT, function () {
self.fireEvent(BI.MultiSelectTreePopup.EVENT_AFTER_INIT)
});
this.popup.on(BI.TreeView.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiSelectTreePopup.EVENT_CHANGE)
});
},
hasChecked: function () {
return this.popup.hasChecked();
},
getValue: function () {
return this.popup.getValue();
},
setValue: function (v) {
v || (v = {});
this.popup.setValue(v);
},
setSelectedValue: function (v) {
v || (v = {});
this.popup.setSelectedValue(v);
},
updateValue: function (v) {
this.popup.updateValue(v);
this.popup.refresh();
},
populate: function (config) {
this.popup.stroke(config);
}
});
BI.MultiSelectTreePopup.EVENT_AFTER_INIT = "BI.MultiSelectTreePopup.EVENT_AFTER_INIT";
BI.MultiSelectTreePopup.EVENT_CHANGE = "BI.MultiSelectTreePopup.EVENT_CHANGE";
BI.shortcut("bi.multi_select_tree_popup", BI.MultiSelectTreePopup);/**
*
* @class BI.MultiTreeCheckPane
* @extends BI.Pane
*/
BI.MultiTreeCheckPane = BI.inherit(BI.Pane, {
constants: {
height: 25,
lgap: 10,
tgap: 5
},
_defaultConfig: function () {
return BI.extend(BI.MultiTreeCheckPane.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multi-tree-check-pane bi-background",
onClickContinueSelect: BI.emptyFn
});
},
_init: function () {
BI.MultiTreeCheckPane.superclass._init.apply(this, arguments);
var self = this, opts = this.options;
this.selectedValues = {};
var continueSelect = BI.createWidget({
type: 'bi.text_button',
text: BI.i18nText('BI-Continue_Select'),
cls: 'multi-tree-check-selected'
});
continueSelect.on(BI.TextButton.EVENT_CHANGE, function () {
opts.onClickContinueSelect();
BI.nextTick(function () {
self.empty();
});
});
var backToPopup = BI.createWidget({
type: 'bi.left',
cls: 'multi-tree-continue-select',
items: [
{
el: {
type: "bi.label",
text: BI.i18nText('BI-Selected_Data')
},
lgap: this.constants.lgap,
tgap: this.constants.tgap
},
{
el: continueSelect,
lgap: this.constants.lgap,
tgap: this.constants.tgap
}]
});
this.display = BI.createWidget({
type: "bi.display_tree",
cls: "bi-multi-tree-display",
itemsCreator: function (op, callback) {
op.type = BI.TreeView.REQ_TYPE_GET_SELECTED_DATA;
opts.itemsCreator(op, callback);
}
});
this.display.on(BI.Events.AFTERINIT, function () {
self.fireEvent(BI.Events.AFTERINIT);
});
this.display.on(BI.TreeView.EVENT_INIT, function () {
backToPopup.setVisible(false);
});
this.display.on(BI.TreeView.EVENT_AFTERINIT, function () {
backToPopup.setVisible(true);
});
BI.createWidget({
type: 'bi.vtape',
element: this,
items: [{
height: this.constants.height,
el: backToPopup
}, {
height: 'fill',
el: this.display
}]
});
},
empty: function () {
this.display.empty();
},
populate: function (configs) {
this.display.stroke(configs);
},
setValue: function (v) {
v || (v = {});
this.display.setSelectedValue(v.value);
},
getValue: function () {
}
});
BI.MultiTreeCheckPane.EVENT_CONTINUE_CLICK = "EVENT_CONTINUE_CLICK";
BI.shortcut("bi.multi_tree_check_pane", BI.MultiTreeCheckPane);/**
*
* @class BI.MultiTreeCombo
* @extends BI.Single
*/
BI.MultiTreeCombo = BI.inherit(BI.Single, {
constants: {
offset: {
top: 1,
left: 1,
right: 2,
bottom: 33
}
},
_defaultConfig: function () {
return BI.extend(BI.MultiTreeCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-tree-combo',
itemsCreator: BI.emptyFn,
height: 25
});
},
_init: function () {
BI.MultiTreeCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
var isInit = false;
var want2showCounter = false;
this.trigger = BI.createWidget({
type: "bi.multi_select_trigger",
height: o.height,
// adapter: this.popup,
masker: {
offset: this.constants.offset
},
searcher: {
type: "bi.multi_tree_searcher",
itemsCreator: o.itemsCreator
},
switcher: {
el: {
type: "bi.multi_tree_check_selected_button"
},
popup: {
type: "bi.multi_tree_check_pane",
itemsCreator: o.itemsCreator
}
}
});
this.combo = BI.createWidget({
type: "bi.combo",
toggle: false,
el: this.trigger,
adjustLength: 1,
popup: {
type: 'bi.multi_tree_popup_view',
ref: function () {
self.popup = this;
self.trigger.setAdapter(this);
},
listeners: [{
eventName: BI.MultiTreePopup.EVENT_AFTERINIT,
action: function () {
self.trigger.getCounter().adjustView();
isInit = true;
if (want2showCounter === true) {
showCounter();
}
}
}, {
eventName: BI.MultiTreePopup.EVENT_CHANGE,
action: function () {
change = true;
var val = {
type: BI.Selection.Multi,
value: this.hasChecked() ? {1: 1} : {}
};
self.trigger.getSearcher().setState(val);
self.trigger.getCounter().setButtonChecked(val);
}
}, {
eventName: BI.MultiTreePopup.EVENT_CLICK_CONFIRM,
action: function () {
self.combo.hideView();
}
}, {
eventName: BI.MultiTreePopup.EVENT_CLICK_CLEAR,
action: function () {
clear = true;
self.setValue();
self._defaultState();
}
}],
itemsCreator: o.itemsCreator,
onLoaded: function () {
BI.nextTick(function () {
self.trigger.getCounter().adjustView();
self.trigger.getSearcher().adjustView();
});
}
},
hideChecker: function (e) {
return triggerBtn.element.find(e.target).length === 0;
}
});
this.storeValue = {value: {}};
var change = false;
var clear = false; //标识当前是否点击了清空
var isSearching = function () {
return self.trigger.getSearcher().isSearching();
};
var isPopupView = function () {
return self.combo.isViewVisible();
};
this.trigger.on(BI.MultiSelectTrigger.EVENT_START, function () {
self.storeValue = {value: self.combo.getValue()};
this.setValue(self.storeValue);
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_STOP, function () {
self.storeValue = {value: this.getValue()};
self.combo.setValue(self.storeValue);
BI.nextTick(function () {
if (isPopupView()) {
self.combo.populate();
}
});
});
function showCounter() {
if (isSearching()) {
self.storeValue = {value: self.trigger.getValue()};
} else if (isPopupView()) {
self.storeValue = {value: self.combo.getValue()};
}
self.trigger.setValue(self.storeValue);
}
this.trigger.on(BI.MultiSelectTrigger.EVENT_BEFORE_COUNTER_POPUPVIEW, function () {
if (want2showCounter === false) {
want2showCounter = true;
}
if (isInit === true) {
want2showCounter = null;
showCounter();
}
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_TRIGGER_CLICK, function () {
self.combo.toggle();
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_COUNTER_CLICK, function () {
if (!self.combo.isViewVisible()) {
self.combo.showView();
}
});
this.trigger.on(BI.MultiSelectTrigger.EVENT_CHANGE, function () {
var val = {
type: BI.Selection.Multi,
value: this.getSearcher().hasChecked() ? {1: 1} : {}
};
this.getSearcher().setState(val);
this.getCounter().setButtonChecked(val);
});
this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
if (isSearching()) {
return;
}
if (change === true) {
self.storeValue = {value: self.combo.getValue()};
change = false;
}
self.combo.setValue(self.storeValue);
self.populate();
});
this.combo.on(BI.Combo.EVENT_BEFORE_HIDEVIEW, function () {
if (isSearching()) {
self.trigger.stopEditing();
self.fireEvent(BI.MultiTreeCombo.EVENT_CONFIRM);
return;
}
if (isPopupView()) {
self.trigger.stopEditing();
self.storeValue = {value: self.combo.getValue()};
if (clear === true) {
self.storeValue = {value: {}};
clear = false;
change = false;
}
self.fireEvent(BI.MultiTreeCombo.EVENT_CONFIRM);
}
});
var triggerBtn = BI.createWidget({
type: "bi.trigger_icon_button",
width: o.height,
height: o.height,
cls: "multi-select-trigger-icon-button bi-border-left"
});
triggerBtn.on(BI.TriggerIconButton.EVENT_CHANGE, function () {
self.trigger.getCounter().hideView();
if (self.combo.isViewVisible()) {
self.combo.hideView();
} else {
self.combo.showView();
}
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: this.combo,
left: 0,
right: 0,
top: 0,
bottom: 0
}, {
el: triggerBtn,
right: 0,
top: 0,
bottom: 0
}]
})
},
_defaultState: function () {
this.trigger.stopEditing();
this.combo.hideView();
},
setValue: function (v) {
this.storeValue.value = v || {};
this.combo.setValue({
value: v || {}
});
},
getValue: function () {
return this.storeValue.value;
},
populate: function () {
this.combo.populate.apply(this.combo, arguments);
}
});
BI.MultiTreeCombo.EVENT_CONFIRM = "MultiTreeCombo.EVENT_CONFIRM";
BI.shortcut('bi.multi_tree_combo', BI.MultiTreeCombo);/**
* 带加载的多选下拉面板
* @class BI.MultiTreePopup
* @extends BI.Pane
*/
BI.MultiTreePopup = BI.inherit(BI.Pane, {
_defaultConfig: function () {
return BI.extend(BI.MultiTreePopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-tree-popup',
maxWidth: 'auto',
minWidth: 100,
maxHeight: 400,
onLoaded: BI.emptyFn
});
},
_init: function () {
BI.MultiTreePopup.superclass._init.apply(this, arguments);
var self = this, opts = this.options;
this.selectedValues = {};
this.tree = BI.createWidget({
type: "bi.async_tree",
height: 400,
cls:"popup-view-tree",
itemsCreator: opts.itemsCreator,
onLoaded: opts.onLoaded
});
this.popupView = BI.createWidget({
type: "bi.multi_popup_view",
element: this,
stopPropagation: false,
maxWidth: opts.maxWidth,
minWidth: opts.minWidth,
maxHeight: opts.maxHeight,
buttons: [BI.i18nText('BI-Basic_Clears'), BI.i18nText('BI-Basic_Sure')],
el: this.tree
});
this.popupView.on(BI.MultiPopupView.EVENT_CLICK_TOOLBAR_BUTTON, function (index) {
switch (index) {
case 0:
self.fireEvent(BI.MultiTreePopup.EVENT_CLICK_CLEAR);
break;
case 1:
self.fireEvent(BI.MultiTreePopup.EVENT_CLICK_CONFIRM);
break;
}
});
this.tree.on(BI.TreeView.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiTreePopup.EVENT_CHANGE);
});
this.tree.on(BI.TreeView.EVENT_AFTERINIT, function () {
self.fireEvent(BI.MultiTreePopup.EVENT_AFTERINIT);
});
},
getValue: function () {
return this.tree.getValue();
},
setValue: function (v) {
v || (v = {});
this.tree.setSelectedValue(v.value);
},
populate: function (config) {
this.tree.stroke(config);
},
hasChecked: function () {
return this.tree.hasChecked();
},
resetHeight: function (h) {
this.popupView.resetHeight(h);
},
resetWidth: function (w) {
this.popupView.resetWidth(w);
}
});
BI.MultiTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.MultiTreePopup.EVENT_CLICK_CONFIRM = "EVENT_CLICK_CONFIRM";
BI.MultiTreePopup.EVENT_CLICK_CLEAR = "EVENT_CLICK_CLEAR";
BI.MultiTreePopup.EVENT_AFTERINIT = "EVENT_AFTERINIT";
BI.shortcut('bi.multi_tree_popup_view', BI.MultiTreePopup);/**
*
* 在搜索框中输入文本弹出的面板
* @class BI.MultiTreeSearchPane
* @extends BI.Pane
*/
BI.MultiTreeSearchPane = BI.inherit(BI.Pane, {
_defaultConfig: function () {
return BI.extend(BI.MultiTreeSearchPane.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-multi-tree-search-pane bi-card",
itemsCreator: BI.emptyFn,
keywordGetter: BI.emptyFn
});
},
_init: function () {
BI.MultiTreeSearchPane.superclass._init.apply(this, arguments);
var self = this, opts = this.options;
this.partTree = BI.createWidget({
type: "bi.part_tree",
element: this,
tipText: BI.i18nText("BI-No_Select"),
itemsCreator: function (op, callback) {
op.keyword = opts.keywordGetter();
opts.itemsCreator(op, callback);
}
});
this.partTree.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.partTree.on(BI.TreeView.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiTreeSearchPane.EVENT_CHANGE);
});
},
hasChecked: function () {
return this.partTree.hasChecked();
},
setValue: function (v) {
this.setSelectedValue(v.value);
},
setSelectedValue: function (v) {
v || (v = {});
this.partTree.setSelectedValue(v);
},
getValue: function () {
return this.partTree.getValue();
},
empty: function () {
this.partTree.empty();
},
populate: function (op) {
this.partTree.stroke.apply(this.partTree, arguments);
}
});
BI.MultiTreeSearchPane.EVENT_CHANGE = "EVENT_CHANGE";
BI.MultiTreeSearchPane.EVENT_CLICK_CONFIRM = "EVENT_CLICK_CONFIRM";
BI.MultiTreeSearchPane.EVENT_CLICK_CLEAR = "EVENT_CLICK_CLEAR";
BI.shortcut("bi.multi_tree_search_pane", BI.MultiTreeSearchPane);/**
* 查看已选按钮
* Created by guy on 15/11/3.
* @class BI.MultiTreeCheckSelectedButton
* @extends BI.Single
*/
BI.MultiTreeCheckSelectedButton = BI.inherit(BI.Single, {
_const: {
checkSelected: BI.i18nText('BI-Check_Selected')
},
_defaultConfig: function () {
return BI.extend(BI.MultiTreeCheckSelectedButton.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-tree-check-selected-button',
itemsCreator: BI.emptyFn
});
},
_init: function () {
BI.MultiTreeCheckSelectedButton.superclass._init.apply(this, arguments);
var self = this;
this.indicator = BI.createWidget({
type: 'bi.icon_button',
cls: 'check-font trigger-check-selected',
width: 15,
height: 15,
stopPropagation: true
});
this.checkSelected = BI.createWidget({
type: 'bi.text_button',
cls: "trigger-check-selected",
invisible: true,
hgap: 4,
text: this._const.checkSelected,
textAlign: 'center',
textHeight: 15
});
this.checkSelected.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.checkSelected.on(BI.TextButton.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiSelectCheckSelectedButton.EVENT_CHANGE, arguments);
});
BI.createWidget({
type: "bi.horizontal",
element: this,
items: [this.indicator, this.checkSelected]
})
this.element.hover(function () {
self.indicator.setVisible(false);
self.checkSelected.setVisible(true);
}, function () {
self.indicator.setVisible(true);
self.checkSelected.setVisible(false);
});
this.setVisible(false);
},
setValue: function (v) {
v || (v = {});
this.setVisible(BI.size(v.value) > 0);
}
});
BI.MultiTreeCheckSelectedButton.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut('bi.multi_tree_check_selected_button', BI.MultiTreeCheckSelectedButton);/**
* searcher
* Created by guy on 15/11/3.
* @class BI.MultiTreeSearcher
* @extends Widget
*/
BI.MultiTreeSearcher = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.MultiTreeSearcher.superclass._defaultConfig.apply(this, arguments), {
baseCls: 'bi-multi-tree-searcher',
itemsCreator: BI.emptyFn,
popup: {},
adapter: null,
masker: {}
});
},
_init: function () {
BI.MultiTreeSearcher.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.editor = BI.createWidget({
type: 'bi.multi_select_editor',
height: o.height,
el: {
type: "bi.simple_state_editor",
height: o.height
}
});
this.searcher = BI.createWidget({
type: "bi.searcher",
element: this,
isAutoSearch: false,
isAutoSync: false,
onSearch: function (op, callback) {
callback({
keyword: self.editor.getValue()
});
},
el: this.editor,
popup: BI.extend({
type: "bi.multi_tree_search_pane",
keywordGetter: function () {
return self.editor.getValue();
},
itemsCreator: function (op, callback) {
op.keyword = self.editor.getValue();
o.itemsCreator(op, callback);
}
}, o.popup),
adapter: o.adapter,
masker: o.masker
});
this.searcher.on(BI.Searcher.EVENT_START, function () {
self.fireEvent(BI.MultiTreeSearcher.EVENT_START);
});
this.searcher.on(BI.Searcher.EVENT_PAUSE, function () {
if (this.hasMatched()) {
}
self.fireEvent(BI.MultiTreeSearcher.EVENT_PAUSE);
});
this.searcher.on(BI.Searcher.EVENT_STOP, function () {
self.fireEvent(BI.MultiTreeSearcher.EVENT_STOP);
});
this.searcher.on(BI.Searcher.EVENT_CHANGE, function () {
self.fireEvent(BI.MultiTreeSearcher.EVENT_CHANGE, arguments);
});
},
adjustView: function () {
this.searcher.adjustView();
},
setAdapter: function (adapter) {
this.searcher.setAdapter(adapter);
},
isSearching: function () {
return this.searcher.isSearching();
},
stopSearch: function () {
this.searcher.stopSearch();
},
getKeyword: function () {
return this.editor.getValue();
},
hasMatched: function () {
return this.searcher.hasMatched();
},
hasChecked: function () {
return this.searcher.getView() && this.searcher.getView().hasChecked();
},
setState: function (ob) {
ob || (ob = {});
ob.value || (ob.value = []);
if (ob.type === BI.Selection.All) {
this.editor.setState(BI.size(ob.value) > 0 ? BI.Selection.Multi : BI.Selection.All);
} else {
this.editor.setState(BI.size(ob.value) > 0 ? BI.Selection.Multi : BI.Selection.None);
}
},
setValue: function (ob) {
this.setState(ob);
this.searcher.setValue(ob);
},
getKey: function () {
return this.editor.getValue();
},
getValue: function () {
return this.searcher.getValue();
},
populate: function (items) {
this.searcher.populate.apply(this.searcher, arguments);
}
});
BI.MultiTreeSearcher.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.MultiTreeSearcher.EVENT_CHANGE = "EVENT_CHANGE";
BI.MultiTreeSearcher.EVENT_START = "EVENT_START";
BI.MultiTreeSearcher.EVENT_STOP = "EVENT_STOP";
BI.MultiTreeSearcher.EVENT_PAUSE = "EVENT_PAUSE";
BI.shortcut('bi.multi_tree_searcher', BI.MultiTreeSearcher);//小于号的值为:0,小于等于号的值为:1
//closeMIn:最小值的符号,closeMax:最大值的符号
/**
* Created by roy on 15/9/17.
*
*/
BI.NumericalInterval = BI.inherit(BI.Single, {
constants: {
typeError: "typeBubble",
numberError: "numberBubble",
signalError: "signalBubble",
editorWidth: 114,
columns: 5,
width: 30,
rows: 1,
numberErrorCls: "number-error",
border: 1,
less: 0,
less_equal: 1,
numTip: ""
},
_defaultConfig: function () {
var conf = BI.NumericalInterval.superclass._defaultConfig.apply(this, arguments)
return BI.extend(conf, {
extraCls: "bi-numerical-interval",
height: 25,
validation: "valid"
})
},
_init: function () {
var self = this, c = this.constants, o = this.options;
BI.NumericalInterval.superclass._init.apply(this, arguments)
this.smallEditor = BI.createWidget({
type: "bi.editor",
height: o.height - 2,
watermark: BI.i18nText("BI-Basic_Unrestricted"),
allowBlank: true,
value: o.min,
level: "warning",
tipType: "warning",
quitChecker: function () {
return false;
},
validationChecker: function (v) {
if (!BI.isNumeric(v)) {
self.smallEditorBubbleType = c.typeError;
return false;
}
return true;
},
cls: "numerical-interval-small-editor bi-border-top bi-border-bottom bi-border-left"
});
this.smallTip = BI.createWidget({
type: "bi.label",
text: o.numTip,
height: o.height - 2,
invisible: true
});
BI.createWidget({
type: "bi.absolute",
element: this.smallEditor.element,
items: [{
el: this.smallTip,
top: 0,
right: 5
}]
});
this.bigEditor = BI.createWidget({
type: "bi.editor",
height: o.height - 2,
watermark: BI.i18nText("BI-Basic_Unrestricted"),
allowBlank: true,
value: o.max,
level: "warning",
tipType: "warning",
quitChecker: function () {
return false;
},
validationChecker: function (v) {
if (!BI.isNumeric(v)) {
self.bigEditorBubbleType = c.typeError;
return false;
}
return true;
},
cls: "numerical-interval-big-editor bi-border-top bi-border-bottom bi-border-right"
});
this.bigTip = BI.createWidget({
type: "bi.label",
text: o.numTip,
height: o.height - 2,
invisible: true
});
BI.createWidget({
type: "bi.absolute",
element: this.bigEditor.element,
items: [{
el: this.bigTip,
top: 0,
right: 5
}]
});
//this.smallCombo = BI.createWidget({
// type: "bi.numerical_interval_combo",
// cls: "numerical-interval-small-combo",
// height: o.height,
// value: o.closemin ? 1 : 0,
// offsetStyle: "left"
//});
//
//this.bigCombo = BI.createWidget({
// type: "bi.numerical_interval_combo",
// cls: "numerical-interval-big-combo",
// height: o.height,
// value: o.closemax ? 1 : 0,
// offsetStyle: "left"
//});
this.smallCombo = BI.createWidget({
type: "bi.icon_combo",
cls: "numerical-interval-small-combo bi-border",
height: o.height - 2,
items: [{
text: "(" + BI.i18nText("BI-Less_Than") + ")",
iconClass: "less-font",
value: 0
}, {
text: "(" + BI.i18nText("BI-Less_And_Equal") + ")",
value: 1,
iconClass: "less-equal-font"
}]
});
if (o.closemin === true) {
this.smallCombo.setValue(1);
} else {
this.smallCombo.setValue(0);
}
this.bigCombo = BI.createWidget({
type: "bi.icon_combo",
cls: "numerical-interval-big-combo bi-border",
height: o.height - 2,
items: [{
text: "(" + BI.i18nText("BI-Less_Than") + ")",
iconClass: "less-font",
value: 0
}, {
text: "(" + BI.i18nText("BI-Less_And_Equal") + ")",
value: 1,
iconClass: "less-equal-font"
}]
});
if (o.closemax === true) {
this.bigCombo.setValue(1);
} else {
this.bigCombo.setValue(0);
}
this.label = BI.createWidget({
type: "bi.label",
text: BI.i18nText("BI-Basic_Value"),
textHeight: o.height - c.border * 2,
width: c.width - c.border * 2,
height: o.height - c.border * 2,
level: "warning",
tipType: "warning"
});
this.left = BI.createWidget({
type: "bi.htape",
items: [{
el: self.smallEditor
}, {
el: self.smallCombo,
width: c.width - c.border * 2
}]
});
this.right = BI.createWidget({
type: "bi.htape",
items: [{
el: self.bigCombo,
width: c.width - c.border * 2
}, {
el: self.bigEditor
}]
});
BI.createWidget({
element: self,
type: "bi.center",
hgap: 15,
height: o.height,
items: [
{
type: "bi.absolute",
items: [{
el: self.left,
left: -15,
right: 0,
top: 0,
bottom: 0
}]
}, {
type: "bi.absolute",
items: [{
el: self.right,
left: 0,
right: -15,
top: 0,
bottom: 0
}]
}
]
});
BI.createWidget({
element: self,
type: "bi.horizontal_auto",
items: [
self.label
]
});
self._setValidEvent(self.bigEditor, c.bigEditor);
self._setValidEvent(self.smallEditor, c.smallEditor);
self._setErrorEvent(self.bigEditor, c.bigEditor);
self._setErrorEvent(self.smallEditor, c.smallEditor);
self._setBlurEvent(self.bigEditor);
self._setBlurEvent(self.smallEditor);
self._setFocusEvent(self.bigEditor);
self._setFocusEvent(self.smallEditor);
self._setComboValueChangedEvent(self.bigCombo);
self._setComboValueChangedEvent(self.smallCombo);
self._setEditorValueChangedEvent(self.bigEditor);
self._setEditorValueChangedEvent(self.smallEditor);
},
_checkValidation: function () {
var self = this, c = this.constants, o = this.options;
self._setTitle("");
BI.Bubbles.hide(c.typeError);
BI.Bubbles.hide(c.numberError);
BI.Bubbles.hide(c.signalError);
if (!self.smallEditor.isValid() || !self.bigEditor.isValid()) {
self.element.removeClass("number-error");
o.validation = "invalid";
return c.typeError;
} else {
if (BI.isEmptyString(self.smallEditor.getValue()) || BI.isEmptyString(self.bigEditor.getValue())) {
self.element.removeClass("number-error");
o.validation = "valid";
return "";
} else {
var smallValue = parseFloat(self.smallEditor.getValue()), bigValue = parseFloat(self.bigEditor.getValue()),
bigComboValue = self.bigCombo.getValue(), smallComboValue = self.smallCombo.getValue();
if (bigComboValue[0] === c.less_equal && smallComboValue[0] === c.less_equal) {
if (smallValue > bigValue) {
self.element.addClass("number-error");
o.validation = "invalid";
return c.numberError;
} else {
self.element.removeClass("number-error");
o.validation = "valid";
return "";
}
} else {
if (smallValue > bigValue) {
self.element.addClass("number-error");
o.validation = "invalid";
return c.numberError;
} else if (smallValue === bigValue) {
self.element.addClass("number-error");
o.validation = "invalid";
return c.signalError;
} else {
self.element.removeClass("number-error");
o.validation = "valid";
return "";
}
}
}
}
},
_setTitle: function (v) {
var self = this;
self.bigEditor.setTitle(v);
self.smallEditor.setTitle(v);
self.label.setTitle(v);
},
_setFocusEvent: function (w) {
var self = this, c = this.constants;
w.on(BI.Editor.EVENT_FOCUS, function () {
self._setTitle("");
switch (self._checkValidation()) {
case c.typeError:
BI.Bubbles.show(c.typeError, BI.i18nText("BI-Numerical_Interval_Input_Data"), self, {
offsetStyle: "center"
});
break;
case c.numberError:
BI.Bubbles.show(c.numberError, BI.i18nText("BI-Numerical_Interval_Number_Value"), self, {
offsetStyle: "center"
});
break;
case c.signalError:
BI.Bubbles.show(c.signalError, BI.i18nText("BI-Numerical_Interval_Signal_Value"), self, {
offsetStyle: "center"
});
break;
default :
return
}
})
},
_setBlurEvent: function (w) {
var c = this.constants, self = this;
w.on(BI.Editor.EVENT_BLUR, function () {
BI.Bubbles.hide(c.typeError);
BI.Bubbles.hide(c.numberError);
BI.Bubbles.hide(c.signalError);
switch (self._checkValidation()) {
case c.typeError:
self._setTitle(BI.i18nText("BI-Numerical_Interval_Input_Data"));
break;
case c.numberError:
self._setTitle(BI.i18nText("BI-Numerical_Interval_Number_Value"));
break;
case c.signalError:
self._setTitle(BI.i18nText("BI-Numerical_Interval_Signal_Value"));
break;
default:
self._setTitle("");
}
})
},
_setErrorEvent: function (w) {
var c = this.constants, self = this
w.on(BI.Editor.EVENT_ERROR, function () {
self._checkValidation();
BI.Bubbles.show(c.typeError, BI.i18nText("BI-Numerical_Interval_Input_Data"), self, {
offsetStyle: "center"
});
self.fireEvent(BI.NumericalInterval.EVENT_ERROR);
})
},
_setValidEvent: function (w) {
var self = this, c = this.constants;
w.on(BI.Editor.EVENT_VALID, function () {
switch (self._checkValidation()) {
case c.numberError:
BI.Bubbles.show(c.numberError, BI.i18nText("BI-Numerical_Interval_Number_Value"), self, {
offsetStyle: "center"
});
self.fireEvent(BI.NumericalInterval.EVENT_ERROR);
break;
case c.signalError:
BI.Bubbles.show(c.signalError, BI.i18nText("BI-Numerical_Interval_Signal_Value"), self, {
offsetStyle: "center"
});
self.fireEvent(BI.NumericalInterval.EVENT_ERROR);
break;
default:
self.fireEvent(BI.NumericalInterval.EVENT_VALID);
}
})
},
_setEditorValueChangedEvent: function (w) {
var self = this, c = this.constants;
w.on(BI.Editor.EVENT_CHANGE, function () {
switch (self._checkValidation()) {
case c.typeError:
BI.Bubbles.show(c.typeError, BI.i18nText("BI-Numerical_Interval_Input_Data"), self, {
offsetStyle: "center"
});
break;
case c.numberError:
BI.Bubbles.show(c.numberError, BI.i18nText("BI-Numerical_Interval_Number_Value"), self, {
offsetStyle: "center"
});
break;
case c.signalError:
BI.Bubbles.show(c.signalError, BI.i18nText("BI-Numerical_Interval_Signal_Value"), self, {
offsetStyle: "center"
});
break;
default :
break;
}
self.fireEvent(BI.NumericalInterval.EVENT_CHANGE);
});
},
_setComboValueChangedEvent: function (w) {
var self = this, c = this.constants;
w.on(BI.IconCombo.EVENT_CHANGE, function () {
switch (self._checkValidation()) {
case c.typeError:
self._setTitle(BI.i18nText("BI-Numerical_Interval_Input_Data"));
self.fireEvent(BI.NumericalInterval.EVENT_ERROR);
break;
case c.numberError:
self._setTitle(BI.i18nText("BI-Numerical_Interval_Number_Value"));
self.fireEvent(BI.NumericalInterval.EVENT_ERROR);
break;
case c.signalError:
self._setTitle(BI.i18nText("BI-Numerical_Interval_Signal_Value"));
self.fireEvent(BI.NumericalInterval.EVENT_ERROR);
break;
default :
self.fireEvent(BI.NumericalInterval.EVENT_CHANGE);
self.fireEvent(BI.NumericalInterval.EVENT_VALID);
}
})
},
isStateValid: function () {
return this.options.validation === "valid";
},
setMinEnable: function (b) {
this.smallEditor.setEnable(b);
},
setCloseMinEnable: function (b) {
this.smallCombo.setEnable(b);
},
setMaxEnable: function (b) {
this.bigEditor.setEnable(b);
},
setCloseMaxEnable: function (b) {
this.bigCombo.setEnable(b);
},
showNumTip: function () {
this.smallTip.setVisible(true);
this.bigTip.setVisible(true);
},
hideNumTip: function () {
this.smallTip.setVisible(false);
this.bigTip.setVisible(false);
},
setNumTip: function(numTip) {
this.smallTip.setText(numTip);
this.bigTip.setText(numTip);
},
getNumTip: function() {
return this.smallTip.getText();
},
setValue: function (data) {
data = data || {};
var self = this, combo_value;
if (BI.isNumeric(data.min) || BI.isEmptyString(data.min)) {
self.smallEditor.setValue(data.min);
}
if (!BI.isNotNull(data.min)) {
self.smallEditor.setValue("");
}
if (BI.isNumeric(data.max) || BI.isEmptyString(data.max)) {
self.bigEditor.setValue(data.max);
}
if (!BI.isNotNull(data.max)) {
self.bigEditor.setValue("");
}
if (!BI.isNull(data.closemin)) {
if (data.closemin === true) {
combo_value = 1
} else {
combo_value = 0
}
self.smallCombo.setValue(combo_value);
}
if (!BI.isNull(data.closemax)) {
if (data.closemax === true) {
combo_value = 1
} else {
combo_value = 0
}
self.bigCombo.setValue(combo_value);
}
},
getValue: function () {
var self = this, value = {}, minComboValue = self.smallCombo.getValue(), maxComboValue = self.bigCombo.getValue();
value.min = self.smallEditor.getValue();
value.max = self.bigEditor.getValue();
if (minComboValue[0] === 0) {
value.closemin = false
} else {
value.closemin = true
}
if (maxComboValue[0] === 0) {
value.closemax = false
} else {
value.closemax = true
}
return value;
}
});
BI.NumericalInterval.EVENT_CHANGE = "EVENT_CHANGE";
BI.NumericalInterval.EVENT_VALID = "EVENT_VALID";
BI.NumericalInterval.EVENT_ERROR = "EVENT_ERROR";
BI.shortcut("bi.numerical_interval", BI.NumericalInterval);/**
*
* 表格
*
* Created by GUY on 2015/9/22.
* @class BI.PageTableCell
* @extends BI.Single
*/
BI.PageTableCell = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.PageTableCell.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-page-table-cell",
text: "",
title: ""
})
},
_init: function () {
BI.PageTableCell.superclass._init.apply(this, arguments);
var label = BI.createWidget({
type: "bi.label",
element: this,
textAlign: "left",
whiteSpace: "nowrap",
height: this.options.height,
text: this.options.text,
title: this.options.title,
value: this.options.value,
lgap: 5,
rgap: 5
});
if (BI.isNotNull(this.options.styles) && BI.isObject(this.options.styles)) {
this.element.css(this.options.styles);
}
}
});
BI.shortcut("bi.page_table_cell", BI.PageTableCell);/**
* 分页表格
*
* Created by GUY on 2016/2/15.
* @class BI.PageTable
* @extends BI.Widget
*/
BI.PageTable = BI.inherit(BI.Widget, {
_const: {
scrollWidth: 18,
minScrollWidth: 100
},
_defaultConfig: function () {
return BI.extend(BI.PageTable.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-page-table",
el: {
type: "bi.sequence_table"
},
pager: {
horizontal: {
pages: false, //总页数
curr: 1, //初始化当前页, pages为数字时可用
hasPrev: BI.emptyFn,
hasNext: BI.emptyFn,
firstPage: 1,
lastPage: BI.emptyFn
},
vertical: {
pages: false, //总页数
curr: 1, //初始化当前页, pages为数字时可用
hasPrev: BI.emptyFn,
hasNext: BI.emptyFn,
firstPage: 1,
lastPage: BI.emptyFn
}
},
itemsCreator: BI.emptyFn,
isNeedFreeze: false,//是否需要冻结单元格
freezeCols: [], //冻结的列号,从0开始,isNeedFreeze为true时生效
isNeedMerge: false,//是否需要合并单元格
mergeCols: [], //合并的单元格列号
mergeRule: BI.emptyFn,
columnSize: [],
minColumnSize: [],
maxColumnSize: [],
headerRowSize: 25,
rowSize: 25,
regionColumnSize: [],
headerCellStyleGetter: BI.emptyFn,
summaryCellStyleGetter: BI.emptyFn,
sequenceCellStyleGetter: BI.emptyFn,
header: [],
items: [], //二维数组
//交叉表头
crossHeader: [],
crossItems: []
});
},
_init: function () {
BI.PageTable.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.hCurr = 1;
this.vCurr = 1;
this.table = BI.createWidget(o.el, {
type: "bi.sequence_table",
width: o.width,
height: o.height && o.height - 30,
isNeedResize: true,
isResizeAdapt: false,
isNeedFreeze: o.isNeedFreeze,
freezeCols: o.freezeCols,
isNeedMerge: o.isNeedMerge,
mergeCols: o.mergeCols,
mergeRule: o.mergeRule,
columnSize: o.columnSize,
minColumnSize: o.minColumnSize,
maxColumnSize: o.maxColumnSize,
headerRowSize: o.headerRowSize,
rowSize: o.rowSize,
regionColumnSize: o.regionColumnSize,
headerCellStyleGetter: o.headerCellStyleGetter,
summaryCellStyleGetter: o.summaryCellStyleGetter,
sequenceCellStyleGetter: o.sequenceCellStyleGetter,
header: o.header,
items: o.items,
//交叉表头
crossHeader: o.crossHeader,
crossItems: o.crossItems
});
this.table.on(BI.Table.EVENT_TABLE_SCROLL, function () {
self.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, function () {
o.regionColumnSize = this.getRegionColumnSize();
o.columnSize = this.getColumnSize();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, function () {
o.regionColumnSize = this.getRegionColumnSize();
o.columnSize = this.getColumnSize();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, arguments);
});
this.pager = BI.createWidget(o.pager, {
type: "bi.direction_pager",
height: 30
});
this.pager.on(BI.Pager.EVENT_CHANGE, function () {
var vpage = this.getVPage && this.getVPage();
if (BI.isNull(vpage)) {
vpage = this.getCurrentPage();
}
var hpage = this.getHPage && this.getHPage();
o.itemsCreator({
vpage: vpage,
hpage: hpage
}, function (items, header, crossItems, crossHeader) {
self.table.setVPage ? self.table.setVPage(vpage) : self.table.setValue(vpage);
self.table.setHPage && self.table.setHPage(hpage);
self.populate.apply(self, arguments);
});
});
BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: this.table,
left: 0,
top: 0
}, {
el: this.pager,
left: 0,
right: 0,
bottom: 0
}]
})
},
setHPage: function (v) {
this.hCurr = v;
this.pager.setHPage && this.pager.setHPage(v);
this.table.setHPage && this.table.setHPage(v);
},
setVPage: function (v) {
this.vCurr = v;
this.pager.setVPage && this.pager.setVPage(v);
this.table.setVPage && this.table.setVPage(v);
},
getHPage: function () {
var hpage = this.pager.getHPage && this.pager.getHPage();
if (BI.isNotNull(hpage)) {
return hpage;
}
hpage = this.pager.getCurrentPage && this.pager.getCurrentPage();
if (BI.isNotNull(hpage)) {
return hpage;
}
return this.hpage;
},
getVPage: function () {
var vpage = this.pager.getVPage && this.pager.getVPage();
if (BI.isNotNull(vpage)) {
return vpage;
}
vpage = this.pager.getCurrentPage && this.pager.getCurrentPage();
if (BI.isNotNull(vpage)) {
return vpage;
}
return this.vpage;
},
setWidth: function (width) {
BI.PageTable.superclass.setWidth.apply(this, arguments);
this.table.setWidth(width);
},
setHeight: function (height) {
BI.PageTable.superclass.setHeight.apply(this, arguments);
var showPager = false;
if (this.pager.alwaysShowPager) {
showPager = true;
} else if (this.pager.hasHNext && this.pager.hasHNext()) {
showPager = true;
} else if (this.pager.hasHPrev && this.pager.hasHPrev()) {
showPager = true;
} else if (this.pager.hasVNext && this.pager.hasVNext()) {
showPager = true;
} else if (this.pager.hasVPrev && this.pager.hasVPrev()) {
showPager = true;
} else if (this.pager.hasNext && this.pager.hasNext()) {
showPager = true;
} else if (this.pager.hasPrev && this.pager.hasPrev()) {
showPager = true;
}
this.table.setHeight(height - (showPager ? 30 : 0));
},
setColumnSize: function (columnSize) {
this.options.columnSize = columnSize;
this.table.setColumnSize(columnSize);
},
getColumnSize: function () {
return this.table.getColumnSize();
},
setRegionColumnSize: function (columnSize) {
this.options.columnSize = columnSize;
this.table.setRegionColumnSize(columnSize);
},
getRegionColumnSize: function () {
return this.table.getRegionColumnSize();
},
getVerticalScroll: function () {
return this.table.getVerticalScroll();
},
setLeftHorizontalScroll: function (scrollLeft) {
this.table.setLeftHorizontalScroll(scrollLeft);
},
setRightHorizontalScroll: function (scrollLeft) {
this.table.setRightHorizontalScroll(scrollLeft);
},
setVerticalScroll: function (scrollTop) {
this.table.setVerticalScroll(scrollTop);
},
restore: function () {
this.table.restore();
},
attr: function () {
BI.PageTable.superclass.attr.apply(this, arguments);
this.table.attr.apply(this.table, arguments);
},
populate: function () {
this.pager.populate();
this.table.populate.apply(this.table, arguments);
},
destroy: function () {
this.table.destroy();
this.pager && this.pager.destroy();
BI.PageTable.superclass.destroy.apply(this, arguments);
}
});
BI.shortcut('bi.page_table', BI.PageTable);/**
* 路径选择
*
* Created by GUY on 2015/12/4.
* @class BI.PathChooser
* @extends BI.Widget
*/
BI.PathChooser = BI.inherit(BI.Widget, {
_const: {
lineColor: "#d4dadd",
selectLineColor: "#3f8ce8"
},
_defaultConfig: function () {
return BI.extend(BI.PathChooser.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-path-chooser",
items: []
})
},
_init: function () {
BI.PathChooser.superclass._init.apply(this, arguments);
this.populate(this.options.items);
},
_createRegions: function (regions) {
var self = this;
this.regions = BI.createWidgets(BI.map(regions, function (i, region) {
return {
type: "bi.path_region",
title: self.texts[region] || region
}
}));
this.regionMap = {};
BI.each(regions, function (i, region) {
self.regionMap[region] = i;
});
this.container = BI.createWidget({
type: "bi.horizontal",
verticalAlign: "top",
scrollx: false,
scrolly: false,
hgap: 10,
items: this.regions
});
BI.createWidget({
type: "bi.vertical_adapt",
element: this,
scrollable: true,
hgap: 10,
items: [this.container]
});
},
getRegionIndexById: function (id) {
var node = this.store[id];
var regionType = node.get("region");
return this.regionMap[regionType];
},
_drawPath: function (start, offset, index) {
var self = this;
var starts = [];
if (BI.contains(this.start, start)) {
starts = this.start;
} else {
starts = [start];
}
BI.each(starts, function (i, s) {
BI.each(self.radios[s], function (i, rad) {
rad.setSelected(false);
});
BI.each(self.lines[s], function (i, line) {
line.attr("stroke", self._const.lineColor);
});
BI.each(self.regionIndexes[s], function (i, idx) {
self.regions[idx].reset();
});
});
BI.each(this.routes[start][index], function (i, id) {
var regionIndex = self.getRegionIndexById(id);
self.regions[regionIndex].setSelect(offset + index, id);
});
var current = BI.last(this.routes[start][index]);
while (current && this.routes[current] && this.routes[current].length === 1) {
BI.each(this.routes[current][0], function (i, id) {
var regionIndex = self.getRegionIndexById(id);
self.regions[regionIndex].setSelect(0, id);
});
this.lines[current][0].attr("stroke", self._const.selectLineColor).toFront();
current = BI.last(this.routes[current][0]);
}
this.lines[start][index].attr("stroke", self._const.selectLineColor).toFront();
this.radios[start] && this.radios[start][index] && this.radios[start][index].setSelected(true);
},
_drawRadio: function (start, offset, index, x, y) {
var self = this;
var radio = BI.createWidget({
type: "bi.radio",
cls: "path-chooser-radio",
selected: offset + index === 0,
start: start,
index: index
});
radio.on(BI.Radio.EVENT_CHANGE, function () {
self._drawPath(start, offset, index);
self.fireEvent(BI.PathChooser.EVENT_CHANGE, start, index);
});
if (!this.radios[start]) {
this.radios[start] = [];
}
this.radios[start].push(radio);
BI.createWidget({
type: "bi.absolute",
element: this.container,
items: [{
el: radio,
left: x - 6.5,
top: y - 6.5
}]
})
},
_drawLine: function (start, lines) {
var self = this;
if (!this.lines[start]) {
this.lines[start] = [];
}
if (!this.pathes[start]) {
this.pathes[start] = [];
}
var startRegionIndex = this.getRegionIndexById(start);
//start所在的位置,然后接着往下画其他的路径
var offset = this.regions[startRegionIndex].getIndexByValue(start);
BI.each(lines, function (i, line) {
self.pathes[start][i] = [];
var idx = i + offset;
var path = "";
var stop = 47.5 + 29 * idx;
var sleft = 50 + 100 * startRegionIndex;
var radioStartX = sleft, radioStartY = stop;
var etop = stop;
var endRegionIndex = self.getRegionIndexById(BI.last(line));
var endOffset = self.regions[endRegionIndex].getIndexByValue(BI.last(line));
var eleft = 50 + 100 * endRegionIndex;
if (BI.contains(self.start, start)) {
radioStartX = sleft - 50;
path += "M" + (sleft - 50) + "," + stop;
self.pathes[start][i].push({
x: sleft - 50,
y: stop
})
} else if (idx === 0) {
radioStartX = sleft + 50;
path += "M" + sleft + "," + stop;
self.pathes[start][i].push({
x: sleft,
y: stop
})
} else {
radioStartX = sleft + 50;
path += "M" + sleft + "," + 47.5 + "L" + (sleft + 50) + "," + 47.5 + "L" + (sleft + 50) + "," + stop;
self.pathes[start][i].push({
x: sleft,
y: 47.5
});
self.pathes[start][i].push({
x: sleft + 50,
y: 47.5
});
self.pathes[start][i].push({
x: sleft + 50,
y: stop
});
}
if (idx > 0) {
var endY = endOffset * 29 + 47.5;
path += "L" + (eleft - 50) + "," + etop + "L" + (eleft - 50) + "," + endY + "L" + eleft + "," + endY;
self.pathes[start][i].push({
x: eleft - 50,
y: etop
});
self.pathes[start][i].push({
x: eleft - 50,
y: endY
});
self.pathes[start][i].push({
x: eleft,
y: endY
});
} else {
path += "L" + eleft + "," + etop;
self.pathes[start][i].push({
x: eleft,
y: etop
});
}
var graph = self.svg.path(path)
.attr({
stroke: idx === 0 ? self._const.selectLineColor : self._const.lineColor,
'stroke-dasharray': '-'
});
self.lines[start].push(graph);
if (lines.length > 1) {
self.lines[start][0].toFront();
}
//第一个元素无论有多少个都要显示radio
if (BI.contains(self.start, start)) {
self.lines[self.regions[0].getValueByIndex(0)][0].toFront();
}
if (lines.length > 1 || BI.contains(self.start, start)) {
self._drawRadio(start, offset, i, radioStartX, radioStartY);
}
});
},
_drawLines: function (routes) {
var self = this;
this.lines = {};
this.pathes = {};
this.radios = {};
this.regionIndexes = {};
BI.each(routes, function (k, route) {
if (!self.regionIndexes[k]) {
self.regionIndexes[k] = [];
}
BI.each(route, function (i, rs) {
BI.each(rs, function (j, id) {
var regionIndex = self.getRegionIndexById(id);
if (!BI.contains(self.regionIndexes[k], regionIndex)) {
self.regionIndexes[k].push(regionIndex);
}
});
})
});
BI.each(routes, function (k, route) {
self._drawLine(k, route);
});
},
_pushNodes: function (nodes) {
var self = this;
var indexes = [];
for (var i = 0; i < nodes.length; i++) {
var id = nodes[i];
var index = self.getRegionIndexById(id);
indexes.push(index);
var region = self.regions[index];
if (i === nodes.length - 1) {
if (!region.hasItem(id)) {
region.addItem(id, self.texts[id]);
}
break;
}
if (i > 0 || BI.contains(self.start, id)) {
region.addItem(id, self.texts[id]);
}
}
for (var i = BI.first(indexes); i < BI.last(indexes); i++) {
if (!BI.contains(indexes, i)) {
self.regions[i].addItem("");
}
}
},
_createNodes: function () {
var self = this, o = this.options;
this.store = {};
this.texts = {};
this.start = [];
this.end = [];
BI.each(o.items, function (i, item) {
self.start.push(BI.first(item).value);
self.end.push(BI.last(item).value);
});
this.start = BI.uniq(this.start);
this.end = BI.uniq(this.end);
var regions = [];
var tree = new BI.Tree();
var branches = {}, max = 0;
BI.each(o.items, function (i, items) {
BI.each(items, function (j, item) {
if (!BI.has(branches, item.value)) {
branches[item.value] = 0;
}
branches[item.value]++;
max = Math.max(max, branches[item.value]);
var prev = {};
if (j > 0) {
prev = items[j - 1];
}
var parent = self.store[prev.value || ""];
var node = self.store[item.value] || new BI.Node(item.value);
node.set(item);
self.store[item.value] = node;
self.texts[item.value] = item.text;
self.texts[item.region] = item.regionText;
parent = BI.isNull(parent) ? tree.getRoot() : parent;
if (parent.getChildIndex(item.value) === -1) {
tree.addNode(parent, node);
}
})
});
//算出区域列表
tree.traverse(function (node) {
BI.each(node.getChildren(), function (i, child) {
if (BI.contains(regions, child.get("region"))) {
var index1 = BI.indexOf(regions, node.get("region"));
var index2 = BI.indexOf(regions, child.get("region"));
//交换区域
if (index1 > index2) {
var t = regions[index2];
for (var j = index2; j < index1; j++) {
regions[j] = regions[j + 1];
}
regions[index1] = t;
}
} else {
regions.push(child.get("region"));
}
});
});
this._createRegions(regions);
//算出节点
BI.each(branches, function (k, branch) {
if (branch < max) {
delete branches[k];
}
});
//过滤节点
var nodes = [];
var n = tree.getRoot();
while (n && n.getChildrenLength() === 1) {
if (BI.has(branches, n.getChildren()[0].id)) {
delete branches[n.getChildren()[0].id];
n = n.getChildren()[0];
} else {
n = null;
}
}
tree.traverse(function (node) {
if (BI.has(branches, node.id)) {
nodes.push(node.id);
delete branches[node.id];
}
});
//填充节点
var routes = {};
var s, e;
for (var i = 0, len = nodes.length; i < len + 1; i++) {
if (len === 0) {
s = [];
BI.each(this.start, function (i, id) {
s.push(tree.search(id));
});
e = [];
BI.each(this.end, function (i, id) {
e.push(tree.search(id));
});
} else if (i === len) {
s = e;
e = [];
BI.each(this.end, function (i, id) {
e.push(tree.search(id));
});
} else if (i === 0) {
s = [];
BI.each(this.start, function (i, id) {
s.push(tree.search(id));
});
e = [tree.search(nodes[i])];
} else {
s = [tree.search(e[0] || tree.getRoot(), nodes[i - 1])];
e = [tree.search(s[0], nodes[i])];
}
BI.each(s, function (i, n) {
tree._recursion(n, [n.id], function (node, route) {
if (BI.contains(e, node)) {
if (!routes[n.id]) {
routes[n.id] = [];
}
routes[n.id].push(route);
self._pushNodes(route);
if (e.length <= 1) {
return true;
}
}
})
});
}
this.routes = routes;
this._drawLines(routes);
},
_unselectAllPath: function () {
var self = this;
BI.each(this.radios, function (idx, rad) {
BI.each(rad, function (i, r) {
r.setSelected(false);
});
});
BI.each(this.lines, function (idx, line) {
BI.each(line, function (i, li) {
li.attr("stroke", self._const.lineColor);
});
});
BI.each(this.regions, function (idx, region) {
region.reset();
});
},
populate: function (items) {
this.options.items = items || [];
var self = this;
this.empty();
if (this.options.items.length <= 0) {
return;
}
this.svg = BI.createWidget({
type: "bi.svg"
});
this._createNodes();
BI.createWidget({
type: "bi.absolute",
element: this.container,
items: [{
el: this.svg,
top: 0,
left: 0,
right: 0,
bottom: 0
}]
});
},
setValue: function (v) {
this._unselectAllPath();
var nodes = BI.keys(this.routes), self = this;
var result = [], array = [];
BI.each(v, function (i, val) {
if (BI.contains(nodes, val)) {
if (array.length > 0) {
array.push(val);
result.push(array);
array = [];
}
}
array.push(val);
});
if (array.length > 0) {
result.push(array);
}
//画这n条路径
BI.each(result, function (idx, path) {
var start = path[0];
var index = BI.findIndex(self.routes[start], function (idx, p) {
if (BI.isEqual(path, p)) {
return true;
}
});
if (index >= 0) {
var startRegionIndex = self.getRegionIndexById(start);
var offset = self.regions[startRegionIndex].getIndexByValue(start);
self._drawPath(start, offset, index);
}
});
},
getValue: function () {
var path = [];
BI.each(this.regions, function (i, region) {
var val = region.getValue();
if (BI.isKey(val)) {
path.push(val);
}
});
return path;
}
});
BI.PathChooser.EVENT_CHANGE = "PathChooser.EVENT_CHANGE";
BI.shortcut("bi.path_chooser", BI.PathChooser);/**
* 路径选择区域
*
* Created by GUY on 2015/12/4.
* @class BI.PathRegion
* @extends BI.Widget
*/
BI.PathRegion = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.PathRegion.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-path-region bi-background",
width: 80,
title: ""
})
},
_init: function () {
BI.PathRegion.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.zIndex = 100;
var title = BI.createWidget({
type: "bi.label",
text: o.title,
title: o.title,
height: 30
});
title.element.css("zIndex", this.zIndex--);
this.items = [];
this.vertical = BI.createWidget({
type: "bi.vertical",
element: this,
bgap: 5,
hgap: 10,
items: [title]
})
},
hasItem: function (val) {
return BI.any(this.items, function (i, item) {
return val === item.getValue();
});
},
addItem: function (value, text) {
if (BI.isKey(value)) {
var label = BI.createWidget({
type: "bi.label",
cls: "path-region-label bi-card bi-border bi-list-item-select",
text: text,
value: value,
title: text || value,
height: 22
});
} else {
var label = BI.createWidget({
type: "bi.layout",
height: 24
});
}
label.element.css("zIndex", this.zIndex--);
this.items.push(label);
this.vertical.addItem(label);
if (this.items.length === 1) {
this.setSelect(0, value);
}
},
reset: function () {
BI.each(this.items, function (i, item) {
item.element.removeClass("active");
});
},
setSelect: function (index, value) {
this.reset();
if (this.items.length <= 0) {
return;
}
if (this.items.length === 1) {
this.items[0].element.addClass("active");
return;
}
if (this.items[index].attr("value") === value) {
this.items[index].element.addClass("active");
}
},
setValue: function (value) {
this.setSelect(this.getIndexByValue(value), value);
},
getValueByIndex: function (idx) {
return this.items[idx].attr("value");
},
getIndexByValue: function (value) {
return BI.findIndex(this.items, function (i, item) {
return item.attr("value") === value;
});
},
getValue: function () {
var res;
BI.any(this.items, function (i, item) {
if (item.element.hasClass("active")) {
res = item.getValue();
return true;
}
});
return res;
}
});
BI.PathRegion.EVENT_CHANGE = "PathRegion.EVENT_CHANGE";
BI.shortcut("bi.path_region", BI.PathRegion);/**
* 预览表列
*
* Created by GUY on 2015/12/25.
* @class BI.PreviewTableCell
* @extends BI.Widget
*/
BI.PreviewTableCell = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.PreviewTableCell.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-preview-table-cell",
text: ""
});
},
_init: function () {
BI.PreviewTableCell.superclass._init.apply(this, arguments);
var self = this, o = this.options;
BI.createWidget({
type: "bi.label",
element: this,
textAlign: "left",
whiteSpace: "normal",
height: this.options.height,
text: this.options.text,
value: this.options.value
})
}
});
BI.shortcut('bi.preview_table_cell', BI.PreviewTableCell);/**
* 预览表
*
* Created by GUY on 2015/12/25.
* @class BI.PreviewTableHeaderCell
* @extends BI.Widget
*/
BI.PreviewTableHeaderCell = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.PreviewTableHeaderCell.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-preview-table-header-cell",
text: ""
});
},
_init: function () {
BI.PreviewTableHeaderCell.superclass._init.apply(this, arguments);
var self = this, o = this.options;
BI.createWidget({
type: "bi.label",
element: this,
textAlign: "left",
whiteSpace: "normal",
height: this.options.height,
text: this.options.text,
value: this.options.value
})
}
});
BI.shortcut('bi.preview_table_header_cell', BI.PreviewTableHeaderCell);/**
* 预览表
*
* Created by GUY on 2015/12/25.
* @class BI.PreviewTable
* @extends BI.Widget
*/
BI.PreviewTable = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.PreviewTable.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-preview-table",
isNeedFreeze: false,
freezeCols: [],
rowSize: null,
columnSize: [],
headerRowSize: 30,
header: [],
items: []
});
},
_init: function () {
BI.PreviewTable.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.table = BI.createWidget({
type: "bi.table_view",
element: this,
isNeedResize: false,
isResizeAdapt: false,
isNeedFreeze: o.isNeedFreeze,
freezeCols: o.freezeCols,
rowSize: o.rowSize,
columnSize: o.columnSize,
headerRowSize: o.headerRowSize,
header: BI.map(o.header, function (i, items) {
return BI.map(items, function (j, item) {
return BI.extend({
type: "bi.preview_table_header_cell"
}, item);
});
}),
items: BI.map(o.items, function (i, items) {
return BI.map(items, function (j, item) {
return BI.extend({
type: "bi.preview_table_cell"
}, item);
});
})
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_INIT, function () {
self._adjustColumns();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_INIT, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_RESIZE, function () {
self._adjustColumns();
});
},
//是否有自适应调节的列,即列宽为""
_hasAdaptCol: function (columnSize) {
return BI.any(columnSize, function (i, size) {
return size === "";
})
},
_isPercentage: function (columnSize) {
return columnSize[0] <= 1;
},
_adjustColumns: function () {
var self = this, o = this.options;
if (o.isNeedFreeze === true) {
//如果存在百分比的情况
if (this._isPercentage(o.columnSize)) {
if (this._hasAdaptCol(o.columnSize)) {
var findCols = [], remain = 0;
BI.each(o.columnSize, function (i, size) {
if (size === "") {
findCols.push(i);
} else {
remain += size;
}
});
remain = 1 - remain;
var average = remain / findCols.length;
BI.each(findCols, function (i, col) {
o.columnSize[col] = average;
});
}
var isRight = BI.first(o.freezeCols) !== 0;
var freezeSize = [], notFreezeSize = [];
BI.each(o.columnSize, function (i, size) {
if (o.freezeCols.contains(i)) {
freezeSize.push(size);
} else {
notFreezeSize.push(size);
}
});
var sumFreezeSize = BI.sum(freezeSize), sumNotFreezeSize = BI.sum(notFreezeSize);
BI.each(freezeSize, function (i, size) {
freezeSize[i] = size / sumFreezeSize;
});
BI.each(notFreezeSize, function (i, size) {
notFreezeSize[i] = size / sumNotFreezeSize;
});
this.table.setRegionColumnSize(isRight ? ["fill", sumFreezeSize] : [sumFreezeSize, "fill"]);
this.table.setColumnSize(isRight ? (notFreezeSize.concat(freezeSize)) : (freezeSize.concat(notFreezeSize)));
}
} else {
//如果存在自适应宽度的列或者是百分比计算的列,需要将整个表宽设为100%
if (this._hasAdaptCol(o.columnSize) || this._isPercentage(o.columnSize)) {
this.table.setRegionColumnSize(["100%"]);
}
}
},
setColumnSize: function (columnSize) {
return this.table.setColumnSize(columnSize);
},
getColumnSize: function () {
return this.table.getColumnSize();
},
getCalculateColumnSize: function () {
return this.table.getCalculateColumnSize();
},
setHeaderColumnSize: function (columnSize) {
return this.table.setHeaderColumnSize(columnSize);
},
setRegionColumnSize: function (columnSize) {
return this.table.setRegionColumnSize(columnSize);
},
getRegionColumnSize: function () {
return this.table.getRegionColumnSize();
},
getCalculateRegionColumnSize: function () {
return this.table.getCalculateRegionColumnSize();
},
getCalculateRegionRowSize: function () {
return this.table.getCalculateRegionRowSize();
},
getClientRegionColumnSize: function () {
return this.table.getClientRegionColumnSize();
},
getScrollRegionColumnSize: function () {
return this.table.getScrollRegionColumnSize()
},
getScrollRegionRowSize: function () {
return this.table.getScrollRegionRowSize()
},
hasVerticalScroll: function () {
return this.table.hasVerticalScroll();
},
setVerticalScroll: function (scrollTop) {
return this.table.setVerticalScroll(scrollTop);
},
setLeftHorizontalScroll: function (scrollLeft) {
return this.table.setLeftHorizontalScroll(scrollLeft)
},
setRightHorizontalScroll: function (scrollLeft) {
return this.table.setRightHorizontalScroll(scrollLeft);
},
getVerticalScroll: function () {
return this.table.getVerticalScroll();
},
getLeftHorizontalScroll: function () {
return this.table.getLeftHorizontalScroll();
},
getRightHorizontalScroll: function () {
return this.table.getRightHorizontalScroll();
},
getColumns: function () {
return this.table.getColumns();
},
populate: function (items, header) {
this.table.populate(items, header);
}
});
BI.PreviewTable.EVENT_CHANGE = "PreviewTable.EVENT_CHANGE";
BI.shortcut('bi.preview_table', BI.PreviewTable);/**
* 季度下拉框
*
* Created by GUY on 2015/8/28.
* @class BI.QuarterCombo
* @extends BI.Widget
*/
BI.QuarterCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.QuarterCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-quarter-combo",
behaviors: {},
height: 25
});
},
_init: function () {
BI.QuarterCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.storeValue = "";
this.trigger = BI.createWidget({
type: "bi.quarter_trigger"
});
this.trigger.on(BI.QuarterTrigger.EVENT_FOCUS, function () {
self.storeValue = this.getKey();
});
this.trigger.on(BI.QuarterTrigger.EVENT_CHANGE, function () {
self.combo.isViewVisible() && self.combo.hideView();
});
this.trigger.on(BI.QuarterTrigger.EVENT_START, function () {
self.combo.isViewVisible() && self.combo.hideView();
});
this.trigger.on(BI.QuarterTrigger.EVENT_STOP, function () {
if (!self.combo.isViewVisible()) {
self.combo.showView();
}
});
this.trigger.on(BI.QuarterTrigger.EVENT_CONFIRM, function () {
if (self.combo.isViewVisible()) {
return;
}
if (this.getKey() && this.getKey() !== self.storeValue) {
self.setValue(this.getKey());
} else if (!this.getKey()) {
self.setValue();
}
self.fireEvent(BI.QuarterCombo.EVENT_CONFIRM);
});
this.popup = BI.createWidget({
type: "bi.quarter_popup",
behaviors: o.behaviors
});
this.popup.on(BI.QuarterPopup.EVENT_CHANGE, function () {
self.setValue(self.popup.getValue());
self.combo.hideView();
self.fireEvent(BI.QuarterCombo.EVENT_CONFIRM);
});
this.combo = BI.createWidget({
type: "bi.combo",
element: this,
isNeedAdjustHeight: false,
isNeedAdjustWidth: false,
el: this.trigger,
popup: {
minWidth: 85,
el: this.popup
}
});
this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.QuarterCombo.EVENT_BEFORE_POPUPVIEW);
});
},
setValue: function (v) {
this.trigger.setValue(v);
this.popup.setValue(v);
},
getValue: function () {
return this.popup.getValue() || "";
}
});
BI.QuarterCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.QuarterCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.shortcut('bi.quarter_combo', BI.QuarterCombo);/**
* 季度展示面板
*
* Created by GUY on 2015/9/2.
* @class BI.QuarterPopup
* @extends BI.Trigger
*/
BI.QuarterPopup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.QuarterPopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-quarter-popup",
behaviors: {}
});
},
_init: function () {
BI.QuarterPopup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
var items = [{
text: Date._QN[01],
value: 1
}, {
text: Date._QN[2],
value: 2
}, {
text: Date._QN[3],
value: 3
}, {
text: Date._QN[4],
value: 4
}];
items = BI.map(items, function (j, item) {
return BI.extend(item, {
type: "bi.text_item",
cls: "bi-list-item-active",
textAlign: "left",
whiteSpace: "nowrap",
once: false,
forceSelected: true,
height: 25
});
});
this.quarter = BI.createWidget({
type: "bi.button_group",
element: this,
behaviors: o.behaviors,
items: BI.createItems(items, {}),
layouts: [{
type: "bi.vertical"
}]
});
this.quarter.on(BI.Controller.EVENT_CHANGE, function (type) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
if (type === BI.Events.CLICK) {
self.fireEvent(BI.MonthPopup.EVENT_CHANGE);
}
})
},
getValue: function () {
return this.quarter.getValue()[0];
},
setValue: function (v) {
this.quarter.setValue([v]);
}
});
BI.QuarterPopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.quarter_popup", BI.QuarterPopup);/**
* 季度trigger
*
* Created by GUY on 2015/8/21.
* @class BI.QuarterTrigger
* @extends BI.Trigger
*/
BI.QuarterTrigger = BI.inherit(BI.Trigger, {
_const: {
hgap: 4,
vgap: 2,
triggerWidth: 30,
textWidth: 40,
errorText: BI.i18nText("BI-Quarter_Trigger_Error_Text")
},
_defaultConfig: function () {
return BI.extend(BI.QuarterTrigger.superclass._defaultConfig.apply(this, arguments), {
extraCls: "bi-quarter-trigger bi-border",
height: 25
});
},
_init: function () {
BI.QuarterTrigger.superclass._init.apply(this, arguments);
var self = this, o = this.options, c = this._const;
this.editor = BI.createWidget({
type: "bi.sign_editor",
height: o.height,
validationChecker: function (v) {
return v === "" || (BI.isPositiveInteger(v) && v >= 1 && v <= 4);
},
quitChecker: function (v) {
return false;
},
hgap: c.hgap,
vgap: c.vgap,
allowBlank: true,
errorText: c.errorText
});
this.editor.on(BI.SignEditor.EVENT_FOCUS, function () {
self.fireEvent(BI.QuarterTrigger.EVENT_FOCUS);
});
this.editor.on(BI.SignEditor.EVENT_CHANGE, function () {
self.fireEvent(BI.QuarterTrigger.EVENT_CHANGE);
});
this.editor.on(BI.SignEditor.EVENT_CONFIRM, function () {
var value = self.editor.getValue();
if (BI.isNotNull(value)) {
self.editor.setValue(value);
self.editor.setTitle(value);
}
self.fireEvent(BI.QuarterTrigger.EVENT_CONFIRM);
});
this.editor.on(BI.SignEditor.EVENT_SPACE, function () {
if (self.editor.isValid()) {
self.editor.blur();
}
});
this.editor.on(BI.SignEditor.EVENT_START, function () {
self.fireEvent(BI.QuarterTrigger.EVENT_START);
});
this.editor.on(BI.SignEditor.EVENT_STOP, function () {
self.fireEvent(BI.QuarterTrigger.EVENT_STOP);
});
BI.createWidget({
element: this,
type: 'bi.htape',
items: [
{
el: this.editor
}, {
el: {
type: "bi.text_button",
baseCls: "bi-trigger-quarter-text",
text: BI.i18nText("BI-Multi_Date_Quarter"),
width: c.textWidth
},
width: c.textWidth
}, {
el: {
type: "bi.trigger_icon_button",
width: c.triggerWidth
},
width: c.triggerWidth
}
]
});
},
setValue: function (v) {
this.editor.setState(v);
this.editor.setValue(v);
this.editor.setTitle(v);
},
getKey: function () {
return this.editor.getValue();
}
});
BI.QuarterTrigger.EVENT_FOCUS = "EVENT_FOCUS";
BI.QuarterTrigger.EVENT_CHANGE = "EVENT_CHANGE";
BI.QuarterTrigger.EVENT_START = "EVENT_START";
BI.QuarterTrigger.EVENT_STOP = "EVENT_STOP";
BI.QuarterTrigger.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.shortcut("bi.quarter_trigger", BI.QuarterTrigger);/**
* 关联视图字段Item
*
* Created by GUY on 2015/12/23.
* @class BI.RelationViewItem
* @extends BI.Widget
*/
BI.RelationViewItem = BI.inherit(BI.BasicButton, {
_defaultConfig: function () {
return BI.extend(BI.RelationViewItem.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-relation-view-item bi-list-item-active",
height: 25,
hoverIn: BI.emptyFn,
hoverOut: BI.emptyFn
});
},
_init: function () {
BI.RelationViewItem.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.element.hover(o.hoverIn, o.hoverOut);
var items = [];
if (o.isPrimary) {
items.push({
type: "bi.icon",
width: 16,
height: 16,
title: BI.i18nText("BI-Primary_Key")
});
}
items.push({
type: "bi.label",
text: o.text,
value: o.value,
height: o.height,
textAlign: "left",
width: o.isPrimary ? 70 : 90
});
BI.createWidget({
type: "bi.vertical_adapt",
element: this,
items: items,
cls: "primary-key-font",
lgap: 5
});
},
enableHover: function (opt) {
BI.RelationViewRegion.superclass.enableHover.apply(this, [{
container: "body"
}]);
},
setSelected: function (b) {
this.element[b ? "addClass" : "removeClass"]("active");
}
});
BI.shortcut('bi.relation_view_item', BI.RelationViewItem);/**
* 关联视图
*
* Created by GUY on 2015/12/22.
* @class BI.RelationView
* @extends BI.Widget
*/
BI.RelationView = BI.inherit(BI.Widget, {
_const: {
lineColor: "#c4c6c6",
selectLineColor: "#009de3"
},
_defaultConfig: function () {
return BI.extend(BI.RelationView.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-relation-view",
items: []
});
},
_init: function () {
BI.RelationView.superclass._init.apply(this, arguments);
this.populate(this.options.items);
},
_calculateWidths: function () {
var widths = [];
BI.each(this.views, function (i, items) {
BI.each(items, function (j, obj) {
if (!widths[j]) {
widths[j] = BI.MIN;
}
widths[j] = Math.max(widths[j], obj.getWidth());
})
});
return widths;
},
_calculateHeights: function () {
var heights = BI.makeArray(BI.size(this.views), BI.MIN);
BI.each(this.views, function (i, items) {
BI.each(items, function (j, obj) {
heights[i] = Math.max(heights[i], obj.getHeight());
})
});
return heights;
},
_hoverIn: function (target) {
var self = this, c = this._const;
BI.each(this.relations, function (start, rs) {
BI.each(rs, function (end, relation) {
if (relation[0].primary.value === target || relation[0].foreign.value === target) {
self.lines[start][end].attr("stroke", c.selectLineColor).toFront();
self.storeViews[start].setValue(relation[0].primary.value);
self.storeViews[end].setValue(relation[0].foreign.value);
}
});
});
},
_hoverOut: function (target) {
var self = this, c = this._const;
BI.each(this.relations, function (start, rs) {
BI.each(rs, function (end, relation) {
if (relation[0].primary.value === target || relation[0].foreign.value === target) {
self.lines[start][end].attr("stroke", c.lineColor);
self.storeViews[start].setValue([]);
self.storeViews[end].setValue([]);
}
});
});
},
previewRelationTables: function(relationTables, show) {
if (!show) {
BI.each(this.storeViews, function (i, view) {
view.toggleRegion(true);
view.setPreviewSelected(false);
});
BI.each(this.lines, function (i, lines) {
BI.each(lines, function (j, line) {
line.show();
});
});
return;
}
BI.each(this.storeViews, function (id, view) {
if (!relationTables.contains(id)) {
view.toggleRegion(false);
} else {
view.setPreviewSelected(true);
}
});
BI.each(this.lines, function (id, lines) {
BI.each(lines, function (cId, line) {
if (!relationTables.contains(id) || !relationTables.contains(cId)) {
line.hide();
}
});
});
},
populate: function (items) {
var self = this, o = this.options, c = this._const;
o.items = items || [];
this.empty();
this.svg = BI.createWidget({
type: "bi.svg"
});
//算出所有的区域和关联
var regions = this.regions = {}, relations = this.relations = {};
BI.each(items, function (i, item) {
var pr = item.primary.region, fr = item.foreign && item.foreign.region;
if (pr && !relations[pr]) {
relations[pr] = {};
}
if (pr && fr && !relations[pr][fr]) {
relations[pr][fr] = [];
}
if (pr && !regions[pr]) {
regions[pr] = [];
}
if (fr && !regions[fr]) {
regions[fr] = [];
}
if (pr && !BI.deepContains(regions[pr], item.primary)) {
regions[pr].push(item.primary);
}
if (fr && !BI.deepContains(regions[fr], item.foreign)) {
regions[fr].push(item.foreign);
}
pr && fr && relations[pr][fr].push(item);
});
//求拓扑
var topology = [];
var rs = BI.clone(regions), store = {};
while (!BI.isEmpty(rs)) {
var clone = BI.clone(rs);
BI.each(o.items, function (i, item) {
if (!store[item.primary.region]) {
delete clone[item.foreign && item.foreign.region];
}
});
topology.push(BI.keys(clone));
BI.extend(store, clone);
BI.each(clone, function (k, v) {
delete rs[k];
});
}
//构建视图
var views = this.views = {}, storeViews = this.storeViews = {}, indexes = this.indexes = {};
var verticals = [];
BI.each(topology, function (i, items) {
if (!views[i]) {
views[i] = {};
}
var horizontal = [];
BI.each(items, function (j, region) {
var items = regions[region];
views[i][j] = storeViews[region] = BI.createWidget({
type: "bi.relation_view_region_container",
value: region,
header: items[0].regionTitle,
text: items.length > 0 ? items[0].regionText : "",
handler: items.length > 0 ? items[0].regionHandler : BI.emptyFn,
items: items,
belongPackage: items.length > 0 ? items[0].belongPackage : true
});
if (BI.isNotNull(items[0]) && BI.isNotNull(items[0].keyword)) {
views[i][j].doRedMark(items[0].keyword);
}
views[i][j].on(BI.RelationViewRegionContainer.EVENT_HOVER_IN, function (v) {
self._hoverIn(v);
});
views[i][j].on(BI.RelationViewRegionContainer.EVENT_HOVER_OUT, function (v) {
self._hoverOut(v);
});
views[i][j].on(BI.RelationViewRegionContainer.EVENT_PREVIEW, function (v) {
self.fireEvent(BI.RelationView.EVENT_PREVIEW, region, v);
});
indexes[region] = {i: i, j: j};
horizontal.push(views[i][j]);
});
verticals.push({
type: "bi.horizontal",
items: horizontal
})
});
//求每一行的高度
var heights = this._calculateHeights();
//求每一列的宽度
var widths = this._calculateWidths();
//求相对宽度和高度
var offsetWidths = [0], offsetHeights = [0];
BI.each(heights, function (i, h) {
if (i === 0) {
return;
}
offsetHeights[i] = offsetHeights[i - 1] + heights[i - 1];
});
BI.each(widths, function (i, w) {
if (i === 0) {
return;
}
offsetWidths[i] = offsetWidths[i - 1] + widths[i - 1];
});
//画线
var lines = this.lines = {};//缓存所有的线
BI.each(relations, function (start, rs) {
BI.each(rs, function (end, relation) {
var startIndex = indexes[start], endIndex = indexes[end];
var top = 0, right = 1, bottom = 2, left = 3;
var startDirection = bottom, endDirection = top;
// if (startIndex.j > endIndex.j) {
// startDirection = left;
// endDirection = right;
// } else if (startIndex.j < endIndex.j) {
// startDirection = right;
// endDirection = left;
// } else if (startIndex.i < endIndex.i) {
// startDirection = bottom;
// endDirection = top;
// } else if (startIndex.i > endIndex.i) {
// startDirection = top;
// endDirection = bottom;
// }
var draw = function (i, j, direction, isForeign) {
var x = offsetWidths[j] + (widths[j] - views[i][j].getWidth()) / 2;
var y = offsetHeights[i] + (heights[i] - views[i][j].getHeight()) / 2;
var path = "", position;
switch (direction) {
case top:
position = isForeign ? views[i][j].getTopRightPosition() : views[i][j].getTopLeftPosition();
x += position.x;
y += position.y;
path = "M" + x + "," + y + "L" + x + "," + (y - 10);
y -= 10;
break;
case right:
position = views[i][j].getRightPosition();
x += position.x;
y += position.y;
path = "M" + x + "," + y + "L" + (x + 10) + "," + y;
x += 10;
break;
case bottom:
position = views[i][j].getBottomPosition();
x += position.x;
y += position.y;
path = "M" + x + "," + y + "L" + x + "," + (y + 10);
y += 10;
break;
case left:
position = views[i][j].getLeftPosition();
x += position.x;
y += position.y;
path = "M" + x + "," + y + "L" + (x - 10) + "," + y;
x -= 10;
break;
}
return {x: x, y: y, path: path};
};
var path = "";
var si = draw(startIndex.i, startIndex.j, startDirection);
var ei = draw(endIndex.i, endIndex.j, endDirection, true);
path += si.path + ei.path;
if (!lines[start]) {
lines[start] = {};
}
path += "M" + si.x + "," + si.y + "L" + ei.x + "," + ei.y;
var line = lines[start][end] = self.svg.path(path)
.attr({"stroke": c.lineColor, "stroke-width": "2"})
.hover(function () {
line.attr("stroke", c.selectLineColor).toFront();
storeViews[start].setValue(relation[0].primary.value);
storeViews[end].setValue(relation[0].foreign.value);
}, function () {
line.attr("stroke", c.lineColor);
storeViews[start].setValue([]);
storeViews[end].setValue([]);
});
});
});
var container = BI.createWidget();
BI.createWidget({
type: "bi.vertical",
element: container,
items: verticals
});
BI.createWidget({
type: "bi.absolute",
element: container,
items: [{
el: this.svg,
left: 0,
right: 0,
top: 0,
bottom: 0
}]
});
BI.createWidget({
type: "bi.center_adapt",
scrollable: true,
element: this,
items: [container]
});
}
});
BI.RelationView.EVENT_CHANGE = "RelationView.EVENT_CHANGE";
BI.RelationView.EVENT_PREVIEW = "EVENT_PREVIEW";
BI.shortcut('bi.relation_view', BI.RelationView);/**
* Created by Young's on 2017/3/10.
*/
BI.RelationViewRegionContainer = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.RelationViewRegionContainer.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-relation-view-region-container",
width: 150
});
},
_init: function () {
BI.RelationViewRegionContainer.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.region = BI.createWidget({
type: "bi.relation_view_region",
value: o.value,
header: o.header,
text: o.text,
handler: o.handler,
items: o.items,
belongPackage: o.belongPackage
});
this.region.on(BI.RelationViewRegion.EVENT_PREVIEW, function (v) {
self.fireEvent(BI.RelationViewRegionContainer.EVENT_PREVIEW, v);
});
this.region.on(BI.RelationViewRegion.EVENT_HOVER_IN, function (v) {
self.fireEvent(BI.RelationViewRegionContainer.EVENT_HOVER_IN, v);
});
this.region.on(BI.RelationViewRegion.EVENT_HOVER_OUT, function (v) {
self.fireEvent(BI.RelationViewRegionContainer.EVENT_HOVER_OUT, v);
});
BI.createWidget({
type: "bi.vertical",
element: this,
items: [this.region],
width: this.region.getWidth(),
height: this.region.getHeight()
});
},
doRedMark: function () {
this.region.doRedMark.apply(this.region, arguments);
},
unRedMark: function () {
this.region.unRedMark.apply(this.region, arguments);
},
getWidth: function () {
return this.region.getWidth();
},
getHeight: function () {
return this.region.getHeight();
},
//获取上方开始划线的位置
getTopLeftPosition: function () {
return this.region.getTopLeftPosition();
},
getTopRightPosition: function () {
return this.region.getTopRightPosition();
},
getBottomPosition: function () {
return this.region.getBottomPosition();
},
getLeftPosition: function () {
return this.region.getLeftPosition();
},
getRightPosition: function () {
return this.region.getRightPosition();
},
setValue: function (v) {
this.region.setValue(v);
},
toggleRegion: function (v) {
v === true ? this.region.element.fadeIn() : this.region.element.fadeOut();
},
setPreviewSelected: function(v) {
this.region.setPreviewSelected(v);
}
});
BI.RelationViewRegionContainer.EVENT_HOVER_IN = "RelationViewRegion.EVENT_HOVER_IN";
BI.RelationViewRegionContainer.EVENT_HOVER_OUT = "RelationViewRegion.EVENT_HOVER_OUT";
BI.RelationViewRegionContainer.EVENT_PREVIEW = "RelationViewRegion.EVENT_PREVIEW";
BI.shortcut("bi.relation_view_region_container", BI.RelationViewRegionContainer);/**
* 关联视图
*
* Created by GUY on 2015/12/23.
* @class BI.RelationViewRegion
* @extends BI.BasicButton
*/
BI.RelationViewRegion = BI.inherit(BI.BasicButton, {
_defaultConfig: function () {
return BI.extend(BI.RelationViewRegion.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-relation-view-region cursor-pointer",
width: 150,
text: "",
value: "",
header: "",
items: [],
belongPackage: true
});
},
_init: function () {
BI.RelationViewRegion.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.preview = BI.createWidget({
type: "bi.icon_button",
cls: "relation-table-preview-font",
width: 25,
height: 25,
stopPropagation: true
});
this.preview.on(BI.IconButton.EVENT_CHANGE, function () {
self.fireEvent(BI.RelationViewRegion.EVENT_PREVIEW, this.isSelected());
});
this.title = BI.createWidget({
type: "bi.label",
height: 25,
width: 70,
text: o.text,
value: o.value,
textAlign: "left"
});
//title放body上
if (BI.isKey(o.header)) {
this.title.setTitle(o.header, {
container: "body"
})
}
this.button_group = BI.createWidget({
type: "bi.button_group",
items: this._createItems(o.items),
layouts: [{
type: "bi.vertical"
}]
});
BI.createWidget({
type: "bi.vertical",
element: this,
items: [{
type: "bi.vertical",
cls: "relation-view-region-container bi-card bi-border " + (o.belongPackage ? "" : "other-package"),
items: [{
type: "bi.vertical_adapt",
cls: "relation-view-region-title bi-border-bottom",
items: [this.preview, this.title]
}, this.button_group]
}],
hgap: 25,
vgap: 20
})
},
_createItems: function (items) {
var self = this;
return BI.map(items, function (i, item) {
return BI.extend(item, {
type: "bi.relation_view_item",
hoverIn: function () {
self.setValue(item.value);
self.fireEvent(BI.RelationViewRegion.EVENT_HOVER_IN, item.value);
},
hoverOut: function () {
self.setValue([]);
self.fireEvent(BI.RelationViewRegion.EVENT_HOVER_OUT, item.value);
}
})
});
},
doRedMark: function () {
this.title.doRedMark.apply(this.title, arguments);
},
unRedMark: function () {
this.title.unRedMark.apply(this.title, arguments);
},
getWidth: function () {
return this.options.width;
},
getHeight: function () {
return this.button_group.getAllButtons().length * 25 + 25 + 2 * 20 + 3;
},
//获取上方开始划线的位置
getTopLeftPosition: function () {
return {
x: 25 + 10,
y: 20
}
},
getTopRightPosition: function () {
return {
x: this.getWidth() - 25 - 10,
y: 20
}
},
getBottomPosition: function () {
return {
x: 25 + 10,
y: this.getHeight() - 20
}
},
getLeftPosition: function () {
return {
x: 25,
y: 20 + 10
}
},
getRightPosition: function () {
return {
x: this.getWidth() - 25,
y: 20 + 10
}
},
setValue: function (v) {
this.button_group.setValue(v);
},
setPreviewSelected: function(v) {
this.preview.setSelected(v);
}
});
BI.RelationViewRegion.EVENT_HOVER_IN = "RelationViewRegion.EVENT_HOVER_IN";
BI.RelationViewRegion.EVENT_HOVER_OUT = "RelationViewRegion.EVENT_HOVER_OUT";
BI.RelationViewRegion.EVENT_PREVIEW = "RelationViewRegion.EVENT_PREVIEW";
BI.shortcut('bi.relation_view_region', BI.RelationViewRegion);/**
* 自适应宽度的表格
*
* Created by GUY on 2016/2/3.
* @class BI.ResponisveTable
* @extends BI.Widget
*/
BI.ResponisveTable = BI.inherit(BI.Widget, {
_const: {
perColumnSize: 100
},
_defaultConfig: function () {
return BI.extend(BI.ResponisveTable.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-responsive-table",
isNeedFreeze: false,//是否需要冻结单元格
freezeCols: [], //冻结的列号,从0开始,isNeedFreeze为true时生效
isNeedMerge: false,//是否需要合并单元格
mergeCols: [], //合并的单元格列号
mergeRule: function (row1, row2) { //合并规则, 默认相等时合并
return BI.isEqual(row1, row2);
},
columnSize: [],
headerRowSize: 25,
footerRowSize: 25,
rowSize: 25,
regionColumnSize: false,
header: [],
footer: false,
items: [], //二维数组
//交叉表头
crossHeader: [],
crossItems: []
});
},
_init: function () {
BI.ResponisveTable.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.table = BI.createWidget({
type: "bi.table_view",
element: this,
isNeedFreeze: o.isNeedFreeze,
freezeCols: o.freezeCols,
isNeedMerge: o.isNeedMerge,
mergeCols: o.mergeCols,
mergeRule: o.mergeRule,
columnSize: o.columnSize,
headerRowSize: o.headerRowSize,
footerRowSize: o.footerRowSize,
rowSize: o.rowSize,
regionColumnSize: o.regionColumnSize,
header: o.header,
footer: o.footer,
items: o.items,
//交叉表头
crossHeader: o.crossHeader,
crossItems: o.crossItems
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_INIT, function () {
self._initRegionSize();
self.table.resize();
self._resizeHeader();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_INIT, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_RESIZE, function () {
self._resizeRegion();
self._resizeHeader();
self.fireEvent(BI.Table.EVENT_TABLE_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_SCROLL, function () {
self.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_BEFORE_REGION_RESIZE, function () {
self.fireEvent(BI.Table.EVENT_TABLE_BEFORE_REGION_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_REGION_RESIZE, function () {
//important:在冻结并自适应列宽的情况下要随时变更表头宽度
if (o.isNeedResize === true && self._isAdaptiveColumn()) {
self._resizeHeader();
}
self.fireEvent(BI.Table.EVENT_TABLE_REGION_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, function () {
self._resizeHeader();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_BEFORE_COLUMN_RESIZE, function () {
self._resizeBody();
self.fireEvent(BI.Table.EVENT_TABLE_BEFORE_COLUMN_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_COLUMN_RESIZE, function () {
self.fireEvent(BI.Table.EVENT_TABLE_COLUMN_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, function () {
self._resizeRegion();
self._resizeHeader();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, arguments);
});
},
_initRegionSize: function () {
var o = this.options;
if (o.isNeedFreeze === true) {
var regionColumnSize = this.table.getRegionColumnSize();
var maxWidth = this.table.element.width();
if (!regionColumnSize[0] || (regionColumnSize[0] === 'fill') || regionColumnSize[0] > maxWidth || regionColumnSize[1] > maxWidth) {
var freezeCols = o.freezeCols;
if (freezeCols.length === 0) {
this.table.setRegionColumnSize([0, "fill"]);
} else if (freezeCols.length > 0 && freezeCols.length < o.columnSize.length) {
var size = maxWidth / 3;
if (freezeCols.length > o.columnSize.length / 2) {
size = maxWidth * 2 / 3;
}
this.table.setRegionColumnSize([size, "fill"]);
} else {
this.table.setRegionColumnSize(["fill", 0]);
}
}
}
},
_getBlockSize: function () {
var o = this.options;
var columnSize = this.table.getCalculateColumnSize();
if (o.isNeedFreeze === true) {
var columnSizeLeft = [], columnSizeRight = [];
BI.each(columnSize, function (i, size) {
if (o.freezeCols.contains(i)) {
columnSizeLeft.push(size);
} else {
columnSizeRight.push(size);
}
});
//因为有边框,所以加上数组长度的参数调整
var sumLeft = BI.sum(columnSizeLeft) + columnSizeLeft.length, sumRight = BI.sum(columnSizeRight) + columnSizeRight.length;
return {
sumLeft: sumLeft,
sumRight: sumRight,
left: columnSizeLeft,
right: columnSizeRight
}
}
return {
size: columnSize,
sum: BI.sum(columnSize) + columnSize.length
};
},
_isAdaptiveColumn: function (columnSize) {
return !(BI.last(columnSize || this.table.getColumnSize()) > 1.05);
},
_resizeHeader: function () {
var self = this, o = this.options;
if (o.isNeedFreeze === true) {
//若是当前处于自适应调节阶段
if (this._isAdaptiveColumn()) {
var columnSize = this.table.getCalculateColumnSize();
this.table.setHeaderColumnSize(columnSize);
} else {
var regionColumnSize = this.table.getClientRegionColumnSize();
var block = this._getBlockSize();
var sumLeft = block.sumLeft, sumRight = block.sumRight;
var columnSizeLeft = block.left, columnSizeRight = block.right;
columnSizeLeft[columnSizeLeft.length - 1] += regionColumnSize[0] - sumLeft;
columnSizeRight[columnSizeRight.length - 1] += regionColumnSize[1] - sumRight;
var newLeft = BI.clone(columnSizeLeft), newRight = BI.clone(columnSizeRight);
newLeft[newLeft.length - 1] = "";
newRight[newRight.length - 1] = "";
this.table.setColumnSize(newLeft.concat(newRight));
block = self._getBlockSize();
if (columnSizeLeft[columnSizeLeft.length - 1] < block.left[block.left.length - 1]) {
columnSizeLeft[columnSizeLeft.length - 1] = block.left[block.left.length - 1]
}
if (columnSizeRight[columnSizeRight.length - 1] < block.right[block.right.length - 1]) {
columnSizeRight[columnSizeRight.length - 1] = block.right[block.right.length - 1]
}
self.table.setColumnSize(columnSizeLeft.concat(columnSizeRight));
}
} else {
if (!this._isAdaptiveColumn()) {
var regionColumnSize = this.table.getClientRegionColumnSize();
var block = this._getBlockSize();
var sum = block.sum;
var size = block.size;
size[size.length - 1] += regionColumnSize[0] - sum;
var newSize = BI.clone(size);
newSize[newSize.length - 1] = "";
this.table.setColumnSize(newSize);
block = this._getBlockSize();
if (size[size.length - 1] < block.size[block.size.length - 1]) {
size[size.length - 1] = block.size[block.size.length - 1]
}
this.table.setColumnSize(size);
}
}
},
_resizeBody: function () {
if (this._isAdaptiveColumn()) {
var columnSize = this.table.getCalculateColumnSize();
this.setColumnSize(columnSize);
}
},
_adjustRegion: function () {
var o = this.options;
var regionColumnSize = this.table.getCalculateRegionColumnSize();
if (o.isNeedFreeze === true && o.freezeCols.length > 0 && o.freezeCols.length < o.columnSize.length) {
var block = this._getBlockSize();
var sumLeft = block.sumLeft, sumRight = block.sumRight;
if (sumLeft < regionColumnSize[0] || regionColumnSize[0] >= (sumLeft + sumRight)) {
this.table.setRegionColumnSize([sumLeft, "fill"]);
}
this._resizeRegion();
}
},
_resizeRegion: function () {
var o = this.options;
var regionColumnSize = this.table.getCalculateRegionColumnSize();
if (o.isNeedFreeze === true && o.freezeCols.length > 0 && o.freezeCols.length < o.columnSize.length) {
var maxWidth = this.table.element.width();
if (regionColumnSize[0] < 15 || regionColumnSize[1] < 15) {
var freezeCols = o.freezeCols;
var size = maxWidth / 3;
if (freezeCols.length > o.columnSize.length / 2) {
size = maxWidth * 2 / 3;
}
this.table.setRegionColumnSize([size, "fill"]);
}
}
},
resize: function () {
this.table.resize();
this._resizeRegion();
this._resizeHeader();
},
setColumnSize: function (columnSize) {
this.table.setColumnSize(columnSize);
this._adjustRegion();
this._resizeHeader();
},
getColumnSize: function () {
return this.table.getColumnSize();
},
getCalculateColumnSize: function () {
return this.table.getCalculateColumnSize();
},
setHeaderColumnSize: function (columnSize) {
this.table.setHeaderColumnSize(columnSize);
this._adjustRegion();
this._resizeHeader();
},
setRegionColumnSize: function (columnSize) {
this.table.setRegionColumnSize(columnSize);
this._resizeHeader();
},
getRegionColumnSize: function () {
return this.table.getRegionColumnSize();
},
getCalculateRegionColumnSize: function () {
return this.table.getCalculateRegionColumnSize();
},
getCalculateRegionRowSize: function () {
return this.table.getCalculateRegionRowSize();
},
getClientRegionColumnSize: function () {
return this.table.getClientRegionColumnSize();
},
getScrollRegionColumnSize: function () {
return this.table.getScrollRegionColumnSize();
},
getScrollRegionRowSize: function () {
return this.table.getScrollRegionRowSize();
},
hasVerticalScroll: function () {
return this.table.hasVerticalScroll();
},
setVerticalScroll: function (scrollTop) {
this.table.setVerticalScroll(scrollTop);
},
setLeftHorizontalScroll: function (scrollLeft) {
this.table.setLeftHorizontalScroll(scrollLeft);
},
setRightHorizontalScroll: function (scrollLeft) {
this.table.setRightHorizontalScroll(scrollLeft);
},
getVerticalScroll: function () {
return this.table.getVerticalScroll();
},
getLeftHorizontalScroll: function () {
return this.table.getLeftHorizontalScroll();
},
getRightHorizontalScroll: function () {
return this.table.getRightHorizontalScroll();
},
getColumns: function () {
return this.table.getColumns();
},
attr: function () {
BI.ResponisveTable.superclass.attr.apply(this, arguments);
this.table.attr.apply(this.table, arguments);
},
populate: function (items) {
var self = this, o = this.options;
this.table.populate.apply(this.table, arguments);
if (o.isNeedFreeze === true) {
BI.nextTick(function () {
if (self.element.is(":visible")) {
self._initRegionSize();
self.table.resize();
self._resizeHeader();
}
});
}
}
});
BI.shortcut('bi.responsive_table', BI.ResponisveTable);/**
* 加号表示的组节点
* Created by GUY on 2015/9/6.
* @class BI.SelectTreeFirstPlusGroupNode
* @extends BI.NodeButton
*/
BI.SelectTreeFirstPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.SelectTreeFirstPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: (conf.baseCls || "") + " bi-select-tree-first-plus-group-node bi-list-item-active",
logic: {
dynamic: false
},
id: "",
pId: "",
readonly: true,
open: false,
height: 25
})
},
_init: function () {
BI.SelectTreeFirstPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.checkbox = BI.createWidget({
type: "bi.first_tree_node_checkbox",
stopPropagation: true
});
this.text = BI.createWidget({
type: "bi.label",
textAlign: "left",
whiteSpace: "nowrap",
textHeight: o.height,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.checkbox.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {
if (this.isSelected()) {
self.triggerExpand();
} else {
self.triggerCollapse();
}
}
});
var type = BI.LogicFactory.createLogicTypeByDirection(BI.Direction.Left);
var items = BI.LogicFactory.createLogicItemsByDirection(BI.Direction.Left, {
width: 25,
el: this.checkbox
}, this.text);
BI.createWidget(BI.extend({
element: this
}, BI.LogicFactory.createLogic(type, BI.extend(o.logic, {
items: items
}))));
},
isOnce: function () {
return true;
},
doRedMark: function () {
this.text.doRedMark.apply(this.text, arguments);
},
unRedMark: function () {
this.text.unRedMark.apply(this.text, arguments);
},
doClick: function () {
BI.NodeButton.superclass.doClick.apply(this, arguments);
},
setOpened: function (v) {
BI.SelectTreeFirstPlusGroupNode.superclass.setOpened.apply(this, arguments);
if (BI.isNotNull(this.checkbox)) {
this.checkbox.setSelected(v);
}
}
});
BI.shortcut("bi.select_tree_first_plus_group_node", BI.SelectTreeFirstPlusGroupNode);/**
* 加号表示的组节点
* Created by GUY on 2015/9/6.
* @class BI.SelectTreeLastPlusGroupNode
* @extends BI.NodeButton
*/
BI.SelectTreeLastPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.SelectTreeLastPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: (conf.baseCls || "") + " bi-select-tree-last-plus-group-node bi-list-item-active",
logic: {
dynamic: false
},
id: "",
pId: "",
readonly: true,
open: false,
height: 25
})
},
_init: function () {
BI.SelectTreeLastPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.checkbox = BI.createWidget({
type: "bi.last_tree_node_checkbox",
stopPropagation: true
})
this.text = BI.createWidget({
type: "bi.label",
textAlign: "left",
whiteSpace: "nowrap",
textHeight: o.height,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.checkbox.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {
if (this.isSelected()) {
self.triggerExpand();
} else {
self.triggerCollapse();
}
}
});
var type = BI.LogicFactory.createLogicTypeByDirection(BI.Direction.Left);
var items = BI.LogicFactory.createLogicItemsByDirection(BI.Direction.Left, {
width: 25,
el: this.checkbox
}, this.text);
BI.createWidget(BI.extend({
element: this
}, BI.LogicFactory.createLogic(type, BI.extend(o.logic, {
items: items
}))));
},
isOnce: function () {
return true;
},
doRedMark: function () {
this.text.doRedMark.apply(this.text, arguments);
},
unRedMark: function () {
this.text.unRedMark.apply(this.text, arguments);
},
doClick: function () {
BI.NodeButton.superclass.doClick.apply(this, arguments);
},
setOpened: function (v) {
BI.SelectTreeLastPlusGroupNode.superclass.setOpened.apply(this, arguments);
if (BI.isNotNull(this.checkbox)) {
this.checkbox.setSelected(v);
}
}
});
BI.shortcut("bi.select_tree_last_plus_group_node", BI.SelectTreeLastPlusGroupNode);/**
* 加号表示的组节点
* Created by GUY on 2015/9/6.
* @class BI.SelectTreeMidPlusGroupNode
* @extends BI.NodeButton
*/
BI.SelectTreeMidPlusGroupNode = BI.inherit(BI.NodeButton, {
_defaultConfig: function () {
var conf = BI.SelectTreeMidPlusGroupNode.superclass._defaultConfig.apply(this, arguments);
return BI.extend(conf, {
baseCls: (conf.baseCls || "") + " bi-select-tree-mid-plus-group-node bi-list-item-active",
logic: {
dynamic: false
},
id: "",
pId: "",
readonly: true,
open: false,
height: 25
})
},
_init: function () {
BI.SelectTreeMidPlusGroupNode.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.checkbox = BI.createWidget({
type: "bi.mid_tree_node_checkbox",
stopPropagation: true
});
this.text = BI.createWidget({
type: "bi.label",
textAlign: "left",
whiteSpace: "nowrap",
textHeight: o.height,
height: o.height,
hgap: o.hgap,
text: o.text,
value: o.value,
py: o.py
});
this.checkbox.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {
if (this.isSelected()) {
self.triggerExpand();
} else {
self.triggerCollapse();
}
}
});
var type = BI.LogicFactory.createLogicTypeByDirection(BI.Direction.Left);
var items = BI.LogicFactory.createLogicItemsByDirection(BI.Direction.Left, {
width: 25,
el: this.checkbox
}, this.text);
BI.createWidget(BI.extend({
element: this
}, BI.LogicFactory.createLogic(type, BI.extend(o.logic, {
items: items
}))));
},
isOnce: function () {
return true;
},
doRedMark: function () {
this.text.doRedMark.apply(this.text, arguments);
},
unRedMark: function () {
this.text.unRedMark.apply(this.text, arguments);
},
doClick: function () {
BI.NodeButton.superclass.doClick.apply(this, arguments);
},
setOpened: function (v) {
BI.SelectTreeMidPlusGroupNode.superclass.setOpened.apply(this, arguments);
if (BI.isNotNull(this.checkbox)) {
this.checkbox.setSelected(v);
}
}
});
BI.shortcut("bi.select_tree_mid_plus_group_node", BI.SelectTreeMidPlusGroupNode);/**
* @class BI.SelectTreeCombo
* @extends BI.Widget
*/
BI.SelectTreeCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.SelectTreeCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-select-tree-combo",
height: 30,
text: "",
items: []
});
},
_init: function () {
BI.SelectTreeCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget({
type: "bi.single_tree_trigger",
text: o.text,
height: o.height,
items: o.items
});
this.popup = BI.createWidget({
type: "bi.select_tree_popup",
items: o.items
});
this.combo = BI.createWidget({
type: "bi.combo",
element: this,
adjustLength: 2,
el: this.trigger,
popup: {
el: this.popup
}
});
this.combo.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.popup.on(BI.SingleTreePopup.EVENT_CHANGE, function () {
self.setValue(self.popup.getValue());
self.combo.hideView();
});
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.trigger.setValue(v);
this.popup.setValue(v);
},
getValue: function () {
return this.popup.getValue();
},
populate: function (items) {
this.combo.populate(items);
}
});
BI.shortcut("bi.select_tree_combo", BI.SelectTreeCombo);/**
* @class BI.SelectTreeExpander
* @extends BI.Widget
*/
BI.SelectTreeExpander = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.SelectTreeExpander.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-select-tree-expander",
trigger: "click",
toggle: true,
direction: "bottom",
isDefaultInit: true,
el: {},
popup: {}
});
},
_init: function () {
BI.SelectTreeExpander.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget(BI.extend({stopPropagation: true}, o.el));
this.trigger.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {
if (this.isSelected()) {
self.expander.setValue([]);
}
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.expander = BI.createWidget({
type: "bi.expander",
element: this,
trigger: o.trigger,
toggle: o.toggle,
direction: o.direction,
isDefaultInit: o.isDefaultInit,
el: this.trigger,
popup: o.popup
});
this.expander.on(BI.Controller.EVENT_CHANGE, function (type) {
if (type === BI.Events.CLICK) {
self.trigger.setSelected(false);
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
},
setValue: function (v) {
if (BI.contains(v, this.trigger.getValue())) {
this.trigger.setSelected(true);
this.expander.setValue([]);
} else {
this.trigger.setSelected(false);
this.expander.setValue(v);
}
},
getValue: function () {
if (this.trigger.isSelected()) {
return [this.trigger.getValue()];
}
return this.expander.getValue();
},
populate: function (items) {
this.expander.populate(items);
}
});
BI.shortcut("bi.select_tree_expander", BI.SelectTreeExpander);/**
* @class BI.SelectTreePopup
* @extends BI.Pane
*/
BI.SelectTreePopup = BI.inherit(BI.Pane, {
_defaultConfig: function () {
return BI.extend(BI.SelectTreePopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-select-tree-popup",
tipText: BI.i18nText("BI-No_Selected_Item"),
items: []
});
},
_formatItems: function (nodes, layer) {
var self = this;
BI.each(nodes, function (i, node) {
var extend = {layer: layer};
node.id = node.id || BI.UUID();
if (node.isParent === true || BI.isNotEmptyArray(node.children)) {
switch (i) {
case 0 :
extend.type = "bi.select_tree_first_plus_group_node";
break;
case nodes.length - 1 :
extend.type = "bi.select_tree_last_plus_group_node";
break;
default :
extend.type = "bi.select_tree_mid_plus_group_node";
break;
}
BI.defaults(node, extend);
self._formatItems(node.children);
} else {
switch (i) {
case nodes.length - 1:
extend.type = "bi.last_tree_leaf_item";
break;
default :
extend.type = "bi.mid_tree_leaf_item";
}
BI.defaults(node, extend);
}
});
return nodes;
},
_init: function () {
BI.SelectTreePopup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.tree = BI.createWidget({
type: 'bi.level_tree',
expander: {
type: "bi.select_tree_expander",
isDefaultInit: true
},
items: this._formatItems(BI.Tree.transformToTreeFormat(o.items)),
chooseType: BI.Selection.Single
});
BI.createWidget({
type: "bi.vertical",
element: this,
items: [this.tree]
});
this.tree.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.tree.on(BI.LevelTree.EVENT_CHANGE, function () {
self.fireEvent(BI.SelectTreePopup.EVENT_CHANGE);
});
this.check();
},
getValue: function () {
return this.tree.getValue();
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.tree.setValue(v);
},
populate: function (items) {
BI.SelectTreePopup.superclass.populate.apply(this, arguments);
this.tree.populate(items);
}
});
BI.SelectTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.select_tree_popup", BI.SelectTreePopup);/**
*
* Created by GUY on 2016/8/10.
* @class BI.SequenceTableDynamicNumber
* @extends BI.SequenceTableTreeNumber
*/
BI.SequenceTableDynamicNumber = BI.inherit(BI.SequenceTableTreeNumber, {
_defaultConfig: function () {
return BI.extend(BI.SequenceTableDynamicNumber.superclass._defaultConfig.apply(this, arguments), {
extraCls: "bi-sequence-table-dynamic-number"
});
},
_init: function () {
BI.SequenceTableDynamicNumber.superclass._init.apply(this, arguments);
},
_formatNumber: function (nodes) {
var self = this, o = this.options;
var result = [];
var count = this._getStart(nodes);
function getLeafCount(node) {
var cnt = 0;
if (BI.isNotEmptyArray(node.children)) {
BI.each(node.children, function (index, child) {
cnt += getLeafCount(child);
});
if (node.children.length > 1 && BI.isNotEmptyArray(node.values)) {
cnt++;
}
} else {
cnt++;
}
return cnt;
}
var start = 0, top = 0;
BI.each(nodes, function (i, node) {
if (BI.isArray(node.children)) {
BI.each(node.children, function (index, child) {
var cnt = getLeafCount(child);
result.push({
text: count++,
start: start,
top: top,
cnt: cnt,
index: index,
height: cnt * o.rowSize
});
start += cnt;
top += cnt * o.rowSize;
});
if (BI.isNotEmptyArray(node.values)) {
result.push({
text: BI.i18nText("BI-Summary_Values"),
start: start++,
top: top,
cnt: 1,
isSummary: true,
height: o.rowSize
});
top += o.rowSize;
}
}
});
return result;
}
});
BI.shortcut('bi.sequence_table_dynamic_number', BI.SequenceTableDynamicNumber);/**
*
* Created by GUY on 2016/5/26.
* @class BI.SequenceTableListNumber
* @extends BI.Widget
*/
BI.SequenceTableListNumber = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.SequenceTableListNumber.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-sequence-table-list-number",
isNeedFreeze: false,
scrollTop: 0,
startSequence: 1,//开始的序号
headerRowSize: 25,
rowSize: 25,
sequenceHeaderCreator: null,
header: [],
items: [], //二维数组
//交叉表头
crossHeader: [],
crossItems: [],
pageSize: 20
});
},
_init: function () {
BI.SequenceTableListNumber.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.start = o.startSequence;
this.renderedCells = [];
this.renderedKeys = [];
this.container = BI.createWidget({
type: "bi.absolute",
width: 60,
scrollable: false
});
this.scrollContainer = BI.createWidget({
type: "bi.vertical",
scrollable: false,
scrolly: false,
items: [this.container]
});
this.headerContainer = BI.createWidget({
type: "bi.absolute",
cls: "bi-border",
width: 58,
scrollable: false
});
this.layout = BI.createWidget({
type: "bi.vtape",
element: this,
items: [{
el: this.headerContainer,
height: o.headerRowSize * o.header.length - 2
}, {
el: {type: "bi.layout"},
height: 2
}, {
el: this.scrollContainer
}]
});
this._populate();
},
_layout: function () {
var self = this, o = this.options;
var headerHeight = o.headerRowSize * o.header.length - 2;
var items = this.layout.attr("items");
if (o.isNeedFreeze === false) {
items[0].height = 0;
items[1].height = 0;
} else if (o.isNeedFreeze === true) {
items[0].height = headerHeight;
items[1].height = 2;
}
this.layout.attr("items", items);
this.layout.resize();
this.container.setHeight(o.items.length * o.rowSize);
try {
this.scrollContainer.element.scrollTop(o.scrollTop);
} catch (e) {
}
},
_createHeader: function () {
var o = this.options;
BI.createWidget({
type: "bi.absolute",
element: this.headerContainer,
items: [{
el: o.sequenceHeaderCreator || {
type: "bi.table_style_cell",
cls: "sequence-table-title-cell",
styleGetter: o.headerCellStyleGetter,
text: BI.i18nText("BI-Number_Index")
},
left: 0,
top: 0,
right: 0,
bottom: 0
}]
});
},
_calculateChildrenToRender: function () {
var self = this, o = this.options;
var scrollTop = BI.clamp(o.scrollTop, 0, o.rowSize * o.items.length - (o.height - o.header.length * o.headerRowSize) + BI.DOM.getScrollWidth());
var start = Math.floor(scrollTop / o.rowSize);
var end = start + Math.floor((o.height - o.header.length * o.headerRowSize) / o.rowSize);
var renderedCells = [], renderedKeys = [];
for (var i = start, cnt = 0; i <= end && i < o.items.length; i++, cnt++) {
var index = BI.deepIndexOf(this.renderedKeys, this.start + i);
var top = i * o.rowSize;
if (index > -1) {
if (o.rowSize !== this.renderedCells[index]._height) {
this.renderedCells[index]._height = o.rowSize;
this.renderedCells[index].el.setHeight(o.rowSize);
}
if (this.renderedCells[index].top !== top) {
this.renderedCells[index].top = top;
this.renderedCells[index].el.element.css("top", top + "px");
}
renderedCells.push(this.renderedCells[index]);
} else {
var child = BI.createWidget(BI.extend({
type: "bi.table_style_cell",
cls: "sequence-table-number-cell bi-border-left bi-border-right bi-border-bottom",
width: 60,
height: o.rowSize,
text: this.start + i,
styleGetter: function (index) {
return function () {
return o.sequenceCellStyleGetter(self.start + i - 1);
}
}(cnt)
}));
renderedCells.push({
el: child,
left: 0,
top: top,
_height: o.rowSize
});
}
renderedKeys.push(this.start + i);
}
//已存在的, 需要添加的和需要删除的
var existSet = {}, addSet = {}, deleteArray = [];
BI.each(renderedKeys, function (i, key) {
if (BI.deepContains(self.renderedKeys, key)) {
existSet[i] = key;
} else {
addSet[i] = key;
}
});
BI.each(this.renderedKeys, function (i, key) {
if (BI.deepContains(existSet, key)) {
return;
}
if (BI.deepContains(addSet, key)) {
return;
}
deleteArray.push(i);
});
BI.each(deleteArray, function (i, index) {
self.renderedCells[index].el.destroy();
});
var addedItems = [];
BI.each(addSet, function (index) {
addedItems.push(renderedCells[index])
});
BI.createWidget({
type: "bi.absolute",
element: this.container,
items: addedItems
});
this.renderedCells = renderedCells;
this.renderedKeys = renderedKeys;
},
_populate: function () {
this.headerContainer.empty();
this._createHeader();
this._layout();
this._calculateChildrenToRender();
},
setVerticalScroll: function (scrollTop) {
if (this.options.scrollTop !== scrollTop) {
this.options.scrollTop = scrollTop;
try {
this.scrollContainer.element.scrollTop(scrollTop);
} catch (e) {
}
}
},
getVerticalScroll: function () {
return this.options.scrollTop;
},
setVPage: function (v) {
v = v < 1 ? 1 : v;
var o = this.options;
this.start = (v - 1) * o.pageSize + 1;
},
_restore: function () {
var o = this.options;
BI.each(this.renderedCells, function (i, cell) {
cell.el.destroy();
});
this.renderedCells = [];
this.renderedKeys = [];
},
restore: function () {
this._restore();
},
populate: function (items, header) {
var o = this.options;
if (items && items !== this.options.items) {
o.items = items;
this._restore();
}
if (header && header !== this.options.header) {
o.header = header;
}
this._populate();
}
});
BI.shortcut('bi.sequence_table_list_number', BI.SequenceTableListNumber);/**
* 带有序号的表格
*
* Created by GUY on 2016/5/26.
* @class BI.SequenceTable
* @extends BI.Widget
*/
BI.SequenceTable = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.SequenceTable.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-sequence-table",
el: {
type: "bi.adaptive_table"
},
sequence: {},
isNeedResize: true,
isResizeAdapt: false,
isNeedFreeze: false,//是否需要冻结单元格
freezeCols: [], //冻结的列号,从0开始,isNeedFreeze为true时生效
isNeedMerge: false,//是否需要合并单元格
mergeCols: [], //合并的单元格列号
mergeRule: BI.emptyFn,
columnSize: [],
minColumnSize: [],
maxColumnSize: [],
headerRowSize: 25,
rowSize: 25,
regionColumnSize: [],
headerCellStyleGetter: BI.emptyFn,
summaryCellStyleGetter: BI.emptyFn,
sequenceCellStyleGetter: BI.emptyFn,
header: [],
items: [], //二维数组
//交叉表头
crossHeader: [],
crossItems: [],
showSequence: false,
startSequence: 1//开始的序号
});
},
_init: function () {
BI.SequenceTable.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.sequence = BI.createWidget(o.sequence, {
type: "bi.sequence_table_list_number",
invisible: o.showSequence === false,
startSequence: o.startSequence,
isNeedFreeze: o.isNeedFreeze,
header: o.header,
items: o.items,
crossHeader: o.crossHeader,
crossItems: o.crossItems,
headerRowSize: o.headerRowSize,
rowSize: o.rowSize,
width: 60,
height: o.height && o.height - BI.GridTableScrollbar.SIZE,
headerCellStyleGetter: o.headerCellStyleGetter,
summaryCellStyleGetter: o.summaryCellStyleGetter,
sequenceCellStyleGetter: o.sequenceCellStyleGetter
});
this.table = BI.createWidget(o.el, {
type: "bi.adaptive_table",
width: o.showSequence === true ? o.width - 60 : o.width,
height: o.height,
isNeedResize: o.isNeedResize,
isResizeAdapt: o.isResizeAdapt,
isNeedFreeze: o.isNeedFreeze,
freezeCols: o.freezeCols,
isNeedMerge: o.isNeedMerge,
mergeCols: o.mergeCols,
mergeRule: o.mergeRule,
columnSize: o.columnSize,
minColumnSize: o.minColumnSize,
maxColumnSize: o.maxColumnSize,
headerRowSize: o.headerRowSize,
rowSize: o.rowSize,
regionColumnSize: o.regionColumnSize,
headerCellStyleGetter: o.headerCellStyleGetter,
summaryCellStyleGetter: o.summaryCellStyleGetter,
sequenceCellStyleGetter: o.sequenceCellStyleGetter,
header: o.header,
items: o.items,
//交叉表头
crossHeader: o.crossHeader,
crossItems: o.crossItems
});
this.table.on(BI.Table.EVENT_TABLE_SCROLL, function (scroll) {
if (self.sequence.getVerticalScroll() !== this.getVerticalScroll()) {
self.sequence.setVerticalScroll(this.getVerticalScroll());
self.sequence.populate();
}
self.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, function () {
o.regionColumnSize = this.getRegionColumnSize();
o.columnSize = this.getColumnSize();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, function () {
o.regionColumnSize = this.getRegionColumnSize();
o.columnSize = this.getColumnSize();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, arguments);
});
this.htape = BI.createWidget({
type: "bi.absolute",
element: this,
items: [{
el: this.sequence,
left: 0,
top: 0
}, {
el: this.table,
top: 0,
left: o.showSequence === true ? 60 : 0
}]
});
this._populate();
},
_populate: function () {
var o = this.options;
this.sequence.attr({
items: o.items,
header: o.header,
crossItems: o.crossItems,
crossHeader: o.crossHeader
});
if (o.showSequence === true) {
this.sequence.setVisible(true);
this.table.element.css("left", "60px");
this.table.setWidth(o.width - 60);
} else {
this.sequence.setVisible(false);
this.table.element.css("left", "0px");
this.table.setWidth(o.width);
}
},
setWidth: function (width) {
BI.PageTable.superclass.setWidth.apply(this, arguments);
this.table.setWidth(this.options.showSequence ? width - 60 : width);
},
setHeight: function (height) {
BI.PageTable.superclass.setHeight.apply(this, arguments);
this.table.setHeight(height);
this.sequence.setHeight(height - BI.GridTableScrollbar.SIZE);
},
setColumnSize: function (columnSize) {
this.options.columnSize = columnSize;
this.table.setColumnSize(columnSize);
},
getColumnSize: function () {
return this.table.getColumnSize();
},
setRegionColumnSize: function (columnSize) {
this.options.columnSize = columnSize;
this.table.setRegionColumnSize(columnSize);
},
getRegionColumnSize: function () {
return this.table.getRegionColumnSize();
},
hasLeftHorizontalScroll: function () {
return this.table.hasLeftHorizontalScroll();
},
hasRightHorizontalScroll: function () {
return this.table.hasRightHorizontalScroll();
},
setLeftHorizontalScroll: function (scrollLeft) {
this.table.setLeftHorizontalScroll(scrollLeft);
},
setRightHorizontalScroll: function (scrollLeft) {
this.table.setRightHorizontalScroll(scrollLeft);
},
setVerticalScroll: function (scrollTop) {
this.table.setVerticalScroll(scrollTop);
this.sequence.setVerticalScroll(scrollTop);
},
getVerticalScroll: function () {
return this.table.getVerticalScroll();
},
setVPage: function (page) {
this.sequence.setVPage && this.sequence.setVPage(page);
},
setHPage: function (page) {
this.sequence.setHPage && this.sequence.setHPage(page);
},
attr: function () {
BI.SequenceTable.superclass.attr.apply(this, arguments);
this.table.attr.apply(this.table, arguments);
this.sequence.attr.apply(this.sequence, arguments);
},
restore: function () {
this.table.restore();
this.sequence.restore();
},
populate: function (items, header, crossItems, crossHeader) {
var o = this.options;
if (items) {
o.items = items;
}
if (header) {
o.header = header;
}
if (crossItems) {
o.crossItems = crossItems;
}
if (crossHeader) {
o.crossHeader = crossHeader;
}
this._populate();
this.table.populate.apply(this.table, arguments);
this.sequence.populate.apply(this.sequence, arguments);
this.sequence.setVerticalScroll(this.table.getVerticalScroll());
},
destroy: function () {
this.table.destroy();
BI.SequenceTable.superclass.destroy.apply(this, arguments);
}
});
BI.shortcut('bi.sequence_table', BI.SequenceTable);/**
* @class BI.SingleTreeCombo
* @extends BI.Widget
*/
BI.SingleTreeCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.SingleTreeCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-single-tree-combo",
trigger: {},
height: 30,
text: "",
items: []
});
},
_init: function () {
BI.SingleTreeCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget(BI.extend({
type: "bi.single_tree_trigger",
text: o.text,
height: o.height,
items: o.items
}, o.trigger));
this.popup = BI.createWidget({
type: "bi.single_tree_popup",
items: o.items
});
this.combo = BI.createWidget({
type: "bi.combo",
element: this,
adjustLength: 2,
el: this.trigger,
popup: {
el: this.popup
}
});
this.combo.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.SingleTreeCombo.EVENT_BEFORE_POPUPVIEW, arguments);
});
this.popup.on(BI.SingleTreePopup.EVENT_CHANGE, function () {
self.setValue(self.popup.getValue());
self.combo.hideView();
self.fireEvent(BI.SingleTreeCombo.EVENT_CHANGE);
});
},
populate: function (items) {
this.combo.populate(items);
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.trigger.setValue(v);
this.popup.setValue(v);
},
getValue: function () {
return this.popup.getValue();
}
});
BI.SingleTreeCombo.EVENT_CHANGE = "SingleTreeCombo.EVENT_CHANGE";
BI.SingleTreeCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.shortcut("bi.single_tree_combo", BI.SingleTreeCombo);/**
* @class BI.SingleTreePopup
* @extends BI.Pane
*/
BI.SingleTreePopup = BI.inherit(BI.Pane, {
_defaultConfig: function () {
return BI.extend(BI.SingleTreePopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-single-tree-popup",
tipText: BI.i18nText("BI-No_Selected_Item"),
items: []
});
},
_init: function () {
BI.SingleTreePopup.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.tree = BI.createWidget({
type: 'bi.level_tree',
expander: {
isDefaultInit: true
},
items: o.items,
chooseType: BI.Selection.Single
});
BI.createWidget({
type: "bi.vertical",
element: this,
items: [this.tree]
});
this.tree.on(BI.Controller.EVENT_CHANGE, function () {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.tree.on(BI.LevelTree.EVENT_CHANGE, function () {
self.fireEvent(BI.SingleTreePopup.EVENT_CHANGE);
});
this.check();
},
getValue: function () {
return this.tree.getValue();
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.tree.setValue(v);
},
populate: function (items) {
BI.SingleTreePopup.superclass.populate.apply(this, arguments);
this.tree.populate(items);
}
});
BI.SingleTreePopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.single_tree_popup", BI.SingleTreePopup);/**
* @class BI.SingleTreeTrigger
* @extends BI.Trigger
*/
BI.SingleTreeTrigger = BI.inherit(BI.Trigger, {
_defaultConfig: function () {
return BI.extend(BI.SingleTreeTrigger.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-single-tree-trigger",
height: 30,
text: "",
items: []
});
},
_init: function () {
BI.SingleTreeTrigger.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.trigger = BI.createWidget({
type: "bi.select_text_trigger",
element: this,
text: o.text,
items: o.items,
height: o.height
});
},
_checkTitle: function () {
var self = this, val = this.getValue();
BI.any(this.options.items, function (i, item) {
if (val.contains(item.value)) {
self.trigger.setTitle(item.text || item.value);
return true;
}
});
},
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
this.options.value = v;
this.trigger.setValue(v);
this._checkTitle();
},
getValue: function () {
return this.options.value || [];
},
populate: function (items) {
BI.SingleTreeTrigger.superclass.populate.apply(this, arguments);
this.trigger.populate(items);
}
});
BI.shortcut("bi.single_tree_trigger", BI.SingleTreeTrigger);/**
* 可以单选多选切换的树
*
* Created by GUY on 2015/12/21.
* @class BI.SwitchTree
* @extends BI.Widget
*/
BI.SwitchTree = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.SwitchTree.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-switch-tree",
items: []
});
},
_init: function () {
BI.SwitchTree.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.tab = BI.createWidget({
type: "bi.tab",
element: this,
tab: null,
defaultShowIndex: BI.SwitchTree.SelectType.SingleSelect,
cardCreator: BI.bind(this._createTree, this)
});
},
_createTree: function (type) {
var self = this, o = this.options;
switch (type) {
case BI.SwitchTree.SelectType.SingleSelect:
this.levelTree = BI.createWidget({
type: "bi.multilayer_single_level_tree",
isDefaultInit: true,
items: BI.deepClone(o.items)
});
this.levelTree.on(BI.LevelTree.EVENT_CHANGE, function () {
self.fireEvent(BI.SwitchTree.EVENT_CHANGE, arguments);
});
return this.levelTree;
case BI.SwitchTree.SelectType.MultiSelect:
this.tree = BI.createWidget({
type: "bi.simple_tree",
items: this._removeIsParent(BI.deepClone(o.items))
});
this.tree.on(BI.SimpleTreeView.EVENT_CHANGE, function () {
self.fireEvent(BI.SwitchTree.EVENT_CHANGE, arguments);
});
return this.tree;
}
},
_removeIsParent: function(items) {
BI.each(items, function(i, item) {
BI.isNotNull(item.isParent) && delete item.isParent;
});
return items;
},
switchSelect: function () {
switch (this.getSelect()) {
case BI.SwitchTree.SelectType.SingleSelect:
this.setSelect(BI.SwitchTree.SelectType.MultiSelect);
break;
case BI.SwitchTree.SelectType.MultiSelect:
this.setSelect(BI.SwitchTree.SelectType.SingleSelect);
break;
}
},
setSelect: function (v) {
this.tab.setSelect(v);
},
getSelect: function () {
return this.tab.getSelect();
},
setValue: function (v) {
this.storeValue = v;
switch (this.getSelect()) {
case BI.SwitchTree.SelectType.SingleSelect:
this.levelTree.setValue(v);
break;
case BI.SwitchTree.SelectType.MultiSelect:
this.tree.setValue(v);
break;
}
},
getValue: function () {
return this.tab.getValue();
},
populate: function (items) {
this.options.items = items;
if (BI.isNotNull(this.levelTree)) {
this.levelTree.populate(BI.deepClone(items));
}
if (BI.isNotNull(this.tree)) {
this.tree.populate(this._removeIsParent(BI.deepClone(items)));
}
}
});
BI.SwitchTree.EVENT_CHANGE = "SwitchTree.EVENT_CHANGE";
BI.SwitchTree.SelectType = {
SingleSelect: BI.Selection.Single,
MultiSelect: BI.Selection.Multi
};
BI.shortcut('bi.switch_tree', BI.SwitchTree);
/**
* 年份下拉框
*
* Created by GUY on 2015/8/28.
* @class BI.YearCombo
* @extends BI.Widget
*/
BI.YearCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.YearCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-year-combo",
behaviors: {},
min: '1900-01-01', //最小日期
max: '2099-12-31', //最大日期
height: 25
});
},
_init: function () {
BI.YearCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.storeValue = "";
this.trigger = BI.createWidget({
type: "bi.year_trigger",
min: o.min,
max: o.max
});
this.trigger.on(BI.YearTrigger.EVENT_FOCUS, function () {
self.storeValue = this.getKey();
});
this.trigger.on(BI.YearTrigger.EVENT_START, function () {
self.combo.isViewVisible() && self.combo.hideView();
});
this.trigger.on(BI.YearTrigger.EVENT_STOP, function () {
self.combo.showView();
});
this.trigger.on(BI.YearTrigger.EVENT_ERROR, function () {
self.combo.isViewVisible() && self.combo.hideView();
});
this.trigger.on(BI.YearTrigger.EVENT_CONFIRM, function () {
if (self.combo.isViewVisible()) {
return;
}
if (this.getKey() && this.getKey() !== self.storeValue) {
self.setValue(this.getKey());
} else if (!this.getKey()) {
self.setValue();
}
self.fireEvent(BI.YearCombo.EVENT_CONFIRM);
});
this.combo = BI.createWidget({
type: "bi.combo",
element: this,
destroyWhenHide: true,
isNeedAdjustHeight: false,
isNeedAdjustWidth: false,
el: this.trigger,
popup: {
minWidth: 85,
stopPropagation: false,
el: {
type: "bi.year_popup",
ref: function () {
self.popup = this;
},
listeners: [{
eventName: BI.YearPopup.EVENT_CHANGE,
action: function () {
self.setValue(self.popup.getValue());
self.combo.hideView();
self.fireEvent(BI.YearCombo.EVENT_CONFIRM);
}
}],
behaviors: o.behaviors,
min: o.min,
max: o.max
}
}
});
this.combo.on(BI.Combo.EVENT_BEFORE_POPUPVIEW, function () {
var value = self.trigger.getKey();
if (BI.isNotNull(value)) {
self.popup.setValue(value);
} else if (!value && value !== self.storeValue) {
self.popup.setValue(self.storeValue);
} else {
self.setValue();
}
self.fireEvent(BI.YearCombo.EVENT_BEFORE_POPUPVIEW);
});
},
setValue: function (v) {
this.combo.setValue(v);
},
getValue: function () {
return this.popup.getValue();
}
});
BI.YearCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.YearCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.shortcut('bi.year_combo', BI.YearCombo);/**
* 年份展示面板
*
* Created by GUY on 2015/9/2.
* @class BI.YearPopup
* @extends BI.Trigger
*/
BI.YearPopup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.YearPopup.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-year-popup",
behaviors: {},
min: '1900-01-01', //最小日期
max: '2099-12-31' //最大日期
});
},
_createYearCalendar: function (v) {
var o = this.options, y = this._year;
var calendar = BI.createWidget({
type: "bi.year_calendar",
behaviors: o.behaviors,
min: o.min,
max: o.max,
logic: {
dynamic: true
},
year: y + v * 12
});
calendar.setValue(this._year);
return calendar;
},
_init: function () {
BI.YearPopup.superclass._init.apply(this, arguments);
var self = this;
this.selectedYear = this._year = new Date().getFullYear();
var backBtn = BI.createWidget({
type: "bi.icon_button",
cls: "pre-page-h-font",
width: 25,
height: 25,
value: -1
});
var preBtn = BI.createWidget({
type: "bi.icon_button",
cls: "next-page-h-font",
width: 25,
height: 25,
value: 1
});
this.navigation = BI.createWidget({
type: "bi.navigation",
element: this,
single: true,
logic: {
dynamic: true
},
tab: {
cls: "year-popup-navigation bi-high-light bi-border-top",
height: 25,
items: [backBtn, preBtn]
},
cardCreator: BI.bind(this._createYearCalendar, this),
afterCardShow: function () {
this.setValue(self.selectedYear);
var calendar = this.getSelectedCard();
backBtn.setEnable(!calendar.isFrontYear());
preBtn.setEnable(!calendar.isFinalYear());
}
});
this.navigation.on(BI.Navigation.EVENT_CHANGE, function () {
self.selectedYear = this.getValue();
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
self.fireEvent(BI.YearPopup.EVENT_CHANGE, self.selectedYear);
});
},
getValue: function () {
return this.selectedYear;
},
setValue: function (v) {
var o = this.options;
if (Date.checkVoid(v, 1, 1, o.min, o.max)[0]) {
v = new Date().getFullYear();
this.selectedYear = "";
this.navigation.setSelect(BI.YearCalendar.getPageByYear(v));
this.navigation.setValue("");
} else {
this.selectedYear = v;
this.navigation.setSelect(BI.YearCalendar.getPageByYear(v));
this.navigation.setValue(v);
}
}
});
BI.YearPopup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.year_popup", BI.YearPopup);/**
* 年份trigger
*
* Created by GUY on 2015/8/21.
* @class BI.YearTrigger
* @extends BI.Trigger
*/
BI.YearTrigger = BI.inherit(BI.Trigger, {
_const: {
hgap: 4,
vgap: 2,
triggerWidth: 25,
errorText: BI.i18nText("BI-Please_Input_Positive_Integer"),
errorTextInvalid: BI.i18nText("BI-Year_Trigger_Invalid_Text")
},
_defaultConfig: function () {
return BI.extend(BI.YearTrigger.superclass._defaultConfig.apply(this, arguments), {
extraCls: "bi-year-trigger bi-border",
min: '1900-01-01', //最小日期
max: '2099-12-31', //最大日期
height: 25
});
},
_init: function () {
BI.YearTrigger.superclass._init.apply(this, arguments);
var self = this, o = this.options, c = this._const;
this.editor = BI.createWidget({
type: "bi.sign_editor",
height: o.height,
validationChecker: function (v) {
self.editor.setErrorText(!BI.isPositiveInteger(v) ? c.errorText : c.errorTextInvalid);
return v === "" || (BI.isPositiveInteger(v) && !Date.checkVoid(v, 1, 1, o.min, o.max)[0]);
},
quitChecker: function (v) {
return false;
},
hgap: c.hgap,
vgap: c.vgap,
allowBlank: true,
errorText: c.errorText
})
this.editor.on(BI.SignEditor.EVENT_FOCUS, function () {
self.fireEvent(BI.YearTrigger.EVENT_FOCUS);
});
this.editor.on(BI.SignEditor.EVENT_STOP, function () {
self.fireEvent(BI.YearTrigger.EVENT_STOP);
});
this.editor.on(BI.SignEditor.EVENT_CONFIRM, function () {
var value = self.editor.getValue();
if (BI.isNotNull(value)) {
self.editor.setValue(value);
self.editor.setTitle(value);
}
self.fireEvent(BI.YearTrigger.EVENT_CONFIRM);
});
this.editor.on(BI.SignEditor.EVENT_SPACE, function () {
if (self.editor.isValid()) {
self.editor.blur();
}
});
this.editor.on(BI.SignEditor.EVENT_START, function () {
self.fireEvent(BI.YearTrigger.EVENT_START);
});
this.editor.on(BI.SignEditor.EVENT_ERROR, function () {
self.fireEvent(BI.YearTrigger.EVENT_ERROR);
});
BI.createWidget({
element: this,
type: 'bi.htape',
items: [
{
el: this.editor
}, {
el: {
type: "bi.text_button",
baseCls: "bi-trigger-year-text",
text: BI.i18nText("BI-Multi_Date_Year"),
width: c.triggerWidth
},
width: c.triggerWidth
}, {
el: {
type: "bi.trigger_icon_button",
width: c.triggerWidth
},
width: c.triggerWidth
}
]
});
},
setValue: function (v) {
this.editor.setState(v);
this.editor.setValue(v);
this.editor.setTitle(v);
},
getKey: function () {
return this.editor.getValue() | 0;
}
});
BI.YearTrigger.EVENT_FOCUS = "EVENT_FOCUS";
BI.YearTrigger.EVENT_ERROR = "EVENT_ERROR";
BI.YearTrigger.EVENT_START = "EVENT_START";
BI.YearTrigger.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.YearTrigger.EVENT_STOP = "EVENT_STOP";
BI.shortcut("bi.year_trigger", BI.YearTrigger);/**
* 年份 + 月份下拉框
*
* @class BI.YearMonthCombo
* @extends BI.Widget
*/
BI.YearMonthCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.YearMonthCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-year-month-combo",
yearBehaviors: {},
monthBehaviors: {},
height: 25
});
},
_init: function () {
BI.YearMonthCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.year = BI.createWidget({
type: "bi.year_combo",
behaviors: o.yearBehaviors
});
this.month = BI.createWidget({
type: "bi.month_combo",
behaviors: o.monthBehaviors
});
this.year.on(BI.YearCombo.EVENT_CONFIRM, function () {
self.fireEvent(BI.YearMonthCombo.EVENT_CONFIRM);
});
this.year.on(BI.YearCombo.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.YearMonthCombo.EVENT_BEFORE_POPUPVIEW);
});
this.month.on(BI.MonthCombo.EVENT_CONFIRM, function () {
self.fireEvent(BI.YearMonthCombo.EVENT_CONFIRM);
});
this.month.on(BI.MonthCombo.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.YearMonthCombo.EVENT_BEFORE_POPUPVIEW);
});
BI.createWidget({
type: "bi.center",
element: this,
hgap: 5,
items: [this.year, this.month]
});
},
setValue: function (v) {
v = v || {};
this.month.setValue(v.month);
this.year.setValue(v.year);
},
getValue: function () {
return {
year: this.year.getValue(),
month: this.month.getValue()
};
}
});
BI.YearMonthCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.YearMonthCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.shortcut('bi.year_month_combo', BI.YearMonthCombo);/**
* 年份 + 月份下拉框
*
* @class BI.YearQuarterCombo
* @extends BI.Widget
*/
BI.YearQuarterCombo = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.YearQuarterCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-year-quarter-combo",
yearBehaviors: {},
quarterBehaviors: {},
height: 25
});
},
_init: function () {
BI.YearQuarterCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.year = BI.createWidget({
type: "bi.year_combo",
behaviors: o.yearBehaviors
});
this.quarter = BI.createWidget({
type: "bi.quarter_combo",
behaviors: o.quarterBehaviors
});
this.year.on(BI.YearCombo.EVENT_CONFIRM, function () {
self.fireEvent(BI.YearQuarterCombo.EVENT_CONFIRM);
});
this.year.on(BI.YearCombo.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.YearQuarterCombo.EVENT_BEFORE_POPUPVIEW);
});
this.quarter.on(BI.QuarterCombo.EVENT_CONFIRM, function () {
self.fireEvent(BI.YearQuarterCombo.EVENT_CONFIRM);
});
this.quarter.on(BI.QuarterCombo.EVENT_BEFORE_POPUPVIEW, function () {
self.fireEvent(BI.YearQuarterCombo.EVENT_BEFORE_POPUPVIEW);
});
BI.createWidget({
type: "bi.center",
element: this,
hgap: 5,
items: [this.year, this.quarter]
});
},
setValue: function (v) {
v = v || {};
this.quarter.setValue(v.quarter);
this.year.setValue(v.year);
},
getValue: function () {
return {
year: this.year.getValue(),
quarter: this.quarter.getValue()
};
}
});
BI.YearQuarterCombo.EVENT_CONFIRM = "EVENT_CONFIRM";
BI.YearQuarterCombo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.shortcut('bi.year_quarter_combo', BI.YearQuarterCombo);/**
* 简单的复选下拉框控件, 适用于数据量少的情况, 与valuechooser的区别是allvaluechooser setValue和getValue返回的是所有值
* 封装了字段处理逻辑
*
* Created by GUY on 2015/10/29.
* @class BI.AbstractAllValueChooser
* @extends BI.Widget
*/
BI.AbstractAllValueChooser = BI.inherit(BI.Widget, {
_const: {
perPage: 100
},
_defaultConfig: function () {
return BI.extend(BI.AbstractAllValueChooser.superclass._defaultConfig.apply(this, arguments), {
width: 200,
height: 30,
items: null,
itemsCreator: BI.emptyFn,
cache: true
});
},
_valueFormatter: function (v) {
var text = v;
if (BI.isNotNull(this.items)) {
BI.some(this.items, function (i, item) {
if (item.value === v) {
text = item.text;
return true;
}
});
}
return text;
},
_itemsCreator: function (options, callback) {
var self = this, o = this.options;
if (!o.cache || !this.items) {
o.itemsCreator({}, function (items) {
self.items = items;
call(items);
});
} else {
call(this.items);
}
function call(items) {
var keywords = (options.keywords || []).slice();
if (options.keyword) {
keywords.push(options.keyword);
}
BI.each(keywords, function (i, kw) {
var search = BI.Func.getSearchResult(items, kw);
items = search.matched.concat(search.finded);
});
if (options.selectedValues) {//过滤
var filter = BI.makeObject(options.selectedValues, true);
items = BI.filter(items, function (i, ob) {
return !filter[ob.value];
});
}
if (options.type === BI.MultiSelectCombo.REQ_GET_ALL_DATA) {
callback({
items: items
});
return;
}
if (options.type === BI.MultiSelectCombo.REQ_GET_DATA_LENGTH) {
callback({count: items.length});
return;
}
callback({
items: items,
hasNext: false
});
}
}
});/**
* 简单的复选下拉框控件, 适用于数据量少的情况, 与valuechooser的区别是allvaluechooser setValue和getValue返回的是所有值
* 封装了字段处理逻辑
*
* Created by GUY on 2015/10/29.
* @class BI.AllValueChooserCombo
* @extends BI.AbstractAllValueChooser
*/
BI.AllValueChooserCombo = BI.inherit(BI.AbstractAllValueChooser, {
_defaultConfig: function () {
return BI.extend(BI.AllValueChooserCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-all-value-chooser-combo",
width: 200,
height: 30,
items: null,
itemsCreator: BI.emptyFn,
cache: true
});
},
_init: function () {
BI.AllValueChooserCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
if (BI.isNotNull(o.items)) {
this.items = o.items;
}
this.combo = BI.createWidget({
type: 'bi.multi_select_combo',
element: this,
itemsCreator: BI.bind(this._itemsCreator, this),
valueFormatter: BI.bind(this._valueFormatter, this),
width: o.width,
height: o.height
});
this.combo.on(BI.MultiSelectCombo.EVENT_CONFIRM, function () {
self.fireEvent(BI.AllValueChooserCombo.EVENT_CONFIRM);
});
},
setValue: function (v) {
this.combo.setValue({
type: BI.Selection.Multi,
value: v || []
});
},
getValue: function () {
var val = this.combo.getValue() || {};
if (val.type === BI.Selection.All) {
return val.assist;
}
return val.value || [];
},
populate: function () {
this.combo.populate.apply(this, arguments);
}
});
BI.AllValueChooserCombo.EVENT_CONFIRM = "AllValueChooserCombo.EVENT_CONFIRM";
BI.shortcut('bi.all_value_chooser_combo', BI.AllValueChooserCombo);/**
* 简单的复选下拉框控件, 适用于数据量少的情况, 与valuechooser的区别是allvaluechooser setValue和getValue返回的是所有值
* 封装了字段处理逻辑
*
* Created by GUY on 2015/10/29.
* @class BI.AllValueChooserPane
* @extends BI.AbstractAllValueChooser
*/
BI.AllValueChooserPane = BI.inherit(BI.AbstractAllValueChooser, {
_defaultConfig: function () {
return BI.extend(BI.AllValueChooserPane.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-all-value-chooser-pane",
width: 200,
height: 30,
items: null,
itemsCreator: BI.emptyFn,
cache: true
});
},
_init: function () {
BI.AllValueChooserPane.superclass._init.apply(this, arguments);
var self = this, o = this.options;
if (BI.isNotNull(o.items)) {
this.items = o.items;
}
this.list = BI.createWidget({
type: 'bi.multi_select_list',
element: this,
itemsCreator: BI.bind(this._itemsCreator, this),
valueFormatter: BI.bind(this._valueFormatter, this),
width: o.width,
height: o.height
});
this.list.on(BI.MultiSelectList.EVENT_CHANGE, function () {
self.fireEvent(BI.AllValueChooserPane.EVENT_CHANGE);
});
},
setValue: function (v) {
this.list.setValue({
type: BI.Selection.Multi,
value: v || []
});
},
getValue: function () {
var val = this.list.getValue() || {};
if (val.type === BI.Selection.All) {
return val.assist;
}
return val.value || [];
},
populate: function () {
this.list.populate.apply(this.list, arguments);
}
});
BI.AllValueChooserPane.EVENT_CHANGE = "AllValueChooserPane.EVENT_CHANGE";
BI.shortcut('bi.all_value_chooser_pane', BI.AllValueChooserPane);BI.AbstractTreeValueChooser = BI.inherit(BI.Widget, {
_const: {
perPage: 100
},
_defaultConfig: function () {
return BI.extend(BI.AbstractTreeValueChooser.superclass._defaultConfig.apply(this, arguments), {
items: null,
itemsCreator: BI.emptyFn
});
},
_initData: function (items) {
this.items = items;
var nodes = BI.Tree.treeFormat(items);
this.tree = new BI.Tree();
this.tree.initTree(nodes);
},
_itemsCreator: function (options, callback) {
var self = this, o = this.options;
if (!this.items) {
o.itemsCreator({}, function (items) {
self._initData(items);
call();
});
} else {
call();
}
function call() {
switch (options.type) {
case BI.TreeView.REQ_TYPE_INIT_DATA:
self._reqInitTreeNode(options, callback);
break;
case BI.TreeView.REQ_TYPE_ADJUST_DATA:
self._reqAdjustTreeNode(options, callback);
break;
case BI.TreeView.REQ_TYPE_SELECT_DATA:
self._reqSelectedTreeNode(options, callback);
break;
case BI.TreeView.REQ_TYPE_GET_SELECTED_DATA:
self._reqDisplayTreeNode(options, callback);
break;
default :
self._reqTreeNode(options, callback);
break;
}
}
},
_reqDisplayTreeNode: function (op, callback) {
var self = this;
var result = [];
var selectedValues = op.selectedValues;
if (selectedValues == null || BI.isEmpty(selectedValues)) {
callback({});
return;
}
doCheck([], this.tree.getRoot(), selectedValues);
callback({
items: result
});
function doCheck(parentValues, node, selected) {
if (selected == null || BI.isEmpty(selected)) {
BI.each(node.getChildren(), function (i, child) {
var newParents = BI.clone(parentValues);
newParents.push(child.value);
var llen = self._getChildCount(newParents);
createOneJson(child, node.id, llen);
doCheck(newParents, child, {});
});
return;
}
BI.each(selected, function (k) {
var node = self._getTreeNode(parentValues, k);
var newParents = BI.clone(parentValues);
newParents.push(node.value);
createOneJson(node, BI.last(parentValues), getCount(selected[k], newParents));
doCheck(newParents, node, selected[k]);
})
}
function getCount(jo, parentValues) {
if (jo == null) {
return 0;
}
if (BI.isEmpty(jo)) {
return self._getChildCount(parentValues);
}
return BI.size(jo);
}
function createOneJson(node, pId, llen) {
result.push({
id: node.id,
pId: pId,
text: node.text + (llen > 0 ? ("(" + BI.i18nText("BI-Basic_Altogether") + llen + BI.i18nText("BI-Basic_Count") + ")") : ""),
value: node.value,
open: true
});
}
},
_reqSelectedTreeNode: function (op, callback) {
var self = this;
var selectedValues = BI.deepClone(op.selectedValues);
var notSelectedValue = op.notSelectedValue || {};
var keyword = op.keyword || "";
var parentValues = op.parentValues || [];
if (selectedValues == null || BI.isEmpty(selectedValues)) {
callback({});
return;
}
dealWithSelectedValues(selectedValues);
callback(selectedValues);
function dealWithSelectedValues(selectedValues) {
var p = parentValues.concat(notSelectedValue);
//存储的值中存在这个值就把它删掉
if (canFindKey(selectedValues, p)) {
//如果搜索的值在父亲链中
if (isSearchValueInParent(p)) {
self._deleteNode(selectedValues, p);
} else {
var searched = [];
var finded = search(parentValues, notSelectedValue, [], searched);
if (finded && BI.isNotEmptyArray(searched)) {
BI.each(searched, function (i, arr) {
self._deleteNode(selectedValues, arr);
})
}
}
}
//存储的值中不存在这个值,但父亲节点是全选的情况
if (isChild(selectedValues, p)) {
var result = [], finded = false;
//如果parentValues中有匹配的值,说明搜索结果不在当前值下
if (isSearchValueInParent(p)) {
finded = true;
} else {
//从当前值开始搜
finded = search(parentValues, notSelectedValue, result);
p = parentValues;
}
if (finded === true) {
var next = selectedValues;
BI.each(p, function (i, v) {
var t = next[v];
if (t == null) {
if (BI.isEmpty(next)) {
var split = p.slice(0, i);
var expanded = self._getChildren(split);
BI.each(expanded, function (m, child) {
if (i === p.length - 1 && child.value === notSelectedValue) {
return true;
}
next[child.value] = {};
});
next = next[v];
} else {
next = {};
next[v] = {};
}
} else {
next = t;
}
});
if (result.length > 0) {
BI.each(result, function (i, strs) {
self._buildTree(selectedValues, strs);
})
}
}
}
}
function search(parents, current, result, searched) {
var newParents = BI.clone(parents);
newParents.push(current);
if (self._isMatch(current, keyword)) {
searched && searched.push(newParents);
return true;
}
var children = self._getChildren(newParents);
var notSearch = [];
var can = false;
BI.each(children, function (i, child) {
if (search(newParents, child.value, result, searched)) {
can = true;
} else {
notSearch.push(child.value);
}
});
if (can === true) {
BI.each(notSearch, function (i, v) {
var next = BI.clone(newParents);
next.push(v);
result.push(next);
});
}
return can;
}
function isSearchValueInParent(parentValues) {
for (var i = 0, len = parentValues.length; i < len; i++) {
if (self._isMatch(parentValues[i], keyword)) {
return true;
}
}
return false;
}
function canFindKey(selectedValues, parents) {
var t = selectedValues;
for (var i = 0; i < parents.length; i++) {
var v = parents[i];
t = t[v];
if (t == null) {
return false;
}
}
return true;
}
function isChild(selectedValues, parents) {
var t = selectedValues;
for (var i = 0; i < parents.length; i++) {
var v = parents[i];
if (!BI.has(t, v)) {
return false;
}
t = t[v];
if (BI.isEmpty(t)) {
return true;
}
}
return false;
}
},
_reqAdjustTreeNode: function (op, callback) {
var self = this;
var result = [];
var selectedValues = op.selectedValues;
if (selectedValues == null || BI.isEmpty(selectedValues)) {
callback({});
return;
}
BI.each(selectedValues, function (k, v) {
result.push([k]);
});
dealWithSelectedValues(selectedValues, []);
var jo = {};
BI.each(result, function (i, strs) {
self._buildTree(jo, strs);
});
callback(jo);
function dealWithSelectedValues(selected, parents) {
if (selected == null || BI.isEmpty(selected)) {
return true;
}
var can = true;
BI.each(selected, function (k, v) {
var p = BI.clone(parents);
p.push(k);
if (!dealWithSelectedValues(selected[k], p)) {
BI.each(selected[k], function (nk, nv) {
var t = BI.clone(p);
t.push(nk);
result.push(t);
});
can = false;
}
});
return can && isAllSelected(selected, parents);
}
function isAllSelected(selected, parents) {
return BI.isEmpty(selected) || self._getChildCount(parents) === BI.size(selected);
}
},
_reqInitTreeNode: function (op, callback) {
var self = this;
var result = [];
var keyword = op.keyword || "";
var selectedValues = op.selectedValues;
var lastSearchValue = op.lastSearchValue || "";
var output = search();
BI.nextTick(function () {
callback({
hasNext: output.length > self._const.perPage,
items: result,
lastSearchValue: BI.last(output)
})
});
function search() {
var children = self._getChildren([]);
var start = children.length;
if (lastSearchValue !== "") {
for (var j = 0, len = start; j < len; j++) {
if (children[j].value === lastSearchValue) {
start = j + 1;
break;
}
}
} else {
start = 0;
}
var output = [];
for (var i = start, len = children.length; i < len; i++) {
if (output.length < self._const.perPage) {
var find = nodeSearch(1, [], children[i].value, false, result);
} else if (output.length === self._const.perPage) {
var find = nodeSearch(1, [], children[i].value, false, []);
}
if (find[0] === true) {
output.push(children[i].value);
}
if (output.length > self._const.perPage) {
break;
}
}
return output;
}
function nodeSearch(deep, parentValues, current, isAllSelect, result) {
if (self._isMatch(current, keyword)) {
var checked = isAllSelect || isSelected(parentValues, current);
createOneJson(parentValues, current, false, checked, !isAllSelect && isHalf(parentValues, current), true, result);
return [true, checked];
}
var newParents = BI.clone(parentValues);
newParents.push(current);
var children = self._getChildren(newParents);
var can = false, checked = false;
var isCurAllSelected = isAllSelect || isAllSelected(parentValues, current);
BI.each(children, function (i, child) {
var state = nodeSearch(deep + 1, newParents, child.value, isCurAllSelected, result);
if (state[1] === true) {
checked = true;
}
if (state[0] === true) {
can = true;
}
});
if (can === true) {
checked = isCurAllSelected || (isSelected(parentValues, current) && checked);
createOneJson(parentValues, current, true, checked, false, false, result);
}
return [can, checked];
}
function createOneJson(parentValues, value, isOpen, checked, half, flag, result) {
var node = self._getTreeNode(parentValues, value)
result.push({
id: node.id,
pId: node.pId,
text: node.text,
value: node.value,
title: node.title,
isParent: node.getChildrenLength() > 0,
open: isOpen,
checked: checked,
halfCheck: half,
flag: flag
});
}
function isHalf(parentValues, value) {
var find = findSelectedObj(parentValues);
if (find == null) {
return null;
}
return BI.any(find, function (v, ob) {
if (v === value) {
if (ob != null && !BI.isEmpty(ob)) {
return true;
}
}
});
}
function isAllSelected(parentValues, value) {
var find = findSelectedObj(parentValues);
if (find == null) {
return null;
}
return BI.any(find, function (v, ob) {
if (v === value) {
if (ob != null && BI.isEmpty(ob)) {
return true;
}
}
});
}
function isSelected(parentValues, value) {
var find = findSelectedObj(parentValues);
if (find == null) {
return false;
}
return BI.any(find, function (v) {
if (v === value) {
return true;
}
});
}
function findSelectedObj(parentValues) {
var find = selectedValues;
if (find == null) {
return null;
}
BI.every(parentValues, function (i, v) {
find = find[v];
if (find == null) {
return false;
}
return true;
});
return find;
}
},
_reqTreeNode: function (op, callback) {
var self = this;
var result = [];
var times = op.times;
var checkState = op.checkState || {};
var parentValues = op.parentValues || [];
var selectedValues = op.selectedValues || {};
var valueMap = {};
// if (judgeState(parentValues, selectedValues, checkState)) {
valueMap = dealWidthSelectedValue(parentValues, selectedValues);
// }
var nodes = this._getChildren(parentValues);
for (var i = (times - 1) * this._const.perPage; nodes[i] && i < times * this._const.perPage; i++) {
var state = getCheckState(nodes[i].value, parentValues, valueMap, checkState);
result.push({
id: nodes[i].id,
pId: nodes[i].pId,
value: nodes[i].value,
text: nodes[i].text,
times: 1,
isParent: nodes[i].getChildrenLength() > 0,
checked: state[0],
halfCheck: state[1]
})
}
BI.nextTick(function () {
callback({
items: result,
hasNext: nodes.length > times * self._const.perPage
});
});
function judgeState(parentValues, selected_value, checkState) {
var checked = checkState.checked, half = checkState.half;
if (parentValues.length > 0 && !checked) {
return false;
}
return (parentValues.length === 0 || (checked && half) && !BI.isEmpty(selected_value));
}
function dealWidthSelectedValue(parentValues, selectedValues) {
var valueMap = {};
BI.each(parentValues, function (i, v) {
selectedValues = selectedValues[v] || {};
});
BI.each(selectedValues, function (value, obj) {
if (BI.isNull(obj)) {
valueMap[value] = [0, 0];
return;
}
if (BI.isEmpty(obj)) {
valueMap[value] = [2, 0];
return;
}
var nextNames = {};
BI.each(obj, function (t, o) {
if (BI.isNull(o) || BI.isEmpty(o)) {
nextNames[t] = true;
}
});
valueMap[value] = [1, BI.size(nextNames)];
});
return valueMap;
}
function getCheckState(current, parentValues, valueMap, checkState) {
var checked = checkState.checked, half = checkState.half;
var tempCheck = false, halfCheck = false;
if (BI.has(valueMap, current)) {
//可能是半选
if (valueMap[current][0] === 1) {
var values = BI.clone(parentValues);
values.push(current);
var childCount = self._getChildCount(values);
if (childCount > 0 && childCount !== valueMap[current][1]) {
halfCheck = true;
}
} else if (valueMap[current][0] === 2) {
tempCheck = true;
}
}
var check;
if (!checked && !halfCheck && !tempCheck) {
check = BI.has(valueMap, current);
} else {
check = ((tempCheck || checked) && !half) || BI.has(valueMap, current);
}
return [check, halfCheck];
}
},
_getNode: function (selectedValues, parentValues) {
var pNode = selectedValues;
for (var i = 0, len = parentValues.length; i < len; i++) {
if (pNode == null) {
return null;
}
pNode = pNode[parentValues[i]];
}
return pNode;
},
_deleteNode: function (selectedValues, values) {
var name = values[values.length - 1];
var p = values.slice(0, values.length - 1);
var pNode = this._getNode(selectedValues, p);
if (pNode != null && pNode[name]) {
delete pNode[name];
//递归删掉空父节点
while (p.length > 0 && BI.isEmpty(pNode)) {
name = p[p.length - 1];
p = p.slice(0, p.length - 1);
pNode = this._getNode(selectedValues, p);
if (pNode != null) {
delete pNode[name];
}
}
}
},
_buildTree: function (jo, values) {
var t = jo;
BI.each(values, function (i, v) {
if (!BI.has(t, v)) {
t[v] = {};
}
t = t[v];
});
},
_isMatch: function (value, keyword) {
var finded = BI.Func.getSearchResult([value], keyword);
return finded.finded.length > 0 || finded.matched.length > 0;
},
_getTreeNode: function (parentValues, v) {
var self = this;
var findedParentNode;
var index = 0;
this.tree.traverse(function (node) {
if (self.tree.isRoot(node)) {
return;
}
if (index > parentValues.length) {
return false;
}
if (index === parentValues.length && node.value === v) {
findedParentNode = node;
return false;
}
if (node.value === parentValues[index]) {
index++;
return;
}
return true;
});
return findedParentNode;
},
_getChildren: function (parentValues) {
if (parentValues.length > 0) {
var value = BI.last(parentValues);
var parent = this._getTreeNode(parentValues.slice(0, parentValues.length - 1), value);
} else {
var parent = this.tree.getRoot();
}
return parent.getChildren();
},
_getChildCount: function (parentValues) {
return this._getChildren(parentValues).length;
}
});/**
* 简单的复选下拉树控件, 适用于数据量少的情况
*
* Created by GUY on 2015/10/29.
* @class BI.TreeValueChooserCombo
* @extends BI.Widget
*/
BI.TreeValueChooserCombo = BI.inherit(BI.AbstractTreeValueChooser, {
_defaultConfig: function () {
return BI.extend(BI.TreeValueChooserCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-tree-value-chooser-combo",
width: 200,
height: 30,
items: null,
itemsCreator: BI.emptyFn
});
},
_init: function () {
BI.TreeValueChooserCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
if (BI.isNotNull(o.items)) {
this._initData(o.items);
}
this.combo = BI.createWidget({
type: 'bi.multi_tree_combo',
element: this,
itemsCreator: BI.bind(this._itemsCreator, this),
width: o.width,
height: o.height
});
this.combo.on(BI.MultiTreeCombo.EVENT_CONFIRM, function () {
self.fireEvent(BI.TreeValueChooserCombo.EVENT_CONFIRM);
});
},
setValue: function (v) {
this.combo.setValue(v);
},
getValue: function () {
return this.combo.getValue();
},
populate: function () {
this.combo.populate.apply(this.combo, arguments);
}
});
BI.TreeValueChooserCombo.EVENT_CONFIRM = "TreeValueChooserCombo.EVENT_CONFIRM";
BI.shortcut('bi.tree_value_chooser_combo', BI.TreeValueChooserCombo);/**
* 简单的复选下拉树控件, 适用于数据量少的情况
*
* Created by GUY on 2015/10/29.
* @class BI.TreeValueChooserPane
* @extends BI.AbstractTreeValueChooser
*/
BI.TreeValueChooserPane = BI.inherit(BI.AbstractTreeValueChooser, {
_defaultConfig: function () {
return BI.extend(BI.TreeValueChooserPane.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-tree-value-chooser-pane",
items: null,
itemsCreator: BI.emptyFn
});
},
_init: function () {
BI.TreeValueChooserPane.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.pane = BI.createWidget({
type: 'bi.multi_select_tree',
element: this,
itemsCreator: BI.bind(this._itemsCreator, this)
});
this.pane.on(BI.MultiSelectTree.EVENT_CHANGE, function () {
self.fireEvent(BI.TreeValueChooserPane.EVENT_CHANGE);
});
if (BI.isNotNull(o.items)) {
this._initData(o.items);
this.populate();
}
},
setSelectedValue: function (v) {
this.pane.setSelectedValue(v);
},
setValue: function (v) {
this.pane.setValue(v);
},
getValue: function () {
return this.pane.getValue();
},
populate: function () {
this.pane.populate.apply(this.pane, arguments);
}
});
BI.TreeValueChooserPane.EVENT_CHANGE = "TreeValueChooserPane.EVENT_CHANGE";
BI.shortcut('bi.tree_value_chooser_pane', BI.TreeValueChooserPane);/**
* 简单的复选下拉框控件, 适用于数据量少的情况
* 封装了字段处理逻辑
*
* Created by GUY on 2015/10/29.
* @class BI.AbstractValueChooser
* @extends BI.Widget
*/
BI.AbstractValueChooser = BI.inherit(BI.Widget, {
_const: {
perPage: 100
},
_defaultConfig: function () {
return BI.extend(BI.AbstractValueChooser.superclass._defaultConfig.apply(this, arguments), {
items: null,
itemsCreator: BI.emptyFn,
cache: true
});
},
_valueFormatter: function (v) {
var text = v;
if (BI.isNotNull(this.items)) {
BI.some(this.items, function (i, item) {
if (item.value === v) {
text = item.text;
return true;
}
});
}
return text;
},
_getItemsByTimes: function (items, times) {
var res = [];
for (var i = (times - 1) * this._const.perPage; items[i] && i < times * this._const.perPage; i++) {
res.push(items[i]);
}
return res;
},
_hasNextByTimes: function (items, times) {
return times * this._const.perPage < items.length;
},
_itemsCreator: function (options, callback) {
var self = this, o = this.options;
if (!o.cache || !this.items) {
o.itemsCreator({}, function (items) {
self.items = items;
call(items);
});
} else {
call(this.items);
}
function call(items) {
var keywords = (options.keywords || []).slice();
if (options.keyword) {
keywords.push(options.keyword);
}
BI.each(keywords, function (i, kw) {
var search = BI.Func.getSearchResult(items, kw);
items = search.matched.concat(search.finded);
});
if (options.selectedValues) {//过滤
var filter = BI.makeObject(options.selectedValues, true);
items = BI.filter(items, function (i, ob) {
return !filter[ob.value];
});
}
if (options.type === BI.MultiSelectCombo.REQ_GET_ALL_DATA) {
callback({
items: items
});
return;
}
if (options.type === BI.MultiSelectCombo.REQ_GET_DATA_LENGTH) {
callback({count: items.length});
return;
}
callback({
items: self._getItemsByTimes(items, options.times),
hasNext: self._hasNextByTimes(items, options.times)
});
}
}
});/**
* 简单的复选下拉框控件, 适用于数据量少的情况
* 封装了字段处理逻辑
*
* Created by GUY on 2015/10/29.
* @class BI.ValueChooserCombo
* @extends BI.Widget
*/
BI.ValueChooserCombo = BI.inherit(BI.AbstractValueChooser, {
_defaultConfig: function () {
return BI.extend(BI.ValueChooserCombo.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-value-chooser-combo",
width: 200,
height: 30,
items: null,
itemsCreator: BI.emptyFn,
cache: true
});
},
_init: function () {
BI.ValueChooserCombo.superclass._init.apply(this, arguments);
var self = this, o = this.options;
if (BI.isNotNull(o.items)) {
this.items = o.items;
}
this.combo = BI.createWidget({
type: 'bi.multi_select_combo',
element: this,
itemsCreator: BI.bind(this._itemsCreator, this),
valueFormatter: BI.bind(this._valueFormatter, this),
width: o.width,
height: o.height
});
this.combo.on(BI.MultiSelectCombo.EVENT_CONFIRM, function () {
self.fireEvent(BI.ValueChooserCombo.EVENT_CONFIRM);
});
},
setValue: function (v) {
this.combo.setValue(v);
},
getValue: function () {
var val = this.combo.getValue() || {};
return {
type: val.type,
value: val.value
}
},
populate: function () {
this.combo.populate.apply(this, arguments);
}
});
BI.ValueChooserCombo.EVENT_CONFIRM = "ValueChooserCombo.EVENT_CONFIRM";
BI.shortcut('bi.value_chooser_combo', BI.ValueChooserCombo);/**
* 简单的复选下拉框控件, 适用于数据量少的情况
* 封装了字段处理逻辑
*
* Created by GUY on 2015/10/29.
* @class BI.ValueChooserPane
* @extends BI.Widget
*/
BI.ValueChooserPane = BI.inherit(BI.AbstractValueChooser, {
_defaultConfig: function () {
return BI.extend(BI.ValueChooserPane.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-value-chooser-pane",
items: null,
itemsCreator: BI.emptyFn,
cache: true
});
},
_init: function () {
BI.ValueChooserPane.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.list = BI.createWidget({
type: 'bi.multi_select_list',
element: this,
itemsCreator: BI.bind(this._itemsCreator, this),
valueFormatter: BI.bind(this._valueFormatter, this)
});
this.list.on(BI.MultiSelectList.EVENT_CHANGE, function () {
self.fireEvent(BI.ValueChooserPane.EVENT_CHANGE);
});
if (BI.isNotNull(o.items)) {
this.items = o.items;
this.populate();
}
},
setValue: function (v) {
this.list.setValue(v);
},
getValue: function () {
var val = this.list.getValue() || {};
return {
type: val.type,
value: val.value
}
},
populate: function () {
this.list.populate.apply(this.list, arguments);
}
});
BI.ValueChooserPane.EVENT_CHANGE = "ValueChooserPane.EVENT_CHANGE";
BI.shortcut('bi.value_chooser_pane', BI.ValueChooserPane);