forked from fanruan/fineui
guy
8 years ago
20 changed files with 1629 additions and 898 deletions
@ -0,0 +1,34 @@
|
||||
Demo.TreeValueChooser = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "demo-tree-value-chooser" |
||||
}, |
||||
render: function () { |
||||
|
||||
var tree = []; |
||||
for (var i = 0; i < 221; i++) { |
||||
tree.push({ |
||||
value: "" + i + "", |
||||
text: "" + i + "", |
||||
id: i + "", |
||||
pId: null |
||||
}); |
||||
for (var j = 0; j < 9; j++) { |
||||
tree.push({ |
||||
value: i + "-" + j, |
||||
text: j + "", |
||||
id: i + "-" + j, |
||||
pId: i + "" |
||||
}) |
||||
} |
||||
} |
||||
return { |
||||
type: "bi.tree_value_chooser_pane", |
||||
width: 300, |
||||
items: tree, |
||||
itemsCreator: function (op, callback) { |
||||
callback(tree); |
||||
} |
||||
}; |
||||
} |
||||
}); |
||||
BI.shortcut("demo.tree_value_chooser_pane", Demo.TreeValueChooser); |
@ -0,0 +1,15 @@
|
||||
Demo.ValueChooserPane = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "demo-value-chooser-pane" |
||||
}, |
||||
render: function () { |
||||
return { |
||||
type: "bi.value_chooser_pane", |
||||
items: BI.deepClone(Demo.CONSTANTS.ITEMS), |
||||
itemsCreator: function (op, callback) { |
||||
callback(BI.deepClone(Demo.CONSTANTS.ITEMS)); |
||||
} |
||||
}; |
||||
} |
||||
}); |
||||
BI.shortcut("demo.value_chooser_pane", Demo.ValueChooserPane); |
@ -0,0 +1,79 @@
|
||||
/** |
||||
* 简单的复选下拉框控件, 适用于数据量少的情况, 与valuechooser的区别是allvaluechooser setValue和getValue返回的是所有值 |
||||
* 封装了字段处理逻辑 |
||||
* |
||||
* Created by GUY on 2015/10/29. |
||||
* @class BI.AllValueChooserCombo |
||||
* @extends BI.Widget |
||||
*/ |
||||
BI.AbstractAllValueChooser = BI.inherit(BI.Widget, { |
||||
|
||||
_const: { |
||||
perPage: 100 |
||||
}, |
||||
|
||||
_defaultConfig: function () { |
||||
return BI.extend(BI.AllValueChooserCombo.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 |
||||
}); |
||||
} |
||||
} |
||||
}); |
@ -0,0 +1,62 @@
|
||||
/** |
||||
* 简单的复选下拉框控件, 适用于数据量少的情况, 与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); |
@ -0,0 +1,555 @@
|
||||
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.transformToTreeFormat(items); |
||||
this.tree = new BI.Tree(); |
||||
this.tree.initTree(nodes); |
||||
this._initMap(); |
||||
this._initFloors(); |
||||
}, |
||||
|
||||
_initMap: function () { |
||||
var map = this.map = {}; |
||||
BI.each(this.items, function (i, item) { |
||||
map[item.value] = item; |
||||
}); |
||||
}, |
||||
|
||||
_initFloors: function () { |
||||
this.floors = -1; |
||||
var root = this.tree.getRoot(); |
||||
while (root) { |
||||
this.floors++; |
||||
root = root.getChildren()[0]; |
||||
} |
||||
}, |
||||
|
||||
_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(0, [], this.tree.getRoot(), selectedValues); |
||||
|
||||
callback({ |
||||
items: result |
||||
}); |
||||
|
||||
function doCheck(floor, parentValues, node, selected) { |
||||
if (floor >= self.floors) { |
||||
return; |
||||
} |
||||
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(floor + 1, newParents, child, {}); |
||||
}); |
||||
return; |
||||
} |
||||
BI.each(selected, function (k) { |
||||
var node = self._getNode(k); |
||||
var newParents = BI.clone(parentValues); |
||||
newParents.push(node.value); |
||||
createOneJson(node, BI.last(parentValues), getCount(selected[k], newParents)); |
||||
doCheck(floor + 1, 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 = 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 = BI.clone(parentValues); |
||||
p.push(notSelectedValue); |
||||
|
||||
if (isChild(selectedValues, p)) { |
||||
var result = []; |
||||
var finded = search(parentValues.length + 1, parentValues, notSelectedValue, result); |
||||
|
||||
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(deep, parents, current, result) { |
||||
var newParents = BI.clone(parents); |
||||
newParents.push(current); |
||||
if (self._isMatch(current, keyword)) { |
||||
return true; |
||||
} |
||||
if (deep >= self.floors) { |
||||
return false; |
||||
} |
||||
|
||||
var children = self._getChildren(newParents); |
||||
|
||||
var notSearch = []; |
||||
var can = false; |
||||
|
||||
BI.each(children, function (i, child) { |
||||
if (search(deep + 1, newParents, child.value, result)) { |
||||
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 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 (t == null || BI.isEmpty(t)) { |
||||
return true; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
}, |
||||
|
||||
_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]; |
||||
} |
||||
if (deep >= self.floors) { |
||||
return [false, false]; |
||||
} |
||||
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.map[value]; |
||||
result.push({ |
||||
id: node.id, |
||||
pId: node.pId, |
||||
text: node.text, |
||||
value: node.value, |
||||
title: node.title, |
||||
isParent: parentValues.length + 1 < self.floors, |
||||
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: parentValues.length + 1 < this.floors, |
||||
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 hasChild = parentValues.length + 1 < self.floors; |
||||
var tempCheck = false, halfCheck = false; |
||||
if (BI.has(valueMap, current)) { |
||||
//可能是半选
|
||||
if (valueMap[current][0] === 1) { |
||||
var values = BI.clone(parentValues); |
||||
values.push(current); |
||||
if (hasChild && self._getChildCount(values) !== 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]; |
||||
} |
||||
}, |
||||
|
||||
|
||||
_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; |
||||
}, |
||||
|
||||
_getNode: function (v) { |
||||
return this.tree.search(v, "value"); |
||||
}, |
||||
|
||||
_getChildren: function (parentValues) { |
||||
if (parentValues.length > 0) { |
||||
var value = BI.last(parentValues); |
||||
var parent = this.tree.search(value, "value"); |
||||
} else { |
||||
var parent = this.tree.getRoot(); |
||||
} |
||||
return parent.getChildren(); |
||||
}, |
||||
|
||||
_getChildCount: function (parentValues) { |
||||
return this._getChildren(parentValues).length; |
||||
} |
||||
}); |
@ -0,0 +1,49 @@
|
||||
/** |
||||
* 简单的复选下拉树控件, 适用于数据量少的情况 |
||||
* |
||||
* 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(); |
||||
} |
||||
}, |
||||
|
||||
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); |
@ -0,0 +1,89 @@
|
||||
/** |
||||
* 简单的复选下拉框控件, 适用于数据量少的情况 |
||||
* 封装了字段处理逻辑 |
||||
* |
||||
* 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) |
||||
}); |
||||
} |
||||
} |
||||
}); |
@ -0,0 +1,58 @@
|
||||
/** |
||||
* 简单的复选下拉框控件, 适用于数据量少的情况 |
||||
* 封装了字段处理逻辑 |
||||
* |
||||
* 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", |
||||
width: 200, |
||||
height: 30, |
||||
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); |
Loading…
Reference in new issue