Browse Source

Merge branch 'es6' of ssh://code.fineres.com:7999/~treecat/fineui into es6

# Conflicts:
#	src/base/index.js
es6
Treecat 2 years ago
parent
commit
f29b613517
  1. 4
      demo/js/core/abstract/combination/demo.combo.js
  2. 4
      demo/js/core/abstract/combination/demo.combo_group.js
  3. 14
      src/base/0.base.js
  4. 2
      src/base/1.pane.js
  5. 972
      src/base/combination/bubble.js
  6. 682
      src/base/combination/combo.js
  7. 245
      src/base/combination/expander.js
  8. 326
      src/base/combination/group.button.js
  9. 98
      src/base/combination/group.combo.js
  10. 130
      src/base/combination/group.virtual.js
  11. 12
      src/base/combination/index.js
  12. 221
      src/base/combination/loader.js
  13. 162
      src/base/combination/navigation.js
  14. 306
      src/base/combination/searcher.js
  15. 278
      src/base/combination/switcher.js
  16. 177
      src/base/combination/tab.js
  17. 142
      src/base/combination/tree.button.js
  18. 54
      src/base/foundation/message.js
  19. 100
      src/base/index.js
  20. 4
      src/base/layer/index.js
  21. 2
      src/base/layer/layer.drawer.js
  22. 2
      src/base/layer/layer.popup.js
  23. 4
      src/base/layer/layer.searcher.js
  24. 3
      src/base/list/index.js
  25. 2
      src/base/list/listview.js
  26. 2
      src/base/list/virtualgrouplist.js
  27. 2
      src/base/list/virtuallist.js
  28. 2
      src/base/single/0.single.js
  29. 6
      src/base/single/1.text.js
  30. 4
      src/base/single/a/a.js
  31. 2
      src/base/single/button/button.basic.js
  32. 17
      src/base/single/button/index.js
  33. 5
      src/base/single/index.js
  34. 4
      src/base/single/tip/0.tip.js
  35. 3
      src/base/single/tip/index.js
  36. 4
      src/base/single/tip/tip.toast.js
  37. 4
      src/base/single/tip/tip.tooltip.js
  38. 145
      src/core/2.base.js
  39. 6
      src/core/3.ob.js
  40. 16
      src/core/4.widget.js
  41. 26
      src/core/5.inject.js
  42. 4
      src/core/action/action.js
  43. 4
      src/core/action/action.show.js
  44. 2
      src/core/action/index.js
  45. 4
      src/core/behavior/0.behavior.js
  46. 4
      src/core/behavior/behavior.highlight.js
  47. 4
      src/core/behavior/behavior.redmark.js
  48. 3
      src/core/behavior/index.js
  49. 4
      src/core/controller/0.controller.js
  50. 4
      src/core/controller/controller.broadcast.js
  51. 4
      src/core/controller/controller.bubbles.js
  52. 4
      src/core/controller/controller.drawer.js
  53. 4
      src/core/controller/controller.layer.js
  54. 4
      src/core/controller/controller.masker.js
  55. 4
      src/core/controller/controller.popover.js
  56. 4
      src/core/controller/controller.resizer.js
  57. 4
      src/core/controller/controller.tooltips.js
  58. 9
      src/core/controller/index.js
  59. 6
      src/core/func/__test__/function.test.js
  60. 1661
      src/core/func/alias.js
  61. 29
      src/core/func/array.js
  62. 615
      src/core/func/date.js
  63. 300
      src/core/func/function.js
  64. 6
      src/core/func/index.js
  65. 274
      src/core/func/number.js
  66. 224
      src/core/func/string.js
  67. 93
      src/core/index.js
  68. 52
      src/core/listener/listener.show.js
  69. 4
      src/core/loader/loader.style.js
  70. 123
      src/core/platform/web/detectElementResize.js
  71. 863
      src/core/utils/chinesePY.js

4
demo/js/core/abstract/combination/demo.combo.js

@ -29,7 +29,7 @@ Demo.Func = BI.inherit(BI.Widget, {
iconCls1: "close-ha-font",
iconCls2: "close-ha-font"
},
children: [{
items: [{
type: "bi.single_select_item",
height: 25,
text: "一月",
@ -385,7 +385,7 @@ Demo.Func = BI.inherit(BI.Widget, {
},
width: 200
});
childCombo.setValue(BI.deepClone(this.child)[0].children[0].value);
childCombo.setValue(BI.deepClone(this.child)[0].items[0].value);
var monthCombo = BI.createWidget({
type: "bi.combo",

4
demo/js/core/abstract/combination/demo.combo_group.js

@ -12,7 +12,7 @@ Demo.Func = BI.inherit(BI.Widget, {
height: 25,
iconCls: "close-ha-font"
},
children: [{
items: [{
type: "bi.single_select_item",
height: 25,
text: "一月",
@ -63,7 +63,7 @@ Demo.Func = BI.inherit(BI.Widget, {
},
width: 200
});
childCombo.setValue(BI.deepClone(this.child)[0].children[0].value);
childCombo.setValue(BI.deepClone(this.child)[0].items[0].value);
return BI.createWidget({
type: "bi.left",

14
src/base/0.base.js

@ -7,7 +7,7 @@ import {
PopoverController,
ResizeController,
TooltipsController,
StyleLoaderManager
StyleLoaderManager,
} from "../core";
const Resizers = new ResizeController();
@ -20,18 +20,6 @@ const Drawers = new DrawerController();
const Broadcasts = new BroadcastController();
const StyleLoaders = new StyleLoaderManager();
BI.extend(BI, {
Resizers,
Layers,
Maskers,
Bubbles,
Tooltips,
Popovers,
Drawers,
Broadcasts,
StyleLoaders
});
export {
Resizers,
Layers,

2
src/base/1.pane.js

@ -10,7 +10,7 @@ import { Widget, shortcut, isNotEmptyString, extend, isNull, isEmpty, createWidg
import { Layers } from "./0.base";
@shortcut()
export default class Pane extends Widget {
export class Pane extends Widget {
static xtype = "bi.pane";
static EVENT_LOADED = "EVENT_LOADED";
static EVENT_LOADING = "EVENT_LOADING";

972
src/base/combination/bubble.js

File diff suppressed because it is too large Load Diff

682
src/base/combination/combo.js

@ -1,374 +1,374 @@
!(function () {
var needHideWhenAnotherComboOpen = {};
var currentOpenedCombos = {};
/**
* @class BI.Combo
* @extends BI.Widget
*/
/**
* @class BI.Combo
* @extends BI.Widget
*/
BI.Combo = BI.inherit(BI.Bubble, {
_const: {
TRIANGLE_LENGTH: 12,
},
_defaultConfig: function () {
var conf = BI.Combo.superclass._defaultConfig.apply(this, arguments);
import { shortcut, Widget, Controller, extend, createWidget, nextTick, bind, isNotNull, isNull, isFunction, each } from "../../core";
import { Bubble } from "./bubble";
import { Resizers } from "../0.base";
return BI.extend(conf, {
baseCls: (conf.baseCls || "") + " bi-combo" + (BI.isIE() ? " hack" : ""),
attributes: {
tabIndex: -1,
},
trigger: "click", // click || hover || click-hover || ""
toggle: true,
direction: "bottom", // top||bottom||left||right||top,left||top,right||bottom,left||bottom,right||right,innerRight||right,innerLeft||innerRight||innerLeft
logic: {
dynamic: true,
},
container: null, // popupview放置的容器,默认为this.element
isDefaultInit: false,
destroyWhenHide: false,
hideWhenBlur: true,
hideWhenAnotherComboOpen: false,
hideWhenClickOutside: true,
showArrow: false,
isNeedAdjustHeight: true, // 是否需要高度调整
isNeedAdjustWidth: true,
stopEvent: false,
stopPropagation: false,
adjustLength: 0, // 调整的距离
adjustXOffset: 0,
adjustYOffset: 0,
supportCSSTransform: true,
hideChecker: BI.emptyFn,
offsetStyle: "", // "",center,middle
el: {},
popup: {},
comboClass: "bi-combo-popup",
hoverClass: "bi-combo-hover",
belowMouse: false,
});
},
let needHideWhenAnotherComboOpen = {};
let currentOpenedCombos = {};
render: function () {
var self = this, o = this.options;
this._initCombo();
// 延迟绑定事件,这样可以将自己绑定的事情优先执行
BI.nextTick(() => {
!this.isDestroyed() && this._initPullDownAction();
});
this.combo.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
if (self.isEnabled() && self.isValid()) {
if (type === BI.Events.TOGGLE) {
self._toggle();
}
if (type === BI.Events.EXPAND) {
self._popupView();
}
if (type === BI.Events.COLLAPSE) {
self._hideView();
}
if (type === BI.Events.EXPAND) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
self.fireEvent(BI.Combo.EVENT_EXPAND);
}
if (type === BI.Events.COLLAPSE) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
self.isViewVisible() && self.fireEvent(BI.Combo.EVENT_COLLAPSE);
}
if (type === BI.Events.CLICK) {
self.fireEvent(BI.Combo.EVENT_TRIGGER_CHANGE, obj);
}
}
});
@shortcut()
export class Combo extends Bubble {
static xtype = "bi.combo";
self.element.on("mouseenter." + self.getName(), function (e) {
if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) {
self.element.addClass(o.hoverClass);
static EVENT_TRIGGER_CHANGE = "EVENT_TRIGGER_CHANGE";
static EVENT_CHANGE = "EVENT_CHANGE";
static EVENT_EXPAND = "EVENT_EXPAND";
static EVENT_COLLAPSE = "EVENT_COLLAPSE";
static EVENT_AFTER_INIT = "EVENT_AFTER_INIT";
static EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
static EVENT_AFTER_POPUPVIEW = "EVENT_AFTER_POPUPVIEW";
static EVENT_BEFORE_HIDEVIEW = "EVENT_BEFORE_HIDEVIEW";
static EVENT_AFTER_HIDEVIEW = "EVENT_AFTER_HIDEVIEW";
_defaultConfig() {
const conf = super._defaultConfig(arguments);
return extend(conf, {
baseCls: (conf.baseCls || "") + " bi-combo" + (BI.isIE() ? " hack" : ""),
attributes: {
tabIndex: -1,
},
trigger: "click", // click || hover || click-hover || ""
toggle: true,
direction: "bottom", // top||bottom||left||right||top,left||top,right||bottom,left||bottom,right||right,innerRight||right,innerLeft||innerRight||innerLeft
logic: {
dynamic: true,
},
container: null, // popupview放置的容器,默认为this.element
isDefaultInit: false,
destroyWhenHide: false,
hideWhenBlur: true,
hideWhenAnotherComboOpen: false,
hideWhenClickOutside: true,
showArrow: false,
isNeedAdjustHeight: true, // 是否需要高度调整
isNeedAdjustWidth: true,
stopEvent: false,
stopPropagation: false,
adjustLength: 0, // 调整的距离
adjustXOffset: 0,
adjustYOffset: 0,
supportCSSTransform: true,
hideChecker: BI.emptyFn,
offsetStyle: "", // "",center,middle
el: {},
popup: {},
comboClass: "bi-combo-popup",
hoverClass: "bi-combo-hover",
belowMouse: false,
});
}
render() {
const { hoverClass, logic, isDefaultInit } = this.options;
this._initCombo();
// 延迟绑定事件,这样可以将自己绑定的事情优先执行
nextTick(() => {
!this.isDestroyed() && this._initPullDownAction();
});
this.combo.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
if (this.isEnabled() && this.isValid()) {
if (type === BI.Events.TOGGLE) {
this._toggle();
}
});
self.element.on("mouseleave." + self.getName(), function (e) {
if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) {
self.element.removeClass(o.hoverClass);
if (type === BI.Events.EXPAND) {
this._popupView();
}
});
BI.createWidget(BI.extend({
element: this,
scrolly: false,
}, BI.LogicFactory.createLogic("vertical", BI.extend(o.logic, {
items: [
{ el: this.combo }
],
}))));
o.isDefaultInit && (this._assertPopupView());
BI.Resizers.add(this.getName(), BI.bind(function (e) {
// 如果resize对象是combo的子元素,则不应该收起,或交由hideChecker去处理
if (this.isViewVisible()) {
BI.isNotNull(e) ? this._hideIf(e) : this._hideView();
if (type === BI.Events.COLLAPSE) {
this._hideView();
}
if (type === BI.Events.EXPAND) {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
this.fireEvent(Combo.EVENT_EXPAND);
}
if (type === BI.Events.COLLAPSE) {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
this.isViewVisible() && this.fireEvent(Combo.EVENT_COLLAPSE);
}
if (type === BI.Events.CLICK) {
this.fireEvent(Combo.EVENT_TRIGGER_CHANGE, obj);
}
}, this));
},
_assertPopupView: function () {
var self = this, o = this.options;
if (BI.isNull(this.popupView)) {
this.popupView = BI.createWidget(BI.isFunction(this.options.popup) ? this.options.popup() : this.options.popup, {
type: "bi.popup_view",
showArrow: o.showArrow,
value: o.value,
}, this);
this.popupView.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
if (type === BI.Events.CLICK) {
self.combo.setValue(self.getValue());
self.fireEvent(BI.Bubble.EVENT_CHANGE, value, obj);
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
});
this.popupView.setVisible(false);
BI.nextTick(function () {
self.fireEvent(BI.Bubble.EVENT_AFTER_INIT);
});
}
},
});
_hideView: function (e) {
var o = this.options;
this.fireEvent(BI.Combo.EVENT_BEFORE_HIDEVIEW);
if (this.options.destroyWhenHide === true) {
this.popupView && this.popupView.destroy();
this.popupView = null;
this._rendered = false;
} else {
this.popupView && this.popupView.invisible();
this.element.on("mouseenter." + this.getName(), (e) => {
if (this.isEnabled() && this.isValid() && this.combo.isEnabled() && this.combo.isValid()) {
this.element.addClass(hoverClass);
}
if (!e || !this.combo.element.__isMouseInBounds__(e)) {
this.element.removeClass(this.options.hoverClass);
// 应对bi-focus-shadow在收起时不失焦
this.element.blur();
});
this.element.on("mouseleave." + this.getName(), (e) => {
if (this.isEnabled() && this.isValid() && this.combo.isEnabled() && this.combo.isValid()) {
this.element.removeClass(hoverClass);
}
});
this.element.removeClass(this.options.comboClass);
delete needHideWhenAnotherComboOpen[this.getName()];
delete currentOpenedCombos[this.getName()];
o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).unbind("mousedown." + this.getName()).unbind("mousewheel." + this.getName());
BI.EVENT_BLUR && o.hideWhenBlur && BI.Widget._renderEngine.createElement(window).unbind("blur." + this.getName());
this.fireEvent(BI.Combo.EVENT_AFTER_HIDEVIEW, e);
},
createWidget(extend({
element: this,
scrolly: false,
}, BI.LogicFactory.createLogic("vertical", extend(logic, {
items: [
{ el: this.combo }
],
}))));
isDefaultInit && (this._assertPopupView());
Resizers.add(this.getName(), bind((e) => {
// 如果resize对象是combo的子元素,则不应该收起,或交由hideChecker去处理
if (this.isViewVisible()) {
isNotNull(e) ? this._hideIf(e) : this._hideView();
}
}, this));
}
_popupView: function (e) {
var self = this, o = this.options;
this._assertPopupViewRender();
this.fireEvent(BI.Combo.EVENT_BEFORE_POPUPVIEW);
// popupVisible是为了获取其宽高, 放到可视范围之外以防止在IE下闪一下
this.popupView.css({ left: -99999, top: -99999 });
this.popupView.visible();
BI.each(needHideWhenAnotherComboOpen, function (i, combo) {
if (i !== self.getName()) {
if (combo && combo._hideIf(e, true) === true) {
delete needHideWhenAnotherComboOpen[i];
}
_assertPopupView() {
const { showArrow, value, hideWhenClickOutside, hideWhenBlur } = this.options;
if (isNull(this.popupView)) {
this.popupView = createWidget(isFunction(this.options.popup) ? this.options.popup() : this.options.popup, {
type: "bi.popup_view",
showArrow,
value,
}, this);
this.popupView.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
if (type === BI.Events.CLICK) {
this.combo.setValue(this.getValue());
this.fireEvent(Bubble.EVENT_CHANGE, value, obj);
}
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
});
this.popupView.setVisible(false);
nextTick(() => {
this.fireEvent(Bubble.EVENT_AFTER_INIT);
});
currentOpenedCombos[this.getName()] = this;
this.options.hideWhenAnotherComboOpen && (needHideWhenAnotherComboOpen[this.getName()] = this);
this.adjustWidth(e);
this.adjustHeight(e);
}
}
this.element.addClass(this.options.comboClass);
o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).unbind("mousedown." + this.getName()).unbind("mousewheel." + this.getName());
o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).unbind("mousewheel." + this.getName());
BI.EVENT_BLUR && o.hideWhenBlur && BI.Widget._renderEngine.createElement(window).unbind("blur." + this.getName());
_hideView(e) {
const { hideWhenClickOutside, hideWhenBlur } = this.options;
this.fireEvent(Combo.EVENT_BEFORE_HIDEVIEW);
if (this.options.destroyWhenHide === true) {
this.popupView && this.popupView.destroy();
this.popupView = null;
this._rendered = false;
} else {
this.popupView && this.popupView.invisible();
}
o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).bind("mousedown." + this.getName(), BI.bind(this._hideIf, this)).bind("mousewheel." + this.getName(), BI.bind(this._hideIf, this));
o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).bind("mousewheel." + this.getName(), BI.bind(this._hideIf, this));
BI.EVENT_BLUR && o.hideWhenBlur && BI.Widget._renderEngine.createElement(window).bind("blur." + this.getName(), BI.bind(this._hideIf, this));
this.fireEvent(BI.Combo.EVENT_AFTER_POPUPVIEW);
},
if (!e || !this.combo.element.__isMouseInBounds__(e)) {
this.element.removeClass(this.options.hoverClass);
// 应对bi-focus-shadow在收起时不失焦
this.element.blur();
}
adjustHeight: function (e) {
var o = this.options, p = {};
if (!this.popupView) {
return;
}
var isVisible = this.popupView.isVisible();
this.popupView.visible();
var combo = (o.belowMouse && BI.isNotNull(e)) ? {
element: {
0: BI.extend({}, e.target, {
getBoundingClientRect: function () {
return {
left: e.pageX,
top: e.pageY,
width: 0,
height: 0,
};
}
}),
offset: function () {
return {
left: e.pageX,
top: e.pageY,
};
},
},
} : this.combo;
this.element.removeClass(this.options.comboClass);
delete needHideWhenAnotherComboOpen[this.getName()];
delete currentOpenedCombos[this.getName()];
var positionRelativeElement = BI.DOM.getPositionRelativeContainingBlock(
BI.isNull(o.container)
? this.element[0]
: BI.isWidget(o.container)
? o.container.element[0]
: BI.Widget._renderEngine.createElement(BI.isFunction(o.container) ? o.container() : o.container)[0]
);
hideWhenClickOutside && Widget._renderEngine.createElement(document).unbind("mousedown." + this.getName()).unbind("mousewheel." + this.getName());
BI.EVENT_BLUR && hideWhenBlur && Widget._renderEngine.createElement(window).unbind("blur." + this.getName());
this.fireEvent(Combo.EVENT_AFTER_HIDEVIEW, e);
}
switch (o.direction) {
case "bottom":
case "bottom,right":
p = BI.DOM.getComboPosition(combo, this.popupView, o.adjustXOffset, (o.adjustYOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.isNeedAdjustHeight, ["bottom", "top", "right", "left"], o.offsetStyle, positionRelativeElement);
break;
case "top":
case "top,right":
p = BI.DOM.getComboPosition(combo, this.popupView, o.adjustXOffset, (o.adjustYOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.isNeedAdjustHeight, ["top", "bottom", "right", "left"], o.offsetStyle, positionRelativeElement);
break;
case "left":
case "left,bottom":
p = BI.DOM.getComboPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.adjustYOffset, o.isNeedAdjustHeight, ["left", "right", "bottom", "top"], o.offsetStyle, positionRelativeElement);
break;
case "right":
case "right,bottom":
p = BI.DOM.getComboPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.adjustYOffset, o.isNeedAdjustHeight, ["right", "left", "bottom", "top"], o.offsetStyle, positionRelativeElement);
break;
case "top,left":
p = BI.DOM.getComboPosition(combo, this.popupView, o.adjustXOffset, (o.adjustYOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.isNeedAdjustHeight, ["top", "bottom", "left", "right"], o.offsetStyle, positionRelativeElement);
break;
case "bottom,left":
p = BI.DOM.getComboPosition(combo, this.popupView, o.adjustXOffset, (o.adjustYOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.isNeedAdjustHeight, ["bottom", "top", "left", "right"], o.offsetStyle, positionRelativeElement);
break;
case "left,top":
p = BI.DOM.getComboPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.adjustYOffset, o.isNeedAdjustHeight, ["left", "right", "top", "bottom"], o.offsetStyle, positionRelativeElement);
break;
case "right,top":
p = BI.DOM.getComboPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.adjustYOffset, o.isNeedAdjustHeight, ["right", "left", "top", "bottom"], o.offsetStyle, positionRelativeElement);
break;
case "right,innerRight":
p = BI.DOM.getComboPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.adjustYOffset, o.isNeedAdjustHeight, ["right", "left", "innerRight", "innerLeft", "bottom", "top"], o.offsetStyle, positionRelativeElement);
break;
case "right,innerLeft":
p = BI.DOM.getComboPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.adjustYOffset, o.isNeedAdjustHeight, ["right", "left", "innerLeft", "innerRight", "bottom", "top"], o.offsetStyle, positionRelativeElement);
break;
case "innerRight":
p = BI.DOM.getComboPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.adjustYOffset, o.isNeedAdjustHeight, ["innerRight", "innerLeft", "right", "left", "bottom", "top"], o.offsetStyle, positionRelativeElement);
break;
case "innerLeft":
p = BI.DOM.getComboPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.adjustYOffset, o.isNeedAdjustHeight, ["innerLeft", "innerRight", "left", "right", "bottom", "top"], o.offsetStyle, positionRelativeElement);
break;
case "top,custom":
case "custom,top":
p = BI.DOM.getTopAdaptPosition(combo, this.popupView, (o.adjustYOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.isNeedAdjustHeight);
p.dir = "top";
break;
case "custom,bottom":
case "bottom,custom":
p = BI.DOM.getBottomAdaptPosition(combo, this.popupView, (o.adjustYOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0), o.isNeedAdjustHeight);
p.dir = "bottom";
break;
case "left,custom":
case "custom,left":
p = BI.DOM.getLeftAdaptPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0));
delete p.top;
delete p.adaptHeight;
p.dir = "left";
break;
case "custom,right":
case "right,custom":
p = BI.DOM.getRightAdaptPosition(combo, this.popupView, (o.adjustXOffset + o.adjustLength) + (o.showArrow ? this._const.TRIANGLE_LENGTH : 0));
delete p.top;
delete p.adaptHeight;
p.dir = "right";
break;
default:
break;
_popupView(e) {
const { hideWhenClickOutside, hideWhenBlur } = this.options;
this._assertPopupViewRender();
this.fireEvent(Combo.EVENT_BEFORE_POPUPVIEW);
// popupVisible是为了获取其宽高, 放到可视范围之外以防止在IE下闪一下
this.popupView.css({ left: -99999, top: -99999 });
this.popupView.visible();
each(needHideWhenAnotherComboOpen, (i, combo) => {
if (i !== this.getName()) {
if (combo && combo._hideIf(e, true) === true) {
delete needHideWhenAnotherComboOpen[i];
}
}
});
currentOpenedCombos[this.getName()] = this;
this.options.hideWhenAnotherComboOpen && (needHideWhenAnotherComboOpen[this.getName()] = this);
this.adjustWidth(e);
this.adjustHeight(e);
var width = this.combo.element.outerWidth();
var height = this.combo.element.outerHeight();
this.popupView.setDirection && this.popupView.setDirection(p.dir, {
width: width,
height: height,
offsetStyle: o.offsetStyle,
adjustXOffset: o.adjustXOffset,
adjustYOffset: o.adjustYOffset,
offset: this.combo.element.offset(),
});
this.element.addClass(this.options.comboClass);
hideWhenClickOutside && Widget._renderEngine.createElement(document).unbind("mousedown." + this.getName()).unbind("mousewheel." + this.getName());
hideWhenClickOutside && Widget._renderEngine.createElement(document).unbind("mousewheel." + this.getName());
BI.EVENT_BLUR && hideWhenBlur && Widget._renderEngine.createElement(window).unbind("blur." + this.getName());
if (o.supportCSSTransform) {
hideWhenClickOutside && Widget._renderEngine.createElement(document).bind("mousewheel." + this.getName(), bind(this._hideIf, this));
hideWhenClickOutside && Widget._renderEngine.createElement(document).bind("mousedown." + this.getName(), bind(this._hideIf, this)).bind("mousewheel." + this.getName(), bind(this._hideIf, this));
BI.EVENT_BLUR && hideWhenBlur && Widget._renderEngine.createElement(window).bind("blur." + this.getName(), bind(this._hideIf, this));
this.fireEvent(Combo.EVENT_AFTER_POPUPVIEW);
}
var positonedRect = positionRelativeElement.getBoundingClientRect();
adjustHeight(e) {
const { belowMouse, supportCSSTransform, container, direction, adjustXOffset, adjustYOffset, adjustLength, showArrow, isNeedAdjustHeight, offsetStyle } = this.options;
let p = {};
if (!this.popupView) {
return;
}
const isVisible = this.popupView.isVisible();
this.popupView.visible();
const combo = (belowMouse && isNotNull(e)) ? {
element: {
0: e.target,
offset: () => {
return {
left: e.pageX,
top: e.pageY,
};
},
bounds: () => {
// offset为其相对于父定位元素的偏移
return {
x: e.offsetX,
y: e.offsetY,
width: 0,
height: 24,
};
},
outerWidth: () => {
return 0;
},
outerHeight: () => {
return 24;
},
},
} : this.combo;
const positionRelativeElement = supportCSSTransform ? BI.DOM.getPositionRelativeContainingBlock(isNull(container) ? this.element[0] : Widget._renderEngine.createElement(isFunction(container) ? container() : container)[0]) : null;
const TRIANGLE_LENGTH = 12;
switch (direction) {
case "bottom":
case "bottom,right":
p = BI.DOM.getComboPosition(combo, this.popupView, adjustXOffset, (adjustYOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), isNeedAdjustHeight, ["bottom", "top", "right", "left"], offsetStyle, positionRelativeElement);
break;
case "top":
case "top,right":
p = BI.DOM.getComboPosition(combo, this.popupView, adjustXOffset, (adjustYOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), isNeedAdjustHeight, ["top", "bottom", "right", "left"], offsetStyle, positionRelativeElement);
break;
case "left":
case "left,bottom":
p = BI.DOM.getComboPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), adjustYOffset, isNeedAdjustHeight, ["left", "right", "bottom", "top"], offsetStyle, positionRelativeElement);
break;
case "right":
case "right,bottom":
p = BI.DOM.getComboPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), adjustYOffset, isNeedAdjustHeight, ["right", "left", "bottom", "top"], offsetStyle, positionRelativeElement);
break;
case "top,left":
p = BI.DOM.getComboPosition(combo, this.popupView, adjustXOffset, (adjustYOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), isNeedAdjustHeight, ["top", "bottom", "left", "right"], offsetStyle, positionRelativeElement);
break;
case "bottom,left":
p = BI.DOM.getComboPosition(combo, this.popupView, adjustXOffset, (adjustYOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), isNeedAdjustHeight, ["bottom", "top", "left", "right"], offsetStyle, positionRelativeElement);
break;
case "left,top":
p = BI.DOM.getComboPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), adjustYOffset, isNeedAdjustHeight, ["left", "right", "top", "bottom"], offsetStyle, positionRelativeElement);
break;
case "right,top":
p = BI.DOM.getComboPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), adjustYOffset, isNeedAdjustHeight, ["right", "left", "top", "bottom"], offsetStyle, positionRelativeElement);
break;
case "right,innerRight":
p = BI.DOM.getComboPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), adjustYOffset, isNeedAdjustHeight, ["right", "left", "innerRight", "innerLeft", "bottom", "top"], offsetStyle, positionRelativeElement);
break;
case "right,innerLeft":
p = BI.DOM.getComboPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), adjustYOffset, isNeedAdjustHeight, ["right", "left", "innerLeft", "innerRight", "bottom", "top"], offsetStyle, positionRelativeElement);
break;
case "innerRight":
p = BI.DOM.getComboPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), adjustYOffset, isNeedAdjustHeight, ["innerRight", "innerLeft", "right", "left", "bottom", "top"], offsetStyle, positionRelativeElement);
break;
case "innerLeft":
p = BI.DOM.getComboPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), adjustYOffset, isNeedAdjustHeight, ["innerLeft", "innerRight", "left", "right", "bottom", "top"], offsetStyle, positionRelativeElement);
break;
case "top,custom":
case "custom,top":
p = BI.DOM.getTopAdaptPosition(combo, this.popupView, (adjustYOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), isNeedAdjustHeight);
p.dir = "top";
break;
case "custom,bottom":
case "bottom,custom":
p = BI.DOM.getBottomAdaptPosition(combo, this.popupView, (adjustYOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0), isNeedAdjustHeight);
p.dir = "bottom";
break;
case "left,custom":
case "custom,left":
p = BI.DOM.getLeftAdaptPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0));
delete p.top;
delete p.adaptHeight;
p.dir = "left";
break;
case "custom,right":
case "right,custom":
p = BI.DOM.getRightAdaptPosition(combo, this.popupView, (adjustXOffset + adjustLength) + (showArrow ? TRIANGLE_LENGTH : 0));
delete p.top;
delete p.adaptHeight;
p.dir = "right";
break;
default:
break;
}
var scaleX = positonedRect.width / positionRelativeElement.offsetWidth;
var scaleY = positonedRect.height / positionRelativeElement.offsetHeight;
if ("adaptHeight" in p) {
this.resetListHeight(p.adaptHeight);
}
p.top && (p.top = Math.round(p.top / scaleY + positionRelativeElement.scrollTop));
p.left && (p.left = Math.round(p.left / scaleX + positionRelativeElement.scrollLeft));
const width = this.combo.element.outerWidth();
const height = this.combo.element.outerHeight();
this.popupView.setDirection && this.popupView.setDirection(p.dir, {
width,
height,
offsetStyle,
adjustXOffset,
adjustYOffset,
offset: this.combo.element.offset(),
});
p.adaptHeight && (p.adaptHeight = Math.round(p.adaptHeight / scaleY));
}
if (supportCSSTransform) {
if ("adaptHeight" in p) {
this.resetListHeight(p.adaptHeight);
}
const positonedRect = positionRelativeElement.getBoundingClientRect();
if ("left" in p) {
this.popupView.element.css({
left: p.left,
});
}
if ("top" in p) {
this.popupView.element.css({
top: p.top,
});
}
this.position = p;
this.popupView.setVisible(isVisible);
},
const scaleX = positonedRect.width / positionRelativeElement.offsetWidth;
const scaleY = positonedRect.height / positionRelativeElement.offsetHeight;
destroyed: function () {
BI.Widget._renderEngine.createElement(document)
.unbind("click." + this.getName())
.unbind("mousedown." + this.getName())
.unbind("mousewheel." + this.getName())
.unbind("mouseenter." + this.getName())
.unbind("mouseleave." + this.getName());
BI.Widget._renderEngine.createElement(window)
.unbind("blur." + this.getName());
BI.Resizers.remove(this.getName());
this.popupView && this.popupView._destroy();
delete needHideWhenAnotherComboOpen[this.getName()];
delete currentOpenedCombos[this.getName()];
},
});
BI.Combo.closeAll = function () {
BI.each(currentOpenedCombos, function (i, combo) {
if (combo) {
combo.hideView();
}
});
currentOpenedCombos = {};
needHideWhenAnotherComboOpen = {};
};
BI.Combo.EVENT_TRIGGER_CHANGE = "EVENT_TRIGGER_CHANGE";
BI.Combo.EVENT_CHANGE = "EVENT_CHANGE";
BI.Combo.EVENT_EXPAND = "EVENT_EXPAND";
BI.Combo.EVENT_COLLAPSE = "EVENT_COLLAPSE";
BI.Combo.EVENT_AFTER_INIT = "EVENT_AFTER_INIT";
p.top && (p.top = p.top / scaleY);
p.left && (p.left = p.left / scaleX);
}
if ("left" in p) {
this.popupView.element.css({
left: p.left,
});
}
if ("top" in p) {
this.popupView.element.css({
top: p.top,
});
}
this.position = p;
this.popupView.setVisible(isVisible);
}
BI.Combo.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.Combo.EVENT_AFTER_POPUPVIEW = "EVENT_AFTER_POPUPVIEW";
BI.Combo.EVENT_BEFORE_HIDEVIEW = "EVENT_BEFORE_HIDEVIEW";
BI.Combo.EVENT_AFTER_HIDEVIEW = "EVENT_AFTER_HIDEVIEW";
destroyed() {
Widget._renderEngine.createElement(document)
.unbind("click." + this.getName())
.unbind("mousedown." + this.getName())
.unbind("mousewheel." + this.getName())
.unbind("mouseenter." + this.getName())
.unbind("mouseleave." + this.getName());
Widget._renderEngine.createElement(window)
.unbind("blur." + this.getName());
Resizers.remove(this.getName());
this.popupView && this.popupView._destroy();
delete needHideWhenAnotherComboOpen[this.getName()];
delete currentOpenedCombos[this.getName()];
}
}
BI.shortcut("bi.combo", BI.Combo);
}());
Combo.closeAll = () => {
each(currentOpenedCombos, (i, combo) => {
if (combo) {
combo.hideView();
}
});
currentOpenedCombos = {};
needHideWhenAnotherComboOpen = {};
};

245
src/base/combination/expander.js

@ -6,9 +6,25 @@
* @class BI.Expander
* @extends BI.Widget
*/
BI.Expander = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.Expander.superclass._defaultConfig.apply(this, arguments), {
import { shortcut, Widget, Controller, extend, nextTick, each, debounce, isNull, createWidget } from "../../core";
@shortcut()
export class Expander extends Widget {
static xtype = "bi.expander";
static EVENT_EXPAND = "EVENT_EXPAND";
static EVENT_COLLAPSE = "EVENT_COLLAPSE";
static EVENT_TRIGGER_CHANGE = "EVENT_TRIGGER_CHANGE";
static EVENT_CHANGE = "EVENT_CHANGE";
static EVENT_AFTER_INIT = "EVENT_AFTER_INIT";
static EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
static EVENT_AFTER_POPUPVIEW = "EVENT_AFTER_POPUPVIEW";
static EVENT_BEFORE_HIDEVIEW = "EVENT_BEFORE_HIDEVIEW";
static EVENT_AFTER_HIDEVIEW = "EVENT_AFTER_HIDEVIEW";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-expander",
trigger: "click",
toggle: true,
@ -19,48 +35,48 @@ BI.Expander = BI.inherit(BI.Widget, {
expanderClass: "bi-expander-popup",
hoverClass: "bi-expander-hover",
});
},
}
render: function () {
var self = this, o = this.options;
this._expanded = !!o.el.open;
render() {
const { el, hoverClass, isDefaultInit } = this.options;
this._expanded = !!el.open;
this._initExpander();
// 延迟绑定事件,这样可以将自己绑定的事情优先执行
BI.nextTick(() => {
nextTick(() => {
!this.isDestroyed() && this._initPullDownAction();
});
this.expander.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
if (self.isEnabled() && self.isValid()) {
this.expander.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
if (this.isEnabled() && this.isValid()) {
if (type === BI.Events.EXPAND) {
self._popupView();
this._popupView();
}
if (type === BI.Events.COLLAPSE) {
self._hideView();
this._hideView();
}
if (type === BI.Events.EXPAND) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
self.fireEvent(BI.Expander.EVENT_EXPAND);
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
this.fireEvent(Expander.EVENT_EXPAND);
}
if (type === BI.Events.COLLAPSE) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
self.isViewVisible() && self.fireEvent(BI.Expander.EVENT_COLLAPSE);
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
this.isViewVisible() && this.fireEvent(Expander.EVENT_COLLAPSE);
}
if (type === BI.Events.CLICK) {
self.fireEvent(BI.Expander.EVENT_TRIGGER_CHANGE, value, obj);
this.fireEvent(Expander.EVENT_TRIGGER_CHANGE, value, obj);
}
}
});
this.element.hover(function () {
if (self.isEnabled() && self.isValid() && self.expander.isEnabled() && self.expander.isValid()) {
self.element.addClass(o.hoverClass);
this.element.hover(() => {
if (this.isEnabled() && this.isValid() && this.expander.isEnabled() && this.expander.isValid()) {
this.element.addClass(hoverClass);
}
}, function () {
if (self.isEnabled() && self.isValid() && self.expander.isEnabled() && self.expander.isValid()) {
self.element.removeClass(o.hoverClass);
}, () => {
if (this.isEnabled() && this.isValid() && this.expander.isEnabled() && this.expander.isValid()) {
this.element.removeClass(hoverClass);
}
});
BI.createWidget({
createWidget({
type: "bi.vertical",
scrolly: false,
element: this,
@ -68,13 +84,13 @@ BI.Expander = BI.inherit(BI.Widget, {
{ el: this.expander }
],
});
o.isDefaultInit && this._assertPopupView();
isDefaultInit && this._assertPopupView();
if (this.expander.isOpened() === true) {
this._popupView();
}
},
}
_toggle: function () {
_toggle() {
this._assertPopupViewRender();
if (this.popupView.isVisible()) {
this._hideView();
@ -83,40 +99,40 @@ BI.Expander = BI.inherit(BI.Widget, {
this._popupView();
}
}
},
}
_initPullDownAction: function () {
var self = this, o = this.options;
var evs = this.options.trigger.split(",");
BI.each(evs, function (i, e) {
_initPullDownAction() {
const { toggle } = this.options;
const evs = this.options.trigger.split(",");
each(evs, (i, e) => {
switch (e) {
case "hover":
self.element[e](function (e) {
if (self.isEnabled() && self.isValid() && self.expander.isEnabled() && self.expander.isValid()) {
self._popupView();
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.expander);
self.fireEvent(BI.Expander.EVENT_EXPAND);
this.element[e]((e) => {
if (this.isEnabled() && this.isValid() && this.expander.isEnabled() && this.expander.isValid()) {
this._popupView();
this.fireEvent(Controller.EVENT_CHANGE, BI.Events.EXPAND, "", this.expander);
this.fireEvent(Expander.EVENT_EXPAND);
}
}, function () {
if (self.isEnabled() && self.isValid() && self.expander.isEnabled() && self.expander.isValid() && o.toggle) {
self._hideView();
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", self.expander);
self.fireEvent(BI.Expander.EVENT_COLLAPSE);
}, () => {
if (this.isEnabled() && this.isValid() && this.expander.isEnabled() && this.expander.isValid() && toggle) {
this._hideView();
this.fireEvent(Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", this.expander);
this.fireEvent(Expander.EVENT_COLLAPSE);
}
});
break;
case "click":
if (e) {
self.element.off(e + "." + self.getName()).on(e + "." + self.getName(), BI.debounce(function (e) {
if (self.expander.element.__isMouseInBounds__(e)) {
if (self.isEnabled() && self.isValid() && self.expander.isEnabled() && self.expander.isValid()) {
o.toggle ? self._toggle() : self._popupView();
if (self.isExpanded()) {
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.expander);
self.fireEvent(BI.Expander.EVENT_EXPAND);
this.element.off(e + "." + this.getName()).on(e + "." + this.getName(), debounce((e) => {
if (this.expander.element.__isMouseInBounds__(e)) {
if (this.isEnabled() && this.isValid() && this.expander.isEnabled() && this.expander.isValid()) {
toggle ? this._toggle() : this._popupView();
if (this.isExpanded()) {
this.fireEvent(Controller.EVENT_CHANGE, BI.Events.EXPAND, "", this.expander);
this.fireEvent(Expander.EVENT_EXPAND);
} else {
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", self.expander);
self.fireEvent(BI.Expander.EVENT_COLLAPSE);
this.fireEvent(Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", this.expander);
this.fireEvent(Expander.EVENT_COLLAPSE);
}
}
}
@ -130,16 +146,16 @@ BI.Expander = BI.inherit(BI.Widget, {
break;
}
});
},
}
_initExpander: function () {
this.expander = BI.createWidget(this.options.el);
},
_initExpander() {
this.expander = createWidget(this.options.el);
}
_assertPopupView: function () {
var self = this, o = this.options;
if (BI.isNull(this.popupView)) {
this.popupView = BI.createWidget(this.options.popup, {
_assertPopupView() {
const { value } = this.options;
if (isNull(this.popupView)) {
this.popupView = createWidget(this.options.popup, {
type: "bi.button_group",
cls: "expander-popup",
layouts: [{
@ -147,26 +163,26 @@ BI.Expander = BI.inherit(BI.Widget, {
hgap: 0,
vgap: 0,
}],
value: o.value,
value,
}, this);
this.popupView.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
this.popupView.on(Controller.EVENT_CHANGE, (type, value, obj, ...args)=> {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
if (type === BI.Events.CLICK) {
// self.setValue(self.getValue());
self.fireEvent(BI.Expander.EVENT_CHANGE, value, obj);
this.fireEvent(Expander.EVENT_CHANGE, value, obj);
}
});
this.popupView.setVisible(this.isExpanded());
BI.nextTick(function () {
self.fireEvent(BI.Expander.EVENT_AFTER_INIT);
nextTick(() => {
this.fireEvent(Expander.EVENT_AFTER_INIT);
});
}
},
}
_assertPopupViewRender: function () {
_assertPopupViewRender() {
this._assertPopupView();
if (!this._rendered) {
BI.createWidget({
createWidget({
type: "bi.vertical",
scrolly: false,
element: this,
@ -176,113 +192,100 @@ BI.Expander = BI.inherit(BI.Widget, {
});
this._rendered = true;
}
},
}
_hideView: function () {
this.fireEvent(BI.Expander.EVENT_BEFORE_HIDEVIEW);
_hideView() {
this.fireEvent(Expander.EVENT_BEFORE_HIDEVIEW);
this._expanded = false;
this.expander.setOpened(false);
this.popupView && this.popupView.invisible();
this.element.removeClass(this.options.expanderClass);
this.fireEvent(BI.Expander.EVENT_AFTER_HIDEVIEW);
},
this.fireEvent(Expander.EVENT_AFTER_HIDEVIEW);
}
_popupView: function () {
_popupView() {
this._assertPopupViewRender();
this.fireEvent(BI.Expander.EVENT_BEFORE_POPUPVIEW);
this.fireEvent(Expander.EVENT_BEFORE_POPUPVIEW);
this._expanded = true;
this.expander.setOpened(true);
this.popupView.visible();
this.element.addClass(this.options.expanderClass);
this.fireEvent(BI.Expander.EVENT_AFTER_POPUPVIEW);
},
this.fireEvent(Expander.EVENT_AFTER_POPUPVIEW);
}
populate: function (items) {
populate(items) {
// this._assertPopupView();
this.popupView && this.popupView.populate.apply(this.popupView, arguments);
this.expander.populate && this.expander.populate.apply(this.expander, arguments);
},
}
_setEnable: function (arg) {
BI.Expander.superclass._setEnable.apply(this, arguments);
_setEnable(arg) {
super._setEnable(arguments);
!arg && this.element.removeClass(this.options.hoverClass);
!arg && this.isViewVisible() && this._hideView();
},
}
setValue: function (v) {
setValue(v) {
this.expander.setValue(v);
if (BI.isNull(this.popupView)) {
if (isNull(this.popupView)) {
this.options.popup.value = v;
} else {
this.popupView.setValue(v);
}
},
}
getValue: function () {
if (BI.isNull(this.popupView)) {
getValue() {
if (isNull(this.popupView)) {
return this.options.popup.value;
} else {
return this.popupView.getValue();
}
},
}
isViewVisible: function () {
isViewVisible() {
return this.isEnabled() && this.expander.isEnabled() && !!this.popupView && this.popupView.isVisible();
},
}
isExpanded: function () {
isExpanded() {
return this._expanded;
},
}
showView: function () {
showView() {
if (this.isEnabled() && this.expander.isEnabled()) {
this._popupView();
}
},
}
hideView: function () {
hideView() {
this._hideView();
},
}
getView: function () {
getView() {
return this.popupView;
},
}
getAllLeaves: function () {
getAllLeaves() {
return this.popupView && this.popupView.getAllLeaves();
},
}
getNodeById: function (id) {
getNodeById(id) {
if (this.expander.options.id === id) {
return this.expander;
}
return this.popupView && this.popupView.getNodeById(id);
},
}
getNodeByValue: function (value) {
getNodeByValue(value) {
if (this.expander.getValue() === value) {
return this.expander;
}
return this.popupView && this.popupView.getNodeByValue(value);
},
destroy: function () {
BI.Expander.superclass.destroy.apply(this, arguments);
},
});
BI.Expander.EVENT_EXPAND = "EVENT_EXPAND";
BI.Expander.EVENT_COLLAPSE = "EVENT_COLLAPSE";
BI.Expander.EVENT_TRIGGER_CHANGE = "EVENT_TRIGGER_CHANGE";
BI.Expander.EVENT_CHANGE = "EVENT_CHANGE";
BI.Expander.EVENT_AFTER_INIT = "EVENT_AFTER_INIT";
BI.Expander.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.Expander.EVENT_AFTER_POPUPVIEW = "EVENT_AFTER_POPUPVIEW";
BI.Expander.EVENT_BEFORE_HIDEVIEW = "EVENT_BEFORE_HIDEVIEW";
BI.Expander.EVENT_AFTER_HIDEVIEW = "EVENT_AFTER_HIDEVIEW";
}
BI.shortcut("bi.expander", BI.Expander);
destroy() {
super.destroy(arguments);
}
}

326
src/base/combination/group.button.js

@ -3,10 +3,16 @@
* @class BI.ButtonGroup
* @extends BI.Widget
*/
import { shortcut, Widget, Controller, extend, createWidget, createWidgets, each, isFunction, isKey, isNotEmptyArray, createItems, isArray, remove, map, stripEL, makeArrayByArray, clone, deepClone, formatEL, isEmpty, concat, removeAt, deepContains, has, any } from "../../core";
BI.ButtonGroup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.ButtonGroup.superclass._defaultConfig.apply(this, arguments), {
@shortcut()
export class ButtonGroup extends Widget {
static xtype = "bi.button_group";
static EVENT_CHANGE = "EVENT_CHANGE";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-button-group",
behaviors: {},
items: [],
@ -18,83 +24,84 @@ BI.ButtonGroup = BI.inherit(BI.Widget, {
vgap: 0,
}],
});
},
}
render: function () {
var self = this, o = this.options;
var behaviors = {};
BI.each(o.behaviors, function (key, rule) {
render() {
const { behaviors: optionsBehaviors, items: optionsItems, value } = this.options;
const behaviors = {};
each(optionsBehaviors, (key, rule) => {
behaviors[key] = BI.BehaviorFactory.createBehavior(key, {
rule: rule,
});
});
this.behaviors = behaviors;
var items = BI.isFunction(o.items) ? this.__watch(o.items, function (context, newValue) {
self.populate(newValue);
}) : o.items;
const items = isFunction(optionsItems) ? this.__watch(optionsItems, (context, newValue) => {
this.populate(newValue);
}) : optionsItems;
this.populate(items);
o.value = BI.isFunction(o.value) ? this.__watch(o.value, function (context, newValue) {
self.setValue(newValue);
}) : o.value;
if (BI.isKey(o.value) || BI.isNotEmptyArray(o.value)) {
this.setValue(o.value);
this.options.value = isFunction(value) ? this.__watch(value, (context, newValue) => {
this.setValue(newValue);
}) : value;
if (isKey(value) || isNotEmptyArray(value)) {
this.setValue(value);
}
},
}
_createBtns: function (items) {
var btns;
BI.Widget.execWithContext(this, function () {
btns = BI.createWidgets(BI.createItems(items, {
_createBtns(items) {
let btns;
Widget.execWithContext(this, () => {
btns = createWidgets(createItems(items, {
type: "bi.text_button",
}));
});
return btns;
},
}
_btnsCreator: function (items) {
var self = this, args = Array.prototype.slice.call(arguments), o = this.options;
var buttons = this._createBtns(items);
_btnsCreator(items) {
const args = Array.prototype.slice.call(arguments);
const { chooseType } = this.options;
const buttons = this._createBtns(items);
args[0] = buttons;
BI.each(this.behaviors, function (i, behavior) {
each(this.behaviors, (i, behavior) => {
behavior.doBehavior.apply(behavior, args);
});
BI.each(buttons, function (i, btn) {
btn.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
each(buttons, (i, btn) => {
btn.on(Controller.EVENT_CHANGE, (type, value, obj, ...arg) => {
if (type === BI.Events.CLICK) {
switch (o.chooseType) {
case BI.ButtonGroup.CHOOSE_TYPE_SINGLE:
self.setValue(btn.getValue());
switch (chooseType) {
case ButtonGroup.CHOOSE_TYPE_SINGLE:
this.setValue(btn.getValue());
break;
case BI.ButtonGroup.CHOOSE_TYPE_NONE:
self.setValue([]);
case ButtonGroup.CHOOSE_TYPE_NONE:
this.setValue([]);
break;
default:
break;
}
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
self.fireEvent(BI.ButtonGroup.EVENT_CHANGE, value, obj);
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...arg);
this.fireEvent(ButtonGroup.EVENT_CHANGE, value, obj);
} else {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...arg);
}
});
btn.on(BI.Events.DESTROY, function () {
BI.remove(self.buttons, btn);
btn.on(BI.Events.DESTROY, () => {
remove(this.buttons, btn);
});
});
return buttons;
},
_packageBtns: function (btns) {
var o = this.options;
var layouts = BI.isArray(o.layouts) ? o.layouts : [o.layouts];
for (var i = layouts.length - 1; i > 0; i--) {
btns = BI.map(btns, function (k, it) {
return BI.extend({}, layouts[i], {
}
_packageBtns(btns) {
const { layouts: optionsLayouts } = this.options;
const layouts = isArray(optionsLayouts) ? optionsLayouts : [optionsLayouts];
for (let i = layouts.length - 1; i > 0; i--) {
btns = map(btns, (k, it) => {
return extend({}, layouts[i], {
items: [
BI.extend({}, layouts[i].el, {
extend({}, layouts[i].el, {
el: it,
})
],
@ -103,56 +110,57 @@ BI.ButtonGroup = BI.inherit(BI.Widget, {
}
return btns;
},
}
_packageSimpleItems: function (btns) {
var o = this.options;
_packageSimpleItems(btns) {
const { items } = this.options;
return BI.map(o.items, function (i, item) {
if (BI.stripEL(item) === item) {
return map(items, (i, item) => {
if (stripEL(item) === item) {
return btns[i];
}
return BI.extend({}, item, {
return extend({}, item, {
el: btns[i],
});
});
},
}
_packageItems: function (items, packBtns) {
return BI.createItems(BI.makeArrayByArray(items, {}), BI.clone(packBtns));
},
_packageItems(items, packBtns) {
return createItems(makeArrayByArray(items, {}), clone(packBtns));
}
_packageLayout: function (items) {
var o = this.options, layout = BI.deepClone(BI.isArray(o.layouts) ? o.layouts[0] : o.layouts);
_packageLayout(items) {
const { layouts } = this.options;
const layout = deepClone(isArray(layouts) ? layouts[0] : layouts);
var lay = BI.formatEL(layout).el;
while (lay && lay.items && !BI.isEmpty(lay.items)) {
lay = BI.formatEL(lay.items[0]).el;
let lay = formatEL(layout).el;
while (lay && lay.items && !isEmpty(lay.items)) {
lay = formatEL(lay.items[0]).el;
}
lay.items = items;
return layout;
},
}
// 如果是一个简单的layout
_isSimpleLayout: function () {
var o = this.options;
_isSimpleLayout() {
const { layouts, items } = this.options;
return BI.isArray(o.layouts) ? (o.layouts.length === 1 && !BI.isArray(o.items[0])) : true;
},
return isArray(layouts) ? (layouts.length === 1 && !isArray(items[0])) : true;
}
doBehavior: function () {
var args = Array.prototype.slice.call(arguments);
doBehavior() {
const args = Array.prototype.slice.call(arguments);
args.unshift(this.buttons);
BI.each(this.behaviors, function (i, behavior) {
each(this.behaviors, (i, behavior) => {
behavior.doBehavior.apply(behavior, args);
});
},
}
prependItems: function (items) {
var btns = this._btnsCreator.apply(this, arguments);
this.buttons = BI.concat(btns, this.buttons);
prependItems(items) {
const btns = this._btnsCreator.apply(this, arguments);
this.buttons = concat(btns, this.buttons);
if (this._isSimpleLayout() && this.layouts && this.layouts.prependItems) {
this.layouts.prependItems(btns);
@ -162,11 +170,11 @@ BI.ButtonGroup = BI.inherit(BI.Widget, {
items = this._packageItems(items, this._packageBtns(btns));
this.layouts.prependItems(this._packageLayout(items).items);
},
}
addItems: function (items) {
var btns = this._btnsCreator.apply(this, arguments);
this.buttons = BI.concat(this.buttons, btns);
addItems(items) {
const btns = this._btnsCreator.apply(this, arguments);
this.buttons = concat(this.buttons, btns);
// 如果是一个简单的layout
if (this._isSimpleLayout() && this.layouts && this.layouts.addItems) {
@ -177,26 +185,26 @@ BI.ButtonGroup = BI.inherit(BI.Widget, {
items = this._packageItems(items, this._packageBtns(btns));
this.layouts.addItems(this._packageLayout(items).items);
},
}
removeItemAt: function (indexes) {
BI.removeAt(this.buttons, indexes);
removeItemAt(indexes) {
removeAt(this.buttons, indexes);
this.layouts.removeItemAt(indexes);
},
}
removeItems: function (values) {
values = BI.isArray(values) ? values : [values];
var deleted = [];
BI.each(this.buttons, function (i, button) {
if (BI.deepContains(values, button.getValue())) {
removeItems(values) {
values = isArray(values) ? values : [values];
const deleted = [];
each(this.buttons, (i, button) => {
if (deepContains(values, button.getValue())) {
deleted.push(i);
}
});
BI.removeAt(this.buttons, deleted);
removeAt(this.buttons, deleted);
this.layouts.removeItemAt(deleted);
},
}
populate: function (items) {
populate(items) {
items = items || [];
this.empty();
this.options.items = items;
@ -208,114 +216,114 @@ BI.ButtonGroup = BI.inherit(BI.Widget, {
items = this._packageItems(items, this._packageBtns(this.buttons));
}
this.layouts = BI.createWidget(BI.extend({ element: this }, this._packageLayout(items)));
},
this.layouts = createWidget(extend({ element: this }, this._packageLayout(items)));
}
setNotSelectedValue: function (v) {
v = BI.isArray(v) ? v : [v];
BI.each(this.buttons, function (i, item) {
if (BI.deepContains(v, item.getValue())) {
setNotSelectedValue(v) {
v = isArray(v) ? v : [v];
each(this.buttons, (i, item) => {
if (deepContains(v, item.getValue())) {
item.setSelected && item.setSelected(false);
} else {
item.setSelected && item.setSelected(true);
}
});
},
}
setEnabledValue: function (v) {
v = BI.isArray(v) ? v : [v];
BI.each(this.buttons, function (i, item) {
if (BI.deepContains(v, item.getValue())) {
setEnabledValue(v) {
v = isArray(v) ? v : [v];
each(this.buttons, (i, item) => {
if (deepContains(v, item.getValue())) {
item.setEnable(true);
} else {
item.setEnable(false);
}
});
},
}
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
BI.each(this.buttons, function (i, item) {
if (BI.deepContains(v, item.getValue())) {
setValue(v) {
v = isArray(v) ? v : [v];
each(this.buttons, (i, item) => {
if (deepContains(v, item.getValue())) {
item.setSelected && item.setSelected(true);
} else {
item.setSelected && item.setSelected(false);
}
});
},
}
setValueMap: function (map) {
setValueMap(map) {
map = map || {};
BI.each(this.buttons, function (i, item) {
if (BI.has(map, item.getValue())) {
each(this.buttons, (i, item) => {
if (has(map, item.getValue())) {
item.setSelected && item.setSelected(true);
} else {
item.setSelected && item.setSelected(false);
}
});
},
}
setAllSelected: function (v) {
BI.each(this.getAllButtons(), function (i, btn) {
setAllSelected(v) {
each(this.getAllButtons(), (i, btn) => {
(btn.setSelected || btn.setAllSelected).apply(btn, [v]);
});
},
}
getNotSelectedValue: function () {
var v = [];
BI.each(this.buttons, function (i, item) {
getNotSelectedValue() {
const v = [];
each(this.buttons, (i, item) => {
if (item.isEnabled() && !(item.isSelected && item.isSelected())) {
v.push(item.getValue());
}
});
return v;
},
}
getValue: function () {
var v = [];
BI.each(this.buttons, function (i, item) {
getValue() {
const v = [];
each(this.buttons, (i, item) => {
if (item.isEnabled() && item.isSelected && item.isSelected()) {
v.push(item.getValue());
}
});
return v;
},
}
getAllButtons: function () {
getAllButtons() {
return this.buttons;
},
}
getAllLeaves: function () {
getAllLeaves() {
return this.buttons;
},
}
getSelectedButtons: function () {
var btns = [];
BI.each(this.buttons, function (i, item) {
getSelectedButtons() {
const btns = [];
each(this.buttons, (i, item) => {
if (item.isSelected && item.isSelected()) {
btns.push(item);
}
});
return btns;
},
}
getNotSelectedButtons: function () {
var btns = [];
BI.each(this.buttons, function (i, item) {
getNotSelectedButtons() {
const btns = [];
each(this.buttons, (i, item) => {
if (item.isSelected && !item.isSelected()) {
btns.push(item);
}
});
return btns;
},
}
getIndexByValue: function (value) {
var index = -1;
BI.any(this.buttons, function (i, item) {
getIndexByValue(value) {
let index = -1;
any(this.buttons, (i, item) => {
if (item.isEnabled() && item.getValue() === value) {
index = i;
@ -324,11 +332,11 @@ BI.ButtonGroup = BI.inherit(BI.Widget, {
});
return index;
},
}
getNodeById: function (id) {
var node;
BI.any(this.buttons, function (i, item) {
getNodeById(id) {
let node;
any(this.buttons, (i, item) => {
if (item.isEnabled() && item.options.id === id) {
node = item;
@ -337,11 +345,11 @@ BI.ButtonGroup = BI.inherit(BI.Widget, {
});
return node;
},
}
getNodeByValue: function (value) {
var node;
BI.any(this.buttons, function (i, item) {
getNodeByValue(value) {
let node;
any(this.buttons, (i, item) => {
if (item.isEnabled() && item.getValue() === value) {
node = item;
@ -350,35 +358,33 @@ BI.ButtonGroup = BI.inherit(BI.Widget, {
});
return node;
},
}
/**
* 滚动到指定的节点
*/
scrollToValue: function (value, scrollIntoViewOptions) {
var node = this.getNodeByValue(value);
scrollToValue(value, scrollIntoViewOptions) {
const node = this.getNodeByValue(value);
if (node) {
node.element[0].scrollIntoView(scrollIntoViewOptions);
}
},
}
empty: function () {
BI.ButtonGroup.superclass.empty.apply(this, arguments);
empty() {
super.empty(arguments);
this.options.items = [];
},
}
destroy: function () {
BI.ButtonGroup.superclass.destroy.apply(this, arguments);
destroy() {
super.destroy(arguments);
this.options.items = [];
},
});
BI.extend(BI.ButtonGroup, {
}
}
extend(ButtonGroup, {
CHOOSE_TYPE_SINGLE: BI.Selection.Single,
CHOOSE_TYPE_MULTI: BI.Selection.Multi,
CHOOSE_TYPE_ALL: BI.Selection.All,
CHOOSE_TYPE_NONE: BI.Selection.None,
CHOOSE_TYPE_DEFAULT: BI.Selection.Default,
});
BI.ButtonGroup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.button_group", BI.ButtonGroup);

98
src/base/combination/group.combo.js

@ -2,9 +2,16 @@
* Created by GUY on 2015/8/10.
*/
BI.ComboGroup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.ComboGroup.superclass._defaultConfig.apply(this, arguments), {
import { shortcut, Widget, Controller, extend, isEmpty, each, formatEL, clone, createWidget } from "../../core";
@shortcut()
export class ComboGroup extends Widget {
static xtype = "bi.combo_group";
static EVENT_CHANGE = "EVENT_CHANGE";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-combo-group bi-list-item",
// 以下这些属性对每一个combo都是公用的
@ -28,69 +35,66 @@ BI.ComboGroup = BI.inherit(BI.Widget, {
},
},
});
},
}
render: function () {
render() {
this._populate(this.options.el);
},
}
_populate: function (item) {
var self = this, o = this.options;
var children = o.items;
if (BI.isEmpty(children)) {
_populate(item) {
const { items, action, height, direction, isDefaultInit, isNeedAdjustHeight, isNeedAdjustWidth, adjustLength, popup, container, trigger } = this.options;
const children = items;
if (isEmpty(children)) {
throw new Error("ComboGroup构造错误");
}
BI.each(children, function (i, ch) {
var son = BI.formatEL(ch).el.children;
ch = BI.formatEL(ch).el;
if (!BI.isEmpty(son)) {
ch.el = BI.clone(ch);
each(children, (i, ch) => {
const son = formatEL(ch).el.children;
ch = formatEL(ch).el;
if (!isEmpty(son)) {
ch.el = clone(ch);
ch.items = son;
ch.type = "bi.combo_group";
ch.action = o.action;
ch.height = o.height;
ch.direction = o.direction;
ch.isDefaultInit = o.isDefaultInit;
ch.isNeedAdjustHeight = o.isNeedAdjustHeight;
ch.isNeedAdjustWidth = o.isNeedAdjustWidth;
ch.adjustLength = o.adjustLength;
ch.popup = o.popup;
ch.action = action;
ch.height = height;
ch.direction = direction;
ch.isDefaultInit = isDefaultInit;
ch.isNeedAdjustHeight = isNeedAdjustHeight;
ch.isNeedAdjustWidth = isNeedAdjustWidth;
ch.adjustLength = adjustLength;
ch.popup = popup;
}
});
this.combo = BI.createWidget({
this.combo = createWidget({
type: "bi.combo",
element: this,
container: o.container,
height: o.height,
trigger: o.trigger,
direction: o.direction,
isDefaultInit: o.isDefaultInit,
isNeedAdjustWidth: o.isNeedAdjustWidth,
isNeedAdjustHeight: o.isNeedAdjustHeight,
adjustLength: o.adjustLength,
container,
height,
trigger,
direction,
isDefaultInit,
isNeedAdjustWidth,
isNeedAdjustHeight,
adjustLength,
el: item,
popup: BI.extend({}, o.popup, {
el: BI.extend({
popup: extend({}, popup, {
el: extend({
items: children,
}, o.popup.el),
}, popup.el),
}),
});
this.combo.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
this.combo.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
if (type === BI.Events.CLICK) {
self.fireEvent(BI.ComboGroup.EVENT_CHANGE, obj);
this.fireEvent(ComboGroup.EVENT_CHANGE, obj);
}
});
},
}
getValue: function () {
getValue() {
return this.combo.getValue();
},
}
setValue: function (v) {
setValue(v) {
this.combo.setValue(v);
},
});
BI.ComboGroup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.combo_group", BI.ComboGroup);
}
}

130
src/base/combination/group.virtual.js

@ -1,6 +1,13 @@
BI.VirtualGroup = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.VirtualGroup.superclass._defaultConfig.apply(this, arguments), {
import { shortcut, Widget, Controller, extend, isFunction, isKey, isArray, map, stripEL, deepClone, formatEL, isEmpty, each, createWidget } from "../../core";
@shortcut()
export class VirtualGroup extends Widget {
static xtype = "bi.virtual_group";
static EVENT_CHANGE = "EVENT_CHANGE";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-virtual-group",
items: [],
layouts: [{
@ -9,36 +16,36 @@ BI.VirtualGroup = BI.inherit(BI.Widget, {
vgap: 0,
}],
});
},
}
render: function () {
var self = this, o = this.options;
var items = BI.isFunction(o.items) ? this.__watch(o.items, function (context, newValue) {
self.populate(newValue);
}) : o.items;
render() {
const { items: optionsItems, value } = this.options;
const items = isFunction(optionsItems) ? this.__watch(optionsItems, (context, newValue) => {
this.populate(newValue);
}) : optionsItems;
this.populate(items);
o.value = BI.isFunction(o.value) ? this.__watch(o.value, function (context, newValue) {
self.setValue(newValue);
}) : o.value;
if (BI.isKey(o.value)) {
this.setValue(o.value);
this.options.value = isFunction(value) ? this.__watch(value, (context, newValue) => {
this.setValue(newValue);
}) : value;
if (isKey(value)) {
this.setValue(value);
}
},
}
_packageBtns: function (items) {
var o = this.options;
var map = this.buttonMap = {};
var layouts = BI.isArray(o.layouts) ? o.layouts : [o.layouts];
_packageBtns(items) {
const o = this.options;
const map = this.buttonMap = {};
const layouts = isArray(o.layouts) ? o.layouts : [o.layouts];
for (let i = layouts.length - 1; i > 0; i--) {
items = BI.map(items, function (k, it) {
var el = BI.stripEL(it);
items = map(items, (k, it) => {
const el = stripEL(it);
return BI.extend({}, layouts[i], {
return extend({}, layouts[i], {
items: [
BI.extend({}, layouts[i].el, {
el: BI.extend({
ref: function (_ref) {
if (BI.isKey(map[el.value])) {
extend({}, layouts[i].el, {
el: extend({
ref: (_ref) => {
if (isKey(map[el.value])) {
map[el.value] = _ref;
}
},
@ -50,33 +57,33 @@ BI.VirtualGroup = BI.inherit(BI.Widget, {
}
return items;
},
}
_packageLayout: function (items) {
var o = this.options;
var layouts = BI.isArray(o.layouts) ? o.layouts : [o.layouts];
var layout = BI.deepClone(layouts[0]);
_packageLayout(items) {
const o = this.options;
const layouts = isArray(o.layouts) ? o.layouts : [o.layouts];
const layout = deepClone(layouts[0]);
var lay = BI.formatEL(layout).el;
while (lay && lay.items && !BI.isEmpty(lay.items)) {
lay = BI.formatEL(lay.items[0]).el;
let lay = formatEL(layout).el;
while (lay && lay.items && !isEmpty(lay.items)) {
lay = formatEL(lay.items[0]).el;
}
lay.items = items;
return layout;
},
}
addItems: function (items) {
addItems(items) {
this.layouts.addItems(items, this);
},
}
prependItems: function (items) {
prependItems(items) {
this.layouts.prependItems(items, this);
},
}
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
BI.each(this.buttonMap, function (key, item) {
setValue(v) {
v = isArray(v) ? v : [v];
each(this.buttonMap, (key, item) => {
if (item) {
if (v.deepContains(key)) {
item.setSelected && item.setSelected(true);
@ -85,11 +92,11 @@ BI.VirtualGroup = BI.inherit(BI.Widget, {
}
}
});
},
}
getNotSelectedValue: function () {
var v = [];
BI.each(this.buttonMap, function (i, item) {
getNotSelectedValue() {
const v = [];
each(this.buttonMap, (i, item) => {
if (item) {
if (item.isEnabled() && !(item.isSelected && item.isSelected())) {
v.push(item.getValue());
@ -98,25 +105,25 @@ BI.VirtualGroup = BI.inherit(BI.Widget, {
});
return v;
},
}
getNodeByValue: function (value) {
getNodeByValue(value) {
return this.buttonMap[value];
},
}
/**
* 滚动到指定的节点
*/
scrollToValue: function (value, scrollIntoViewOptions) {
var node = this.getNodeByValue(value);
scrollToValue(value, scrollIntoViewOptions) {
const node = this.getNodeByValue(value);
if (node) {
node.element[0].scrollIntoView(scrollIntoViewOptions);
}
},
}
getValue: function () {
var v = [];
BI.each(this.buttonMap, function (i, item) {
getValue() {
const v = [];
each(this.buttonMap, (i, item) => {
if (item) {
if (item.isEnabled() && item.isSelected && item.isSelected()) {
v.push(item.getValue());
@ -125,21 +132,18 @@ BI.VirtualGroup = BI.inherit(BI.Widget, {
});
return v;
},
}
populate: function (items) {
populate(items) {
items = items || [];
this.options.items = items;
items = this._packageBtns(items);
if (!this.layouts) {
this.layouts = BI.createWidget(BI.extend({ element: this }, this._packageLayout(items)));
this.layouts = createWidget(extend({ element: this }, this._packageLayout(items)));
} else {
this.layouts.populate(items, {
context: this,
});
}
},
});
BI.VirtualGroup.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.virtual_group", BI.VirtualGroup);
}
}

12
src/base/combination/index.js

@ -0,0 +1,12 @@
export { Bubble } from "./bubble";
export { Combo } from "./combo";
export { Expander } from "./expander";
export { ButtonGroup } from "./group.button";
export { ComboGroup } from "./group.combo";
export { VirtualGroup } from "./group.virtual";
export { Loader } from "./loader";
export { Navigation } from "./navigation";
export { Searcher } from "./searcher";
export { Switcher } from "./switcher";
export { Tab } from "./tab";
export { ButtonTree } from "./tree.button";

221
src/base/combination/loader.js

@ -5,9 +5,16 @@
* @class BI.Loader
* @extends BI.Widget
*/
BI.Loader = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.Loader.superclass._defaultConfig.apply(this, arguments), {
import { shortcut, Widget, Controller, extend, createWidget, isEmpty, nextTick, bind, isFunction, isNotEmptyArray, isNumber, isObject, each } from "../../core";
@shortcut()
export class Loader extends Widget {
static xtype = "bi.loader";
static EVENT_CHANGE = "EVENT_CHANGE";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-loader",
direction: "top",
@ -33,115 +40,115 @@ BI.Loader = BI.inherit(BI.Widget, {
hasPrev: BI.emptyFn,
hasNext: BI.emptyFn,
});
},
}
_prevLoad: function () {
var self = this, o = this.options;
_prevLoad() {
const o = this.options;
this.prev.setLoading();
o.itemsCreator.apply(this, [{ times: --this.times }, function () {
self.prev.setLoaded();
self.prependItems.apply(self, arguments);
o.itemsCreator.apply(this, [{ times: --this.times }, (...args) => {
this.prev.setLoaded();
this.prependItems.apply(this, args);
}]);
},
}
_nextLoad: function () {
var self = this, o = this.options;
_nextLoad() {
const o = this.options;
this.next.setLoading();
o.itemsCreator.apply(this, [{ times: ++this.times }, function () {
self.next.setLoaded();
self.addItems.apply(self, arguments);
o.itemsCreator.apply(this, [{ times: ++this.times }, (...args) => {
this.next.setLoaded();
this.addItems.apply(this, args);
}]);
},
}
render: function () {
var self = this, o = this.options;
if (o.itemsCreator === false) {
o.prev = false;
o.next = false;
render() {
const { itemsCreator, prev, next, el, items: optionsItems, value, direction, logic, isDefaultInit } = this.options;
if (itemsCreator === false) {
prev = false;
next = false;
}
if (o.prev !== false) {
this.prev = BI.createWidget(BI.extend({
if (prev !== false) {
this.prev = createWidget(extend({
type: "bi.loading_bar",
}, o.prev));
this.prev.on(BI.Controller.EVENT_CHANGE, function (type) {
}, prev));
this.prev.on(Controller.EVENT_CHANGE, (type) => {
if (type === BI.Events.CLICK) {
self._prevLoad();
this._prevLoad();
}
});
}
this.button_group = BI.createWidget(o.el, {
this.button_group = createWidget(el, {
type: "bi.button_group",
chooseType: 0,
items: o.items,
items: optionsItems,
behaviors: {},
layouts: [{
type: "bi.vertical",
}],
value: o.value,
value,
});
this.button_group.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
this.button_group.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
if (type === BI.Events.CLICK) {
self.fireEvent(BI.Loader.EVENT_CHANGE, obj);
this.fireEvent(Loader.EVENT_CHANGE, obj);
}
});
if (o.next !== false) {
this.next = BI.createWidget(BI.extend({
if (next !== false) {
this.next = createWidget(extend({
type: "bi.loading_bar",
}, o.next));
this.next.on(BI.Controller.EVENT_CHANGE, function (type) {
}, next));
this.next.on(Controller.EVENT_CHANGE, (type) => {
if (type === BI.Events.CLICK) {
self._nextLoad();
this._nextLoad();
}
});
}
BI.createWidget(BI.extend({
createWidget(extend({
element: this,
}, BI.LogicFactory.createLogic(BI.LogicFactory.createLogicTypeByDirection(o.direction), BI.extend({
}, BI.LogicFactory.createLogic(BI.LogicFactory.createLogicTypeByDirection(direction), extend({
scrolly: true,
}, o.logic, {
items: BI.LogicFactory.createLogicItemsByDirection(o.direction, this.prev, this.button_group, this.next),
}, logic, {
items: BI.LogicFactory.createLogicItemsByDirection(direction, this.prev, this.button_group, this.next),
}))));
o.isDefaultInit && BI.isEmpty(o.items) && BI.nextTick(BI.bind(function () {
o.isDefaultInit && BI.isEmpty(o.items) && this._populate();
isDefaultInit && isEmpty(optionsItems) && nextTick(bind(() => {
isDefaultInit && isEmpty(optionsItems) && this._populate();
}, this));
var items = BI.isFunction(o.items) ? this.__watch(o.items, function (context, newValue) {
self.populate(newValue);
}) : o.items;
if (BI.isNotEmptyArray(items)) {
const items = isFunction(optionsItems) ? this.__watch(optionsItems, (context, newValue) => {
this.populate(newValue);
}) : optionsItems;
if (isNotEmptyArray(items)) {
this._populate(items);
}
},
}
hasPrev: function () {
var o = this.options;
if (BI.isNumber(o.count)) {
return this.count < o.count;
hasPrev() {
const { count, hasPrev } = this.options;
if (isNumber(count)) {
return this.count < count;
}
return !!o.hasPrev.apply(this, [{
return !!hasPrev.apply(this, [{
times: this.times,
count: this.count,
}]);
},
}
hasNext: function () {
var o = this.options;
if (BI.isNumber(o.count)) {
return this.count < o.count;
hasNext() {
const { count, hasNext } = this.options;
if (isNumber(count)) {
return this.count < count;
}
return !!o.hasNext.apply(this, [{
return !!hasNext.apply(this, [{
times: this.times,
count: this.count,
}]);
},
}
prependItems: function (items) {
prependItems(items) {
this.count += items.length;
if (this.next !== false) {
if (this.hasPrev()) {
@ -152,11 +159,11 @@ BI.Loader = BI.inherit(BI.Widget, {
}
}
this.button_group.prependItems.apply(this.button_group, arguments);
},
}
addItems: function (items) {
addItems(items) {
this.count += items.length;
if (BI.isObject(this.next)) {
if (isObject(this.next)) {
if (this.hasNext()) {
this.options.items = this.options.items.concat(items);
this.next.setLoaded();
@ -165,16 +172,16 @@ BI.Loader = BI.inherit(BI.Widget, {
}
}
this.button_group.addItems.apply(this.button_group, arguments);
},
}
_populate: function (items) {
var self = this, o = this.options;
if (arguments.length === 0 && (BI.isFunction(o.itemsCreator))) {
o.itemsCreator.apply(this, [{ times: 1 }, function () {
if (arguments.length === 0) {
_populate(items) {
const o = this.options;
if (arguments.length === 0 && (isFunction(o.itemsCreator))) {
o.itemsCreator.apply(this, [{ times: 1 }, (...args) => {
if (args.length === 0) {
throw new Error("参数不能为空");
}
self.populate.apply(self, arguments);
this.populate.apply(this, args);
o.onLoaded();
}]);
@ -184,14 +191,14 @@ BI.Loader = BI.inherit(BI.Widget, {
this.times = 1;
this.count = 0;
this.count += items.length;
if (BI.isObject(this.next)) {
if (isObject(this.next)) {
if (this.hasNext()) {
this.next.setLoaded();
} else {
this.next.invisible();
}
}
if (BI.isObject(this.prev)) {
if (isObject(this.prev)) {
if (this.hasPrev()) {
this.prev.setLoaded();
} else {
@ -200,66 +207,64 @@ BI.Loader = BI.inherit(BI.Widget, {
}
return true;
},
}
populate: function () {
populate() {
this._populate.apply(this, arguments) && this.button_group.populate.apply(this.button_group, arguments);
},
}
setNotSelectedValue: function () {
setNotSelectedValue() {
this.button_group.setNotSelectedValue.apply(this.button_group, arguments);
},
}
getNotSelectedValue: function () {
getNotSelectedValue() {
return this.button_group.getNotSelectedValue();
},
}
setValue: function () {
setValue() {
this.button_group.setValue.apply(this.button_group, arguments);
},
}
getValue: function () {
getValue() {
return this.button_group.getValue.apply(this.button_group, arguments);
},
}
getAllButtons: function () {
getAllButtons() {
return this.button_group.getAllButtons();
},
}
getAllLeaves: function () {
getAllLeaves() {
return this.button_group.getAllLeaves();
},
}
getSelectedButtons: function () {
getSelectedButtons() {
return this.button_group.getSelectedButtons();
},
}
getNotSelectedButtons: function () {
getNotSelectedButtons() {
return this.button_group.getNotSelectedButtons();
},
}
getIndexByValue: function (value) {
getIndexByValue(value) {
return this.button_group.getIndexByValue(value);
},
}
getNodeById: function (id) {
getNodeById(id) {
return this.button_group.getNodeById(id);
},
}
getNodeByValue: function (value) {
getNodeByValue(value) {
return this.button_group.getNodeByValue(value);
},
}
empty: function () {
empty() {
this.button_group.empty();
BI.each([this.prev, this.next], function (i, ob) {
each([this.prev, this.next], (i, ob) => {
ob && ob.setVisible(false);
});
},
destroy: function () {
BI.Loader.superclass.destroy.apply(this, arguments);
},
});
BI.Loader.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.loader", BI.Loader);
}
destroy() {
super.destroy(arguments);
}
}

162
src/base/combination/navigation.js

@ -1,10 +1,16 @@
/**
* Created by GUY on 2015/6/26.
*/
import { shortcut, Widget, Controller, extend, createWidget, bind, ShowListener, isFunction, each, nextTick, isKey, values } from "../../core";
BI.Navigation = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.Navigation.superclass._defaultConfig.apply(this, arguments), {
@shortcut()
export class Navigation extends Widget {
static xtype = "bi.navigation";
static EVENT_CHANGE = "EVENT_CHANGE";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
direction: "bottom", // top, bottom, left, right, custom
logic: {
dynamic: false,
@ -12,160 +18,158 @@ BI.Navigation = BI.inherit(BI.Widget, {
single: false,
showIndex: false,
tab: false,
cardCreator: function (v) {
return BI.createWidget();
cardCreator: (v) => {
return createWidget();
},
afterCardCreated: BI.emptyFn,
afterCardShow: BI.emptyFn,
});
},
}
render: function () {
var self = this, o = this.options;
this.tab = BI.createWidget(this.options.tab, { type: "bi.button_group" });
render() {
const { direction, logic, cardCreator, showIndex } = this.options;
this.tab = createWidget(this.options.tab, { type: "bi.button_group" });
this.cardMap = {};
this.showIndex = 0;
this.layout = BI.createWidget({
this.layout = createWidget({
type: "bi.card",
});
BI.createWidget(BI.extend({
createWidget(extend({
element: this,
}, BI.LogicFactory.createLogic(BI.LogicFactory.createLogicTypeByDirection(o.direction), BI.extend({}, o.logic, {
items: BI.LogicFactory.createLogicItemsByDirection(o.direction, this.tab, this.layout),
}, BI.LogicFactory.createLogic(BI.LogicFactory.createLogicTypeByDirection(direction), extend({}, logic, {
items: BI.LogicFactory.createLogicItemsByDirection(direction, this.tab, this.layout),
}))));
new BI.ShowListener({
new ShowListener({
eventObj: this.tab,
cardLayout: this.layout,
cardNameCreator: function (v) {
return self.showIndex + v;
cardNameCreator: (v) => {
return this.showIndex + v;
},
cardCreator: function (v) {
BI.Widget.execWithContext(self, function () {
self.cardMap[v] = o.cardCreator(v);
cardCreator: (v) => {
Widget.execWithContext(this, () => {
this.cardMap[v] = cardCreator(v);
});
return self.cardMap[v];
return this.cardMap[v];
},
afterCardCreated: BI.bind(this.afterCardCreated, this),
afterCardShow: BI.bind(this.afterCardShow, this),
afterCardCreated: bind(this.afterCardCreated, this),
afterCardShow: bind(this.afterCardShow, this),
});
if (BI.isFunction(o.showIndex)) {
this.__watch(o.showIndex, function (context, newValue) {
self.setSelect(newValue);
if (isFunction(showIndex)) {
this.__watch(showIndex, (context, newValue) => {
this.setSelect(newValue);
});
}
},
}
created: function () {
var o = this.options;
if (o.showIndex !== false) {
this.setSelect(o.showIndex);
created() {
const { showIndex } = this.options;
if (showIndex !== false) {
this.setSelect(showIndex);
}
},
}
_deleteOtherCards: function (currCardName) {
var self = this, o = this.options;
if (o.single === true) {
BI.each(this.cardMap, function (name, card) {
_deleteOtherCards(currCardName) {
const { single } = this.options;
if (single === true) {
each(this.cardMap, (name, card) => {
if (name !== (currCardName + "")) {
self.layout.deleteCardByName(name);
delete self.cardMap[name];
this.layout.deleteCardByName(name);
delete this.cardMap[name];
}
});
}
},
}
afterCardCreated: function (v) {
var self = this;
this.cardMap[v].on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
afterCardCreated(v) {
this.cardMap[v].on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
if (type === BI.Events.CLICK) {
self.fireEvent(BI.Navigation.EVENT_CHANGE, obj);
this.fireEvent(Navigation.EVENT_CHANGE, obj);
}
});
this.options.afterCardCreated.apply(this, arguments);
},
}
afterCardShow: function (v) {
afterCardShow(v) {
this.showIndex = v;
this._deleteOtherCards(v);
this.options.afterCardShow.apply(this, arguments);
},
}
populate: function () {
var card = this.layout.getShowingCard();
populate() {
const card = this.layout.getShowingCard();
if (card) {
return card.populate.apply(card, arguments);
}
},
}
_assertCard: function (v) {
var self = this, o = this.options;
_assertCard(v) {
const { cardCreator } = this.options;
if (!this.layout.isCardExisted(v)) {
BI.Widget.execWithContext(self, function () {
self.cardMap[v] = o.cardCreator(v);
Widget.execWithContext(this, () => {
this.cardMap[v] = cardCreator(v);
});
this.layout.addCardByName(v, this.cardMap[v]);
this.afterCardCreated(v);
}
},
}
setSelect: function (v) {
setSelect(v) {
this._assertCard(v);
this.layout.showCardByName(v);
this._deleteOtherCards(v);
if (this.showIndex !== v) {
this.showIndex = v;
BI.nextTick(BI.bind(this.afterCardShow, this, v));
nextTick(bind(this.afterCardShow, this, v));
}
},
}
getSelect: function () {
getSelect() {
return this.showIndex;
},
}
getSelectedCard: function () {
if (BI.isKey(this.showIndex)) {
getSelectedCard() {
if (isKey(this.showIndex)) {
return this.cardMap[this.showIndex];
}
},
}
getAllCard: function() {
return BI.values(this.cardMap);
},
getAllCard() {
return values(this.cardMap);
}
/**
* @override
*/
setValue: function (v) {
var card = this.layout.getShowingCard();
setValue(v) {
const card = this.layout.getShowingCard();
if (card) {
card.setValue(v);
}
},
}
/**
* @override
*/
getValue: function () {
var card = this.layout.getShowingCard();
getValue() {
const card = this.layout.getShowingCard();
if (card) {
return card.getValue();
}
},
}
empty: function () {
empty() {
this.layout.deleteAllCard();
this.cardMap = {};
},
}
destroy() {
super.destroy(arguments);
}
destroy: function () {
BI.Navigation.superclass.destroy.apply(this, arguments);
},
});
BI.Navigation.EVENT_CHANGE = "EVENT_CHANGE";
}
BI.shortcut("bi.navigation", BI.Navigation);

306
src/base/combination/searcher.js

@ -5,10 +5,23 @@
* @class BI.Searcher
* @extends BI.Widget
*/
BI.Searcher = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.Searcher.superclass._defaultConfig.apply(this, arguments), {
import { shortcut, Widget, Controller, extend, createWidget, debounce, bind, endWith, deepWithout, nextTick, isEmptyString, isNull } from "../../core";
import { ButtonGroup } from "./group.button";
import { Maskers } from "../0.base";
@shortcut()
export class Searcher extends Widget {
static xtype = "bi.searcher";
static EVENT_CHANGE = "EVENT_CHANGE";
static EVENT_START = "EVENT_START";
static EVENT_STOP = "EVENT_STOP";
static EVENT_PAUSE = "EVENT_PAUSE";
static EVENT_SEARCHING = "EVENT_SEARCHING";
static EVENT_AFTER_INIT = "EVENT_AFTER_INIT";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-searcher",
lgap: 0,
rgap: 0,
@ -20,10 +33,10 @@ BI.Searcher = BI.inherit(BI.Widget, {
isDefaultInit: false,
isAutoSearch: true, // 是否自动搜索
isAutoSync: true, // 是否自动同步数据, 即是否保持搜索面板和adapter面板状态值的统一
chooseType: BI.ButtonGroup.CHOOSE_TYPE_SINGLE,
chooseType: ButtonGroup.CHOOSE_TYPE_SINGLE,
// isAutoSearch为false时启用
onSearch: function (op, callback) {
onSearch: (op, callback) => {
callback([]);
},
@ -40,190 +53,191 @@ BI.Searcher = BI.inherit(BI.Widget, {
offset: {},
},
});
},
}
render: function () {
var self = this, o = this.options;
render() {
const { el, lgap, rgap, tgap, bgap, vgap, hgap, isDefaultInit } = this.options;
this.editor = BI.createWidget(o.el, {
this.editor = createWidget(el, {
type: "bi.search_editor",
});
BI.createWidget({
createWidget({
type: "bi.vertical",
element: this,
lgap: o.lgap,
rgap: o.rgap,
tgap: o.tgap,
bgap: o.bgap,
vgap: o.vgap,
hgap: o.hgap,
lgap,
rgap,
tgap,
bgap,
vgap,
hgap,
items: [this.editor],
});
o.isDefaultInit && (this._assertPopupView());
isDefaultInit && (this._assertPopupView());
var search = BI.debounce(BI.bind(this._search, this), BI.EVENT_RESPONSE_TIME, {
const search = debounce(bind(this._search, this), BI.EVENT_RESPONSE_TIME, {
"leading": true,
"trailing": false,
});
this.editor.on(BI.Controller.EVENT_CHANGE, function (type) {
this.editor.on(Controller.EVENT_CHANGE, (type) => {
switch (type) {
case BI.Events.STARTEDIT:
self._startSearch();
this._startSearch();
break;
case BI.Events.EMPTY:
self._stopSearch();
this._stopSearch();
break;
case BI.Events.CHANGE:
search();
break;
case BI.Events.PAUSE:
if (BI.endWith(this.getValue(), BI.BlankSplitChar)) {
self._pauseSearch();
if (endWith(this.getValue(), BI.BlankSplitChar)) {
this._pauseSearch();
}
break;
default:
break;
}
});
},
}
_assertPopupView: function () {
var self = this, o = this.options;
if ((o.masker && !BI.Maskers.has(this.getName())) || (o.masker === false && !this.popupView)) {
this.popupView = BI.createWidget(o.popup, {
_assertPopupView() {
const { masker, popup, chooseType, isAutoSync, adapter } = this.options;
if ((masker && !Maskers.has(this.getName())) || (masker === false && !this.popupView)) {
this.popupView = createWidget(popup, {
type: "bi.searcher_view",
chooseType: o.chooseType,
chooseType: chooseType,
});
this.popupView.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
this.popupView.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
if (type === BI.Events.CLICK) {
if (o.isAutoSync) {
var values = o.adapter && o.adapter.getValue();
switch (o.chooseType) {
case BI.ButtonGroup.CHOOSE_TYPE_SINGLE:
o.adapter && o.adapter.setValue([obj.getValue()]);
if (isAutoSync) {
const values = adapter && adapter.getValue();
switch (chooseType) {
case ButtonGroup.CHOOSE_TYPE_SINGLE:
adapter && adapter.setValue([obj.getValue()]);
break;
case BI.ButtonGroup.CHOOSE_TYPE_MULTI:
case ButtonGroup.CHOOSE_TYPE_MULTI:
if (!obj.isSelected()) {
o.adapter && o.adapter.setValue(BI.deepWithout(values, obj.getValue()));
adapter && adapter.setValue(deepWithout(values, obj.getValue()));
}
values.push(obj.getValue());
o.adapter && o.adapter.setValue(values);
adapter && adapter.setValue(values);
break;
default:
break;
}
}
self.fireEvent(BI.Searcher.EVENT_CHANGE, value, obj);
this.fireEvent(Searcher.EVENT_CHANGE, value, obj);
}
});
BI.nextTick(function () {
self.fireEvent(BI.Searcher.EVENT_AFTER_INIT);
nextTick(() => {
this.fireEvent(Searcher.EVENT_AFTER_INIT);
});
}
if (o.masker && !BI.Maskers.has(this.getName())) {
BI.Maskers.create(this.getName(), o.adapter, BI.extend({
if (masker && !Maskers.has(this.getName())) {
Maskers.create(this.getName(), adapter, extend({
container: this,
render: this.popupView,
}, o.masker), this);
}, masker), this);
}
},
}
_startSearch: function () {
_startSearch() {
this._assertPopupView();
this._stop = false;
this._isSearching = true;
this.fireEvent(BI.Searcher.EVENT_START);
this.fireEvent(Searcher.EVENT_START);
this.popupView.startSearch && this.popupView.startSearch();
// 搜索前先清空dom
// BI.Maskers.get(this.getName()).empty();
BI.nextTick(function (name) {
BI.Maskers.show(name);
nextTick((name) => {
Maskers.show(name);
}, this.getName());
},
}
_pauseSearch: function () {
_pauseSearch() {
this._stop = true;
BI.nextTick(function (name) {
BI.Maskers.hide(name);
nextTick((name) => {
Maskers.hide(name);
}, this.getName());
if (this._isSearching === true) {
this.popupView && this.popupView.pauseSearch && this.popupView.pauseSearch();
this.fireEvent(BI.Searcher.EVENT_PAUSE);
this.fireEvent(Searcher.EVENT_PAUSE);
}
this._isSearching = false;
},
}
_stopSearch: function () {
var name = this.getName();
_stopSearch() {
const name = this.getName();
this._stop = true;
BI.Maskers.hide(name);
Maskers.hide(name);
if (this._isSearching === true) {
this.popupView && this.popupView.stopSearch && this.popupView.stopSearch();
this.fireEvent(BI.Searcher.EVENT_STOP);
this.fireEvent(Searcher.EVENT_STOP);
}
this._isSearching = false;
},
}
_search: function () {
var self = this, o = this.options, keyword = this.editor.getValue();
_search() {
const { isAutoSearch, adapter, isAutoSync, onSearch } = this.options;
const keyword = this.editor.getValue();
if (keyword === "" || this._stop) {
return;
}
if (o.isAutoSearch) {
var items = (o.adapter && ((o.adapter.getItems && o.adapter.getItems()) || o.adapter.attr("items"))) || [];
var finding = BI.Func.getSearchResult(items, keyword);
var match = finding.match, find = finding.find;
if (isAutoSearch) {
const items = (adapter && ((adapter.getItems && adapter.getItems()) || adapter.attr("items"))) || [];
const finding = BI.Func.getSearchResult(items, keyword);
const match = finding.match, find = finding.find;
this.popupView.populate(find, match, keyword);
o.isAutoSync && o.adapter && o.adapter.getValue && this.popupView.setValue(o.adapter.getValue());
self.fireEvent(BI.Searcher.EVENT_SEARCHING);
isAutoSync && adapter && adapter.getValue && this.popupView.setValue(adapter.getValue());
this.fireEvent(Searcher.EVENT_SEARCHING);
return;
}
this.popupView.loading && this.popupView.loading();
o.onSearch({
onSearch({
times: 1,
keyword: keyword,
selectedValues: o.adapter && o.adapter.getValue(),
}, function (searchResult, matchResult) {
if (!self._stop && keyword === self.editor.getValue()) {
var args = [].slice.call(arguments);
selectedValues: adapter && adapter.getValue(),
}, (searchResult, matchResult, ...arg) => {
if (!this._stop && keyword === this.editor.getValue()) {
const args = [searchResult, matchResult, ...arg];
if (args.length > 0) {
args.push(keyword);
}
BI.Maskers.show(self.getName());
self.popupView.populate.apply(self.popupView, args);
o.isAutoSync && o.adapter && o.adapter.getValue && self.popupView.setValue(o.adapter.getValue());
self.popupView.loaded && self.popupView.loaded();
self.fireEvent(BI.Searcher.EVENT_SEARCHING);
Maskers.show(this.getName());
this.popupView.populate.apply(this.popupView, args);
isAutoSync && adapter && adapter.getValue && this.popupView.setValue(adapter.getValue());
this.popupView.loaded && this.popupView.loaded();
this.fireEvent(Searcher.EVENT_SEARCHING);
}
});
},
}
_getLastSearchKeyword: function () {
_getLastSearchKeyword() {
if (this.isValid()) {
var res = this.editor.getValue().split(/\u200b\s\u200b/);
if (BI.isEmptyString(res[res.length - 1])) {
const res = this.editor.getValue().split(/\u200b\s\u200b/);
if (isEmptyString(res[res.length - 1])) {
res = res.slice(0, res.length - 1);
}
return BI.isNull(res) ? "" : res[res.length - 1];
return isNull(res) ? "" : res[res.length - 1];
}
},
}
setAdapter: function (adapter) {
setAdapter(adapter) {
this.options.adapter = adapter;
BI.Maskers.remove(this.getName());
},
Maskers.remove(this.getName());
}
doSearch: function () {
doSearch() {
if (this.isSearching()) {
this._search();
}
},
}
stopSearch: function () {
stopSearch() {
this._stopSearch();// 先停止搜索,然后再去设置editor为空
// important:停止搜索必须退出编辑状态,这里必须加上try(input框不显示时blur会抛异常)
try {
@ -235,103 +249,95 @@ BI.Searcher = BI.inherit(BI.Widget, {
} finally {
this.editor.setValue("");
}
},
}
isSearching: function () {
isSearching() {
return this._isSearching;
},
}
isViewVisible: function () {
return this.editor.isEnabled() && BI.Maskers.isVisible(this.getName());
},
isViewVisible() {
return this.editor.isEnabled() && Maskers.isVisible(this.getName());
}
getView: function () {
getView() {
return this.popupView;
},
}
hasMatched: function () {
hasMatched() {
this._assertPopupView();
return this.popupView.hasMatched();
},
}
adjustHeight: function () {
if (BI.Maskers.has(this.getName()) && BI.Maskers.get(this.getName()).isVisible()) {
BI.Maskers.show(this.getName());
adjustHeight() {
if (Maskers.has(this.getName()) && Maskers.get(this.getName()).isVisible()) {
Maskers.show(this.getName());
}
},
}
adjustView: function () {
this.isViewVisible() && BI.Maskers.show(this.getName());
},
adjustView() {
this.isViewVisible() && Maskers.show(this.getName());
}
setValue: function (v) {
if (BI.isNull(this.popupView)) {
setValue(v) {
if (isNull(this.popupView)) {
this.options.popup.value = v;
} else {
this.popupView.setValue(v);
}
},
}
getKeyword: function () {
getKeyword() {
return this._getLastSearchKeyword();
},
}
getKeywords: function () {
getKeywords() {
return this.editor.getKeywords();
},
}
getValue: function () {
var o = this.options;
if (o.isAutoSync && o.adapter && o.adapter.getValue) {
return o.adapter.getValue();
getValue() {
const { isAutoSync, adapter, popup } = this.options;
if (isAutoSync && adapter && adapter.getValue) {
return adapter.getValue();
}
if (this.isSearching()) {
return this.popupView.getValue();
} else if (o.adapter && o.adapter.getValue) {
return o.adapter.getValue();
} else if (adapter && adapter.getValue) {
return adapter.getValue();
}
if (BI.isNull(this.popupView)) {
return o.popup.value;
if (isNull(this.popupView)) {
return popup.value;
}
return this.popupView.getValue();
},
}
populate: function (result, searchResult, keyword) {
var o = this.options;
populate(result, searchResult, keyword) {
const { isAutoSync, adapter } = this.options;
this._assertPopupView();
this.popupView.populate.apply(this.popupView, arguments);
if (o.isAutoSync && o.adapter && o.adapter.getValue) {
this.popupView.setValue(o.adapter.getValue());
if (isAutoSync && adapter && adapter.getValue) {
this.popupView.setValue(adapter.getValue());
}
},
}
empty: function () {
empty() {
this.popupView && this.popupView.empty();
},
}
destroyed: function () {
BI.Maskers.remove(this.getName());
},
destroyed() {
Maskers.remove(this.getName());
}
focus: function () {
focus() {
this.editor.focus();
},
}
blur: function () {
blur() {
this.editor.blur();
},
}
setWaterMark: function (v) {
setWaterMark(v) {
this.editor.setWaterMark(v);
},
});
BI.Searcher.EVENT_CHANGE = "EVENT_CHANGE";
BI.Searcher.EVENT_START = "EVENT_START";
BI.Searcher.EVENT_STOP = "EVENT_STOP";
BI.Searcher.EVENT_PAUSE = "EVENT_PAUSE";
BI.Searcher.EVENT_SEARCHING = "EVENT_SEARCHING";
BI.Searcher.EVENT_AFTER_INIT = "EVENT_AFTER_INIT";
BI.shortcut("bi.searcher", BI.Searcher);
}
}

278
src/base/combination/switcher.js

@ -6,9 +6,26 @@
* @class BI.Switcher
* @extends BI.Widget
*/
BI.Switcher = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.Switcher.superclass._defaultConfig.apply(this, arguments), {
import { shortcut, Widget, Controller, extend, nextTick, createWidget, each, debounce, isNull } from "../../core";
import { Maskers } from "../0.base";
@shortcut()
export class Switcher extends Widget {
static xtype = "bi.switcher";
static EVENT_EXPAND = "EVENT_EXPAND";
static EVENT_COLLAPSE = "EVENT_COLLAPSE";
static EVENT_TRIGGER_CHANGE = "EVENT_TRIGGER_CHANGE";
static EVENT_CHANGE = "EVENT_CHANGE";
static EVENT_AFTER_INIT = "EVENT_AFTER_INIT";
static EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
static EVENT_AFTER_POPUPVIEW = "EVENT_AFTER_POPUPVIEW";
static EVENT_BEFORE_HIDEVIEW = "EVENT_BEFORE_HIDEVIEW";
static EVENT_AFTER_HIDEVIEW = "EVENT_AFTER_HIDEVIEW";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-switcher",
direction: BI.Direction.Top,
trigger: "click",
@ -20,47 +37,47 @@ BI.Switcher = BI.inherit(BI.Widget, {
switcherClass: "bi-switcher-popup",
hoverClass: "bi-switcher-hover",
});
},
}
render: function () {
var self = this, o = this.options;
render() {
const { hoverClass, isDefaultInit } = this.options;
this._initSwitcher();
// 延迟绑定事件,这样可以将自己绑定的事情优先执行
BI.nextTick(() => {
nextTick(() => {
!this.isDestroyed() && this._initPullDownAction();
});
this.switcher.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
if (self.isEnabled() && self.isValid()) {
this.switcher.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
if (this.isEnabled() && this.isValid()) {
if (type === BI.Events.EXPAND) {
self._popupView();
this._popupView();
}
if (type === BI.Events.COLLAPSE) {
self._hideView();
this._hideView();
}
if (type === BI.Events.EXPAND) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
self.fireEvent(BI.Switcher.EVENT_EXPAND);
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
this.fireEvent(Switcher.EVENT_EXPAND);
}
if (type === BI.Events.COLLAPSE) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
self.isViewVisible() && self.fireEvent(BI.Switcher.EVENT_COLLAPSE);
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
this.isViewVisible() && this.fireEvent(Switcher.EVENT_COLLAPSE);
}
if (type === BI.Events.CLICK) {
self.fireEvent(BI.Switcher.EVENT_TRIGGER_CHANGE, value, obj);
this.fireEvent(Switcher.EVENT_TRIGGER_CHANGE, value, obj);
}
}
});
this.element.hover(function () {
if (self.isEnabled() && self.switcher.isEnabled()) {
self.element.addClass(o.hoverClass);
this.element.hover(() => {
if (this.isEnabled() && this.switcher.isEnabled()) {
this.element.addClass(hoverClass);
}
}, function () {
if (self.isEnabled() && self.switcher.isEnabled()) {
self.element.removeClass(o.hoverClass);
}, () => {
if (this.isEnabled() && this.switcher.isEnabled()) {
this.element.removeClass(hoverClass);
}
});
BI.createWidget({
createWidget({
type: "bi.vertical",
scrolly: false,
element: this,
@ -68,10 +85,10 @@ BI.Switcher = BI.inherit(BI.Widget, {
{ el: this.switcher }
],
});
o.isDefaultInit && (this._assertPopupView());
},
isDefaultInit && (this._assertPopupView());
}
_toggle: function () {
_toggle() {
this._assertPopupView();
if (this.isExpanded()) {
this._hideView();
@ -80,40 +97,40 @@ BI.Switcher = BI.inherit(BI.Widget, {
this._popupView();
}
}
},
}
_initPullDownAction: function () {
var self = this, o = this.options;
var evs = this.options.trigger.split(",");
BI.each(evs, function (i, e) {
_initPullDownAction() {
const { toggle } = this.options;
const evs = this.options.trigger.split(",");
each(evs, (i, e) => {
switch (e) {
case "hover":
self.element[e](function (e) {
if (self.isEnabled() && self.switcher.isEnabled()) {
self._popupView();
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.switcher);
self.fireEvent(BI.Switcher.EVENT_EXPAND);
this.element[e]((e) => {
if (this.isEnabled() && this.switcher.isEnabled()) {
this._popupView();
this.fireEvent(Controller.EVENT_CHANGE, BI.Events.EXPAND, "", this.switcher);
this.fireEvent(Switcher.EVENT_EXPAND);
}
}, function () {
if (self.isEnabled() && self.switcher.isEnabled() && o.toggle) {
self._hideView();
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", self.switcher);
self.fireEvent(BI.Switcher.EVENT_COLLAPSE);
}, () => {
if (this.isEnabled() && this.switcher.isEnabled() && toggle) {
this._hideView();
this.fireEvent(Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", this.switcher);
this.fireEvent(Switcher.EVENT_COLLAPSE);
}
});
break;
default :
if (e) {
self.element.off(e + "." + self.getName()).on(e + "." + self.getName(), BI.debounce(function (e) {
if (self.switcher.element.__isMouseInBounds__(e)) {
if (self.isEnabled() && self.switcher.isEnabled()) {
o.toggle ? self._toggle() : self._popupView();
if (self.isExpanded()) {
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.switcher);
self.fireEvent(BI.Switcher.EVENT_EXPAND);
this.element.off(e + "." + this.getName()).on(e + "." + this.getName(), debounce((e) => {
if (this.switcher.element.__isMouseInBounds__(e)) {
if (this.isEnabled() && this.switcher.isEnabled()) {
toggle ? this._toggle() : this._popupView();
if (this.isExpanded()) {
this.fireEvent(Controller.EVENT_CHANGE, BI.Events.EXPAND, "", this.switcher);
this.fireEvent(Switcher.EVENT_EXPAND);
} else {
self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", self.switcher);
self.fireEvent(BI.Switcher.EVENT_COLLAPSE);
this.fireEvent(Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", this.switcher);
this.fireEvent(Switcher.EVENT_COLLAPSE);
}
}
}
@ -125,36 +142,36 @@ BI.Switcher = BI.inherit(BI.Widget, {
break;
}
});
},
}
_initSwitcher: function () {
this.switcher = BI.createWidget(this.options.el, {
_initSwitcher() {
this.switcher = createWidget(this.options.el, {
value: this.options.value,
});
},
}
_assertPopupView: function () {
var self = this, o = this.options;
_assertPopupView() {
const { popup, adapter, masker, value, direction } = this.options;
if (!this._created) {
this.popupView = BI.createWidget(o.popup, {
this.popupView = createWidget(popup, {
type: "bi.button_group",
element: o.adapter && BI.Maskers.create(this.getName(), o.adapter, BI.extend({ container: this }, o.masker)),
element: adapter && Maskers.create(this.getName(), adapter, extend({ container: this }, masker)),
cls: "switcher-popup",
layouts: [{
type: "bi.vertical",
hgap: 0,
vgap: 0,
}],
value: o.value,
value,
}, this);
this.popupView.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
this.popupView.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
if (type === BI.Events.CLICK) {
self.fireEvent(BI.Switcher.EVENT_CHANGE, value, obj);
this.fireEvent(Switcher.EVENT_CHANGE, value, obj);
}
});
if (o.direction !== BI.Direction.Custom && !o.adapter) {
BI.createWidget({
if (direction !== BI.Direction.Custom && !adapter) {
createWidget({
type: "bi.vertical",
scrolly: false,
element: this,
@ -164,133 +181,120 @@ BI.Switcher = BI.inherit(BI.Widget, {
});
}
this._created = true;
BI.nextTick(function () {
self.fireEvent(BI.Switcher.EVENT_AFTER_INIT);
nextTick(() => {
this.fireEvent(Switcher.EVENT_AFTER_INIT);
});
}
},
}
_hideView: function () {
this.fireEvent(BI.Switcher.EVENT_BEFORE_HIDEVIEW);
var self = this, o = this.options;
o.adapter ? BI.Maskers.hide(self.getName()) : (self.popupView && self.popupView.setVisible(false));
BI.nextTick(function () {
o.adapter ? BI.Maskers.hide(self.getName()) : (self.popupView && self.popupView.setVisible(false));
self.element.removeClass(o.switcherClass);
self.fireEvent(BI.Switcher.EVENT_AFTER_HIDEVIEW);
_hideView() {
this.fireEvent(Switcher.EVENT_BEFORE_HIDEVIEW);
const { adapter, switcherClass } = this.options;
adapter ? Maskers.hide(this.getName()) : (this.popupView && this.popupView.setVisible(false));
nextTick(() => {
adapter ? Maskers.hide(this.getName()) : (this.popupView && this.popupView.setVisible(false));
this.element.removeClass(switcherClass);
this.fireEvent(Switcher.EVENT_AFTER_HIDEVIEW);
});
},
}
_popupView: function () {
var self = this, o = this.options;
_popupView() {
const { adapter, switcherClass } = this.options;
this._assertPopupView();
this.fireEvent(BI.Switcher.EVENT_BEFORE_POPUPVIEW);
o.adapter ? BI.Maskers.show(this.getName()) : self.popupView.setVisible(true);
BI.nextTick(function (name) {
o.adapter ? BI.Maskers.show(name) : self.popupView.setVisible(true);
self.element.addClass(o.switcherClass);
self.fireEvent(BI.Switcher.EVENT_AFTER_POPUPVIEW);
this.fireEvent(Switcher.EVENT_BEFORE_POPUPVIEW);
adapter ? Maskers.show(this.getName()) : this.popupView.setVisible(true);
nextTick((name) => {
adapter ? Maskers.show(name) : this.popupView.setVisible(true);
this.element.addClass(switcherClass);
this.fireEvent(Switcher.EVENT_AFTER_POPUPVIEW);
}, this.getName());
},
}
_populate: function () {
_populate() {
this._assertPopupView();
this.popupView.populate.apply(this.popupView, arguments);
},
}
populate: function (items) {
populate(items) {
this._populate.apply(this, arguments);
this.switcher.populate && this.switcher.populate.apply(this.switcher, arguments);
},
}
_setEnable: function (arg) {
BI.Switcher.superclass._setEnable.apply(this, arguments);
_setEnable(arg) {
super._setEnable(arguments);
!arg && this.isViewVisible() && this._hideView();
},
}
setValue: function (v) {
setValue(v) {
this.switcher.setValue(v);
if (BI.isNull(this.popupView)) {
if (isNull(this.popupView)) {
this.options.popup.value = v;
} else {
this.popupView.setValue(v);
}
},
}
getValue: function () {
if (BI.isNull(this.popupView)) {
getValue() {
if (isNull(this.popupView)) {
return this.options.popup.value;
} else {
return this.popupView.getValue();
}
},
}
setAdapter: function (adapter) {
setAdapter(adapter) {
this.options.adapter = adapter;
BI.Maskers.remove(this.getName());
},
Maskers.remove(this.getName());
}
isViewVisible: function () {
isViewVisible() {
return this.isEnabled() && this.switcher.isEnabled() &&
(this.options.adapter ? BI.Maskers.isVisible(this.getName()) : (this.popupView && this.popupView.isVisible()));
},
(this.options.adapter ? Maskers.isVisible(this.getName()) : (this.popupView && this.popupView.isVisible()));
}
isExpanded: function () {
isExpanded() {
return this.isViewVisible();
},
}
showView: function () {
showView() {
if (this.isEnabled() && this.switcher.isEnabled()) {
this._popupView();
}
},
}
hideView: function () {
hideView() {
this._hideView();
},
}
getView: function () {
getView() {
return this.popupView;
},
}
adjustView: function () {
this.isViewVisible() && BI.Maskers.show(this.getName());
},
adjustView() {
this.isViewVisible() && Maskers.show(this.getName());
}
getAllLeaves: function () {
getAllLeaves() {
return this.popupView && this.popupView.getAllLeaves();
},
}
getNodeById: function (id) {
getNodeById(id) {
if (this.switcher.attr("id") === id) {
return this.switcher;
}
return this.popupView && this.popupView.getNodeById(id);
},
}
getNodeByValue: function (value) {
getNodeByValue(value) {
if (this.switcher.getValue() === value) {
return this.switcher;
}
return this.popupView && this.popupView.getNodeByValue(value);
},
}
empty: function () {
empty() {
this.popupView && this.popupView.empty();
},
});
BI.Switcher.EVENT_EXPAND = "EVENT_EXPAND";
BI.Switcher.EVENT_COLLAPSE = "EVENT_COLLAPSE";
BI.Switcher.EVENT_TRIGGER_CHANGE = "EVENT_TRIGGER_CHANGE";
BI.Switcher.EVENT_CHANGE = "EVENT_CHANGE";
BI.Switcher.EVENT_AFTER_INIT = "EVENT_AFTER_INIT";
BI.Switcher.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW";
BI.Switcher.EVENT_AFTER_POPUPVIEW = "EVENT_AFTER_POPUPVIEW";
BI.Switcher.EVENT_BEFORE_HIDEVIEW = "EVENT_BEFORE_HIDEVIEW";
BI.Switcher.EVENT_AFTER_HIDEVIEW = "EVENT_AFTER_HIDEVIEW";
BI.shortcut("bi.switcher", BI.Switcher);
}
}

177
src/base/combination/tab.js

@ -1,10 +1,16 @@
/**
* Created by GUY on 2015/6/26.
*/
import { shortcut, Widget, Controller, ShowListener, extend, createWidget, isObject, each, isFunction, contains, any, isEqual } from "../../core";
BI.Tab = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.Tab.superclass._defaultConfig.apply(this, arguments), {
@shortcut()
export class Tab extends Widget {
static xtype = "bi.tab";
static EVENT_CHANGE = "EVENT_CHANGE";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-tab",
direction: "top", // top, bottom, left, right, custom
single: false, // 是不是单页面
@ -13,87 +19,87 @@ BI.Tab = BI.inherit(BI.Widget, {
},
showIndex: false,
tab: false,
cardCreator: function (v) {
return BI.createWidget();
cardCreator: (v) => {
return createWidget();
},
keepAlives: [],
});
},
render: function () {
var self = this, o = this.options;
if (BI.isObject(o.tab)) {
this.tab = BI.createWidget(this.options.tab, { type: "bi.button_group" });
this.tab.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) {
self.fireEvent(BI.Controller.EVENT_CHANGE, arguments);
}
render() {
const { tab, direction, logic, cardCreator } = this.options;
if (isObject(tab)) {
this.tab = createWidget(this.options.tab, { type: "bi.button_group" });
this.tab.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => {
this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args);
});
}
this.cardMap = {};
this.layout = BI.createWidget({
this.layout = createWidget({
type: "bi.card",
});
BI.createWidget(BI.extend({
createWidget(extend({
element: this,
}, BI.LogicFactory.createLogic(BI.LogicFactory.createLogicTypeByDirection(o.direction), BI.extend({}, o.logic, {
items: BI.LogicFactory.createLogicItemsByDirection(o.direction, this.tab, this.layout),
}, BI.LogicFactory.createLogic(BI.LogicFactory.createLogicTypeByDirection(direction), extend({}, logic, {
items: BI.LogicFactory.createLogicItemsByDirection(direction, this.tab, this.layout),
}))));
var listener = new BI.ShowListener({
const listener = new ShowListener({
eventObj: this.tab,
cardLayout: this.layout,
cardCreator: function (v) {
BI.Widget.execWithContext(self, function () {
self.cardMap[v] = o.cardCreator(v);
cardCreator: (v) => {
Widget.execWithContext(this, () => {
this.cardMap[v] = cardCreator(v);
});
return self.cardMap[v];
return this.cardMap[v];
},
afterCardShow: function (v) {
self._deleteOtherCards(v);
self.curr = v;
afterCardShow: (v) => {
this._deleteOtherCards(v);
this.curr = v;
},
});
listener.on(BI.ShowListener.EVENT_CHANGE, function (value) {
self.fireEvent(BI.Tab.EVENT_CHANGE, value, self);
listener.on(ShowListener.EVENT_CHANGE, (value) => {
this.fireEvent(Tab.EVENT_CHANGE, value, this);
});
},
_deleteOtherCards: function (currCardName) {
var self = this, o = this.options;
if (o.single === true) {
BI.each(this.cardMap, function (name, card) {
if (name !== (currCardName + "") && self._keepAlive(name) !== true) {
self.layout.deleteCardByName(name);
delete self.cardMap[name];
}
_deleteOtherCards(currCardName) {
const { single } = this.options;
if (single === true) {
each(this.cardMap, (name, card) => {
if (name !== (currCardName + "") && this._keepAlive(name) !== true) {
this.layout.deleteCardByName(name);
delete this.cardMap[name];
}
});
}
},
}
_assertCard: function (v) {
var self = this, o = this.options;
_assertCard(v) {
const { cardCreator } = this.options;
if (!this.layout.isCardExisted(v)) {
BI.Widget.execWithContext(this, function () {
self.cardMap[v] = o.cardCreator(v);
Widget.execWithContext(this, () => {
this.cardMap[v] = cardCreator(v);
});
this.layout.addCardByName(v, this.cardMap[v]);
}
},
}
_keepAlive: function (v) {
var o = this.options;
_keepAlive(v) {
const { keepAlives } = this.options;
return BI.isFunction(o.keepAlives) ? o.keepAlives(v) : BI.contains(o.keepAlives, v);
},
return isFunction(keepAlives) ? keepAlives(v) : contains(keepAlives, v);
}
created: function () {
var self = this, o = this.options;
created() {
const o = this.options;
let showIndex;
var showIndex;
if (BI.isFunction(o.showIndex)) {
showIndex = this.__watch(o.showIndex, function (context, newValue) {
self.setSelect(newValue);
if (isFunction(o.showIndex)) {
showIndex = this.__watch(o.showIndex, (context, newValue) => {
this.setSelect(newValue);
});
} else {
showIndex = o.showIndex;
@ -102,9 +108,9 @@ BI.Tab = BI.inherit(BI.Widget, {
if (showIndex !== false) {
this.setSelect(showIndex);
}
},
}
setSelect: function (v, action, callback) {
setSelect(v, action, callback) {
this.tab && this.tab.setValue(v);
this._assertCard(v);
this.layout.showCardByName(v, action, callback);
@ -112,69 +118,66 @@ BI.Tab = BI.inherit(BI.Widget, {
if (this.curr !== v) {
this.curr = v;
}
},
}
removeTab: function (cardname) {
var self = this;
BI.any(this.cardMap, function (name, card) {
if (BI.isEqual(name, (cardname + ""))) {
self.layout.deleteCardByName(name);
delete self.cardMap[name];
removeTab(cardname) {
any(this.cardMap, (name, card) => {
if (isEqual(name, (cardname + ""))) {
this.layout.deleteCardByName(name);
delete this.cardMap[name];
return true;
}
});
},
}
isCardExisted: function (cardName) {
isCardExisted(cardName) {
return this.layout.isCardExisted(cardName);
},
}
getSelect: function () {
getSelect() {
return this.curr;
},
}
getSelectedTab: function () {
getSelectedTab() {
return this.layout.getShowingCard();
},
}
getTab: function (v) {
getTab(v) {
this._assertCard(v);
return this.layout.getCardByName(v);
},
}
setValue: function (v) {
var card = this.layout.getShowingCard();
setValue(v) {
const card = this.layout.getShowingCard();
if (card) {
card.setValue(v);
}
},
}
getValue: function () {
var card = this.layout.getShowingCard();
getValue() {
const card = this.layout.getShowingCard();
if (card) {
return card.getValue();
}
},
}
populate: function () {
var card = this.layout.getShowingCard();
populate() {
const card = this.layout.getShowingCard();
if (card) {
return card.populate && card.populate.apply(card, arguments);
}
},
}
empty: function () {
empty() {
this.layout.deleteAllCard();
this.cardMap = {};
},
}
destroy: function () {
destroy() {
this.cardMap = {};
BI.Tab.superclass.destroy.apply(this, arguments);
},
});
BI.Tab.EVENT_CHANGE = "EVENT_CHANGE";
super.destroy(arguments);
}
BI.shortcut("bi.tab", BI.Tab);
}

142
src/base/combination/tree.button.js

@ -3,67 +3,74 @@
* @class BI.ButtonTree
* @extends BI.ButtonGroup
*/
import { shortcut, Widget, extend, isArray, each, isFunction, deepContains, concat, any, contains } from "../../core";
import { ButtonGroup } from "./group.button";
BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
_defaultConfig: function () {
return BI.extend(BI.ButtonTree.superclass._defaultConfig.apply(this, arguments), {
@shortcut()
export class ButtonTree extends ButtonGroup {
static xtype = "bi.button_tree";
static EVENT_CHANGE = "EVENT_CHANGE";
_defaultConfig() {
return extend(super._defaultConfig(arguments), {
baseCls: "bi-button-tree",
});
},
}
setNotSelectedValue: function (v) {
v = BI.isArray(v) ? v : [v];
BI.each(this.buttons, function (i, item) {
if (!BI.isFunction(item.setSelected)) {
setNotSelectedValue(v) {
v = isArray(v) ? v : [v];
each(this.buttons, (i, item) => {
if (!isFunction(item.setSelected)) {
item.setNotSelectedValue(v);
return;
}
if (BI.deepContains(v, item.getValue())) {
if (deepContains(v, item.getValue())) {
item.setSelected(false);
} else {
item.setSelected(true);
}
});
},
}
setEnabledValue: function (v) {
v = BI.isArray(v) ? v : [v];
BI.each(this.buttons, function (i, item) {
if (BI.isFunction(item.setEnabledValue)) {
setEnabledValue(v) {
v = isArray(v) ? v : [v];
each(this.buttons, (i, item) => {
if (isFunction(item.setEnabledValue)) {
item.setEnabledValue(v);
return;
}
if (BI.deepContains(v, item.getValue())) {
if (deepContains(v, item.getValue())) {
item.setEnable(true);
} else {
item.setEnable(false);
}
});
},
}
setValue: function (v) {
v = BI.isArray(v) ? v : [v];
BI.each(this.buttons, function (i, item) {
if (!BI.isFunction(item.setSelected)) {
setValue(v) {
v = isArray(v) ? v : [v];
each(this.buttons, (i, item) => {
if (!isFunction(item.setSelected)) {
item.setValue(v);
return;
}
if (BI.deepContains(v, item.getValue())) {
if (deepContains(v, item.getValue())) {
item.setSelected(true);
} else {
item.setSelected(false);
}
});
},
}
getNotSelectedValue: function () {
var v = [];
BI.each(this.buttons, function (i, item) {
if (item.isEnabled() && !BI.isFunction(item.setSelected)) {
v = BI.concat(v, item.getNotSelectedValue());
getNotSelectedValue() {
let v = [];
each(this.buttons, (i, item) => {
if (item.isEnabled() && !isFunction(item.setSelected)) {
v = concat(v, item.getNotSelectedValue());
return;
}
@ -73,13 +80,13 @@ BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
});
return v;
},
}
getValue: function () {
var v = [];
BI.each(this.buttons, function (i, item) {
if (item.isEnabled() && !BI.isFunction(item.setSelected)) {
v = BI.concat(v, item.getValue());
getValue() {
let v = [];
each(this.buttons, (i, item) => {
if (item.isEnabled() && !isFunction(item.setSelected)) {
v = concat(v, item.getValue());
return;
}
@ -89,12 +96,12 @@ BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
});
return v;
},
}
getSelectedButtons: function () {
var btns = [];
BI.each(this.buttons, function (i, item) {
if (item.isEnabled() && !BI.isFunction(item.setSelected)) {
getSelectedButtons() {
let btns = [];
each(this.buttons, (i, item) => {
if (item.isEnabled() && !isFunction(item.setSelected)) {
btns = btns.concat(item.getSelectedButtons());
return;
@ -105,12 +112,12 @@ BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
});
return btns;
},
}
getNotSelectedButtons: function () {
var btns = [];
BI.each(this.buttons, function (i, item) {
if (item.isEnabled() && !BI.isFunction(item.setSelected)) {
getNotSelectedButtons() {
let btns = [];
each(this.buttons, (i, item) => {
if (item.isEnabled() && !isFunction(item.setSelected)) {
btns = btns.concat(item.getNotSelectedButtons());
return;
@ -121,13 +128,13 @@ BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
});
return btns;
},
}
// 获取所有的叶子节点
getAllLeaves: function () {
var leaves = [];
BI.each(this.buttons, function (i, item) {
if (item.isEnabled() && !BI.isFunction(item.setSelected)) {
getAllLeaves() {
let leaves = [];
each(this.buttons, (i, item) => {
if (item.isEnabled() && !isFunction(item.setSelected)) {
leaves = leaves.concat(item.getAllLeaves());
return;
@ -138,13 +145,13 @@ BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
});
return leaves;
},
}
getIndexByValue: function (value) {
var index = -1;
BI.any(this.buttons, function (i, item) {
var vs = item.getValue();
if (item.isEnabled() && (vs === value || BI.contains(vs, value))) {
getIndexByValue(value) {
let index = -1;
any(this.buttons, (i, item) => {
const vs = item.getValue();
if (item.isEnabled() && (vs === value || contains(vs, value))) {
index = i;
return true;
@ -152,17 +159,17 @@ BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
});
return index;
},
}
getNodeById: function (id) {
var node;
BI.any(this.buttons, function (i, item) {
getNodeById(id) {
let node;
any(this.buttons, (i, item) => {
if (item.isEnabled()) {
if (item.attr("id") === id) {
node = item;
return true;
} else if (BI.isFunction(item.getNodeById)) {
} else if (isFunction(item.getNodeById)) {
node = item.getNodeById(id);
if (node) {
return true;
@ -172,13 +179,13 @@ BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
});
return node;
},
}
getNodeByValue: function (value) {
var node;
BI.any(this.buttons, function (i, item) {
getNodeByValue(value) {
let node;
any(this.buttons, (i, item) => {
if (item.isEnabled()) {
if (BI.isFunction(item.getNodeByValue)) {
if (isFunction(item.getNodeByValue)) {
node = item.getNodeByValue(value);
if (node) {
return true;
@ -192,8 +199,5 @@ BI.ButtonTree = BI.inherit(BI.ButtonGroup, {
});
return node;
},
});
BI.ButtonTree.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.button_tree", BI.ButtonTree);
}
}

54
src/base/foundation/message.js

@ -3,12 +3,14 @@
* 弹出提示消息框用于模拟阻塞操作通过回调函数实现
* @class BI.Msg
*/
BI.Msg = ((function () {
var $mask, $pop;
import { Widget, isString, isNull, isFunction, createWidget, remove, each } from "../../core"
var messageShows = [];
export const Msg = ((() => {
let $mask, $pop;
var toastStack = [];
let messageShows = [];
let toastStack = [];
return {
alert: function (title, message, callback) {
@ -21,13 +23,13 @@ BI.Msg = ((function () {
// BI.Msg.prompt(title, message, value, callback, min_width);
},
toast: function (message, options, context) {
BI.isString(options) && (options = { level: options });
isString(options) && (options = { level: options });
options = options || {};
context = context || BI.Widget._renderEngine.createElement("body");
var level = options.level || "common";
var autoClose = BI.isNull(options.autoClose) ? true : options.autoClose;
var callback = BI.isFunction(options.callback) ? options.callback : BI.emptyFn;
var toast = BI.createWidget({
context = context || Widget._renderEngine.createElement("body");
const level = options.level || "common";
const autoClose = isNull(options.autoClose) ? true : options.autoClose;
const callback = isFunction(options.callback) ? options.callback : BI.emptyFn;
const toast = createWidget({
type: "bi.toast",
cls: "bi-message-animate bi-message-leave",
level: level,
@ -37,9 +39,9 @@ BI.Msg = ((function () {
listeners: [{
eventName: BI.Toast.EVENT_DESTORY,
action: function () {
BI.remove(toastStack, toast.element);
var _height = BI.SIZE_CONSANTS.TOAST_TOP;
BI.each(toastStack, function (i, element) {
remove(toastStack, toast.element);
let _height = BI.SIZE_CONSANTS.TOAST_TOP;
each(toastStack, function (i, element) {
element.css({ "top": _height });
_height += element.outerHeight() + 10;
});
@ -47,11 +49,11 @@ BI.Msg = ((function () {
},
}],
});
var height = BI.SIZE_CONSANTS.TOAST_TOP;
BI.each(toastStack, function (i, element) {
const height = BI.SIZE_CONSANTS.TOAST_TOP;
each(toastStack, function (i, element) {
height += element.outerHeight() + 10;
});
BI.createWidget({
createWidget({
type: "bi.absolute",
element: context,
items: [{
@ -75,7 +77,7 @@ BI.Msg = ((function () {
};
},
_show: function (hasCancel, title, message, callback) {
BI.isNull($mask) && ($mask = BI.Widget._renderEngine.createElement("<div class=\"bi-z-index-mask\">").css({
isNull($mask) && ($mask = Widget._renderEngine.createElement("<div class=\"bi-z-index-mask\">").css({
position: "absolute",
zIndex: BI.zIndex_tip - 2,
top: 0,
@ -84,7 +86,7 @@ BI.Msg = ((function () {
bottom: 0,
opacity: 0.5,
}).appendTo("body"));
$pop = BI.Widget._renderEngine.createElement("<div class=\"bi-message-depend\">").css({
$pop = Widget._renderEngine.createElement("<div class=\"bi-message-depend\">").css({
position: "absolute",
zIndex: BI.zIndex_tip - 1,
top: 0,
@ -100,7 +102,7 @@ BI.Msg = ((function () {
$mask = null;
}
}
var controlItems = [];
let controlItems = [];
if (hasCancel === true) {
controlItems.push({
el: {
@ -109,7 +111,7 @@ BI.Msg = ((function () {
level: "ignore",
handler: function () {
close();
if (BI.isFunction(callback)) {
if (isFunction(callback)) {
callback.apply(null, [false]);
}
},
@ -122,13 +124,13 @@ BI.Msg = ((function () {
text: BI.i18nText("BI-Basic_OK"),
handler: function () {
close();
if (BI.isFunction(callback)) {
if (isFunction(callback)) {
callback.apply(null, [true]);
}
},
},
});
var conf = {
const conf = {
element: $pop,
type: "bi.center_adapt",
items: [
@ -141,13 +143,13 @@ BI.Msg = ((function () {
this.element.keyup(function (e) {
if (e.keyCode === BI.KeyCode.ENTER) {
close();
if (BI.isFunction(callback)) {
if (isFunction(callback)) {
callback.apply(null, [true]);
}
} else if (e.keyCode === BI.KeyCode.ESCAPE) {
close();
if (hasCancel === true) {
if (BI.isFunction(callback)) {
if (isFunction(callback)) {
callback.apply(null, [false]);
}
}
@ -183,7 +185,7 @@ BI.Msg = ((function () {
// height: 50,
handler: function () {
close();
if (BI.isFunction(callback)) {
if (isFunction(callback)) {
callback.apply(null, [false]);
}
},
@ -228,7 +230,7 @@ BI.Msg = ((function () {
],
};
messageShows[messageShows.length] = BI.createWidget(conf);
messageShows[messageShows.length] = createWidget(conf);
},
};
})());

100
src/base/index.js

@ -1,95 +1,31 @@
import Pane from "./1.pane";
import Single from "./single/0.single";
import Text from "./single/1.text";
import A from "./single/a/a";
import Tip from "./single/tip/0.tip";
import Toast from "./single/tip/tip.toast";
import Tooltip from "./single/tip/tip.tooltip";
import Drawer from "./layer/layer.drawer";
import { Popover, BarPopover } from "./layer/layer.popover";
import PopupView from "./layer/layer.popup";
import SearcherView from "./layer/layer.searcher";
import ListView from "./list/listview";
import VirtualGroupList from "./list/virtualgrouplist";
import VirtualList from "./list/virtuallist";
import { Pane } from "./1.pane";
import * as single from "./single";
import * as layer from "./layer";
import * as list from "./list";
import GridView from "./grid/grid";
import Pager from "./pager/pager";
import * as combination from "./combination";
import { Msg } from "./foundation/message";
import { BasicButton } from "./single/button/button.basic";
import { NodeButton } from "./single/button/button.node";
import { Button } from "./single/button/buttons/button";
import { IconButton } from "./single/button/buttons/button.icon";
import { ImageButton } from "./single/button/buttons/button.image";
import { TextButton } from "./single/button/buttons/button.text";
import { BlankIconIconTextItem } from "./single/button/listitem/blankiconicontextitem";
import { BlankIconTextIconItem } from "./single/button/listitem/blankicontexticonitem";
import { BlankIconTextItem } from "./single/button/listitem/blankicontextitem";
import { IconTextIconItem } from "./single/button/listitem/icontexticonitem";
import { IconTextItem } from "./single/button/listitem/icontextitem";
import { TextIconItem } from "./single/button/listitem/texticonitem";
import { TextItem } from "./single/button/listitem/textitem";
import { IconTextIconNode } from "./single/button/node/icontexticonnode";
import { IconTextNode } from "./single/button/node/icontextnode";
import { TextIconNode } from "./single/button/node/texticonnode";
import { TextNode } from "./single/button/node/textnode";
BI.extend(BI, {
NodeButton,
BasicButton,
Button,
IconButton,
ImageButton,
TextButton,
BlankIconIconTextItem,
BlankIconTextIconItem,
BlankIconTextItem,
IconTextIconItem,
IconTextItem,
TextIconItem,
TextItem,
IconTextIconNode,
IconTextNode,
TextIconNode,
TextNode,
Object.assign(BI, {
Pane,
Single,
Text,
A,
Tip,
Toast,
Tooltip,
Drawer,
Popover,
BarPopover,
PopupView,
SearcherView,
ListView,
VirtualGroupList,
VirtualList,
...layer,
...list,
...single,
GridView,
Pager,
...combination,
Msg,
});
export * from "./0.base";
export * from "./combination";
export * from "./layer";
export * from "./list";
export * from "./single";
export {
Pane,
Single,
Text,
A,
Tip,
Toast,
Tooltip,
Drawer,
Popover,
BarPopover,
PopupView,
SearcherView,
ListView,
VirtualGroupList,
VirtualList,
GridView,
Pager,
Msg,
}

4
src/base/layer/index.js

@ -0,0 +1,4 @@
export { Drawer } from "./layer.drawer";
export { Popover, BarPopover } from "./layer.popover";
export { PopupView } from "./layer.popup";
export { SearcherView } from "./layer.searcher";

2
src/base/layer/layer.drawer.js

@ -6,7 +6,7 @@
import { Widget, shortcut } from "../../core";
@shortcut()
export default class Drawer extends Widget {
export class Drawer extends Widget {
SIZE = {
SMALL: "small",
NORMAL: "normal",

2
src/base/layer/layer.popup.js

@ -6,7 +6,7 @@
import { Widget, shortcut } from "../../core";
@shortcut()
export default class PopupView extends Widget {
export class PopupView extends Widget {
_const = {
TRIANGLE_LENGTH: 12,
}

4
src/base/layer/layer.searcher.js

@ -7,10 +7,10 @@
*/
import { shortcut } from "../../core";
import Pane from "../1.pane";
import { Pane } from "../1.pane";
@shortcut()
export default class SearcherView extends Pane {
export class SearcherView extends Pane {
static xtype = "bi.searcher_view";
static EVENT_CHANGE = "EVENT_CHANGE";

3
src/base/list/index.js

@ -0,0 +1,3 @@
export { ListView } from "./listview";
export { VirtualGroupList } from "./virtualgrouplist";
export { VirtualList } from "./virtuallist";

2
src/base/list/listview.js

@ -7,7 +7,7 @@
*/
import { Widget, shortcut } from "../../core";
@shortcut()
export default class ListView extends Widget {
export class ListView extends Widget {
props() {
return {
baseCls: "bi-list-view",

2
src/base/list/virtualgrouplist.js

@ -8,7 +8,7 @@
import { Widget, shortcut } from "../../core";
@shortcut()
export default class VirtualGroupList extends Widget {
export class VirtualGroupList extends Widget {
props() {
return {
baseCls: "bi-virtual-group-list",

2
src/base/list/virtuallist.js

@ -8,7 +8,7 @@
import { Widget, shortcut } from "../../core";
@shortcut()
export default class VirtualList extends Widget {
export class VirtualList extends Widget {
props() {
return {
baseCls: "bi-virtual-list",

2
src/base/single/0.single.js

@ -14,7 +14,7 @@ import { Widget, shortcut } from "../../core";
import { Tooltips } from "../0.base";
@shortcut()
export default class Single extends Widget {
export class Single extends Widget {
static xtype = "bi.single";
_defaultConfig() {

6
src/base/single/1.text.js

@ -3,11 +3,11 @@
* @class BI.Text
* @extends BI.Single
*/
import { shortcut } from "../../core/decorator";
import { Single } from "../index";
import { shortcut } from "../../core";
import { Single } from "./0.single";
@shortcut()
export default class Text extends Single {
export class Text extends Single {
static xtype = "bi.text";
props = {

4
src/base/single/a/a.js

@ -7,9 +7,9 @@
* @abstract
*/
import { shortcut } from "../../../core";
import Text from "../1.text";
import { Text } from "../1.text";
@shortcut()
export default class A extends Text {
export class A extends Text {
static xtype = "bi.a";
_defaultConfig() {

2
src/base/single/button/button.basic.js

@ -1,4 +1,4 @@
import Single from "../0.single"
import { Single } from "../0.single"
import { emptyFn, shortcut, extend, isFunction, createWidget, Widget, isObject, Controller } from "../../../core"
/**

17
src/base/single/button/index.js

@ -0,0 +1,17 @@
export { BasicButton } from "./button.basic";
export { NodeButton } from "./button.node";
export { Button } from "./buttons/button";
export { IconButton } from "./buttons/button.icon";
export { ImageButton } from "./buttons/button.image";
export { TextButton } from "./buttons/button.text";
export { BlankIconIconTextItem } from "./listitem/blankiconicontextitem";
export { BlankIconTextIconItem } from "./listitem/blankicontexticonitem";
export { BlankIconTextItem } from "./listitem/blankicontextitem";
export { IconTextIconItem } from "./listitem/icontexticonitem";
export { IconTextItem } from "./listitem/icontextitem";
export { TextIconItem } from "./listitem/texticonitem";
export { TextItem } from "./listitem/textitem";
export { IconTextIconNode } from "./node/icontexticonnode";
export { IconTextNode } from "./node/icontextnode";
export { TextIconNode } from "./node/texticonnode";
export { TextNode } from "./node/textnode";

5
src/base/single/index.js

@ -0,0 +1,5 @@
export { Single } from "./0.single";
export { Text } from "./1.text";
export { A } from "./a/a";
export * from "./tip";
export * from "./button"

4
src/base/single/tip/0.tip.js

@ -7,8 +7,8 @@
* @abstract
*/
import Single from "../0.single";
export default class Tip extends Single {
import { Single } from "../0.single";
export class Tip extends Single {
_defaultConfig() {
const conf = super._defaultConfig(arguments);
return BI.extend(conf, {

3
src/base/single/tip/index.js

@ -0,0 +1,3 @@
export { Tip } from "./0.tip";
export { Toast } from "./tip.toast";
export { Tooltip } from "./tip.tooltip";

4
src/base/single/tip/tip.toast.js

@ -7,9 +7,9 @@
*/
import { shortcut } from "../../../core";
import Tip from "./0.tip";
import { Tip } from "./0.tip";
@shortcut()
export default class Toast extends Tip {
export class Toast extends Tip {
_const= {
closableMinWidth: 146,
minWidth: 100,

4
src/base/single/tip/tip.tooltip.js

@ -7,9 +7,9 @@
*/
import { shortcut } from "../../../core";
import Tip from "./0.tip";
import { Tip } from "./0.tip";
@shortcut()
export default class Tooltip extends Tip {
export class Tooltip extends Tip {
_const = {
hgap: 8,
vgap: 4,

145
src/core/2.base.js

@ -139,26 +139,14 @@ export function trans2Element(widgets) {
return map(widgets, (i, wi) => wi.element);
}
// Utility
BI._.extend(BI, {
assert,
warn,
UUID,
isWidget,
createWidgets,
createItems,
packageItems,
formatEL,
stripEL,
trans2Element,
});
// 集合相关方法
BI._.each(["where", "findWhere", "invoke", "pluck", "shuffle", "sample", "toArray", "size"], function (name) {
BI[name] = _apply(name);
});
BI._.each(["get", "set", "each", "map", "reduce", "reduceRight", "find", "filter", "reject", "every", "all", "some", "any", "max", "min",
"sortBy", "groupBy", "indexBy", "countBy", "partition", "clamp"], function (name) {
BI._.each([
"get", "set", "each", "map", "reduce", "reduceRight", "find", "filter", "reject", "every", "all", "some", "any", "max", "min",
"sortBy", "groupBy", "indexBy", "countBy", "partition", "clamp"
], function (name) {
if (name === "any") {
BI[name] = _applyFunc("some");
} else {
@ -382,30 +370,11 @@ export function int2Abc(num) {
return str;
}
BI._.extend(BI, {
count,
inverse,
firstKey,
lastKey,
firstObject,
lastObject,
concat,
backEach,
backAny,
backEvery,
backFindKey,
backFind,
remove,
removeAt,
string2Array,
array2String,
abc2Int,
int2Abc,
});
// 数组相关的方法
BI._.each(["first", "initial", "last", "rest", "compact", "flatten", "without", "union", "intersection",
"difference", "zip", "unzip", "object", "indexOf", "lastIndexOf", "sortedIndex", "range", "take", "takeRight", "uniqBy"], function (name) {
BI._.each([
"first", "initial", "last", "rest", "compact", "flatten", "without", "union", "intersection",
"difference", "zip", "unzip", "object", "indexOf", "lastIndexOf", "sortedIndex", "range", "take", "takeRight", "uniqBy"
], function (name) {
BI[name] = _apply(name);
});
BI._.each(["findIndex", "findLastIndex"], function (name) {
@ -489,18 +458,13 @@ export function uniq(array, isSorted, iteratee, context) {
return uniq.call(BI._, array, isSorted, iteratee, context);
}
BI._.extend(BI, {
makeArray,
makeObject,
makeArrayByArray,
uniq,
});
// 对象相关方法
BI._.each(["keys", "allKeys", "values", "pairs", "invert", "create", "functions", "extend", "extendOwn",
BI._.each([
"keys", "allKeys", "values", "pairs", "invert", "create", "functions", "extend", "extendOwn",
"defaults", "clone", "property", "propertyOf", "matcher", "isEqual", "isMatch", "isEmpty",
"isElement", "isNumber", "isString", "isArray", "isObject", "isPlainObject", "isArguments", "isFunction", "isFinite",
"isBoolean", "isDate", "isRegExp", "isError", "isNaN", "isUndefined", "zipObject", "cloneDeep"], function (name) {
"isBoolean", "isDate", "isRegExp", "isError", "isNaN", "isUndefined", "zipObject", "cloneDeep"
], function (name) {
BI[name] = _apply(name);
});
export const keys = BI.keys;
@ -646,26 +610,9 @@ export function isPromise(obj) {
return !!obj && (isObject(obj) || isFunction(obj)) && isFunction(obj.then);
}
BI._.extend(BI, {
inherit,
init,
has,
freeze,
isKey,
isCapitalEqual,
isWidthOrHeight,
isNotNull,
isNull,
isEmptyArray,
isNotEmptyArray,
isEmptyObject,
isNotEmptyObject,
isWindow,
isPromise,
});
export const deepClone = BI._.cloneDeep;
export const deepExtend = BI._.deepExtend;
export function isDeepMatch(object, attrs) {
let attrsKeys = keys(attrs), length = attrsKeys.length;
if (object == null) {
@ -774,20 +721,6 @@ export function deepDiff(object, other) {
return result;
}
// deep方法
BI._.extend(BI, {
deepClone: BI._.cloneDeep,
deepExtend: BI._.merge,
isDeepMatch,
contains,
deepContains,
deepIndexOf,
deepRemove,
deepWithout,
deepUnique,
deepDiff,
});
// 通用方法
BI._.each(["uniqueId", "result", "chain", "iteratee", "unescape", "before", "after", "chunk"], function (name) {
BI[name] = function () {
@ -886,8 +819,6 @@ export const nextTick = (function () {
};
})();
BI._.extend(BI, { nextTick });
// 数字相关方法
BI._.each(["random"], function (name) {
BI[name] = _apply(name);
@ -978,22 +909,6 @@ export function average(array, iteratee, context) {
return sumResult / array.length;
}
BI._.extend(BI, {
parseInt,
parseSafeInt,
parseFloat,
isNaturalNumber,
isPositiveInteger,
isNegativeInteger,
isInteger,
isNumeric,
isFloat,
isOdd,
isEven,
sum,
average,
});
export function trim() {
return BI._.trim.apply(BI._, arguments);
}
@ -1119,25 +1034,6 @@ export function format(format) {
return format.replace(/\{(\d+)\}/g, (m, i) => args[i]);
}
// 字符串相关方法
BI._.extend(BI, {
trim,
toUpperCase,
toLowerCase,
isEndWithBlank,
isLiteral,
stripQuotes,
camelize,
hyphenate,
isNotEmptyString,
isEmptyString,
encrypt,
decrypt,
escape,
leftPad,
format,
});
/**
* 是否是闰年
* @param year
@ -1351,9 +1247,8 @@ export function parseDateTime(str, fmt) {
return today;
}
export function getDate() {
const length = arguments.length;
const args = arguments;
export function getDate(...args) {
const length = args.length;
let dt;
switch (length) {
// new Date()
@ -1448,15 +1343,5 @@ export function getTime() {
return dt.getTime() - BI.timeZone - new Date().getTimezoneOffset() * 60000;
}
return dt.getTime();
}
// 日期相关方法
BI._.extend(BI, {
isLeapYear,
checkDateVoid,
checkDateLegal,
parseDateTime,
getDate,
getTime,
});

6
src/core/3.ob.js

@ -1,4 +1,4 @@
import { isFunction, isArray, isObject, isArguments, reduce, bind, extend } from "./2.base";
import { isFunction, isArray, isObject, isArguments, reduce, bind } from "./2.base";
function obExtend() {
let target = arguments[0] || {}, length = arguments.length, i = 1, name, copy;
@ -26,7 +26,7 @@ function obExtend() {
return target;
}
export default class OB {
export class OB {
// props = {};
// init = null;
@ -215,5 +215,3 @@ export default class OB {
this.purgeListeners();
}
}
extend(BI, { OB });

16
src/core/4.widget.js

@ -7,7 +7,7 @@
*/
import { isFunction, isArray, each, extend, isPlainObject, isNull, uniqueId, isWidget, isWidthOrHeight, isKey, remove, any, isNotNull } from "./2.base";
import OB from "./3.ob";
import { OB } from "./3.ob";
import { Providers, _lazyCreateWidget } from "./5.inject";
const cancelAnimationFrame =
@ -35,7 +35,7 @@ function callLifeHook(self, life) {
});
}
export default class Widget extends OB {
export class Widget extends OB {
_defaultConfig () {
return extend(super._defaultConfig(), {
root: false,
@ -1079,15 +1079,3 @@ export function mount(widget, container, predicate, hydrate) {
}
return widget._mount(true, false, false, predicate);
}
extend(BI, {
Widget,
useStore,
useContext,
watch,
onBeforeMount,
onMounted,
onBeforeUnmount,
onUnmounted,
mount,
});

26
src/core/5.inject.js

@ -1,6 +1,6 @@
import { isFunction, isNull, isNotNull, isArray, each, isWidget, extend, init, isEmpty, remove } from "./2.base";
import OB from "./3.ob";
import Widget from "./4.widget"
import { OB } from "./3.ob";
import { Widget } from "./4.widget"
let moduleInjection = {}, moduleInjectionMap = {
components: {},
@ -39,7 +39,6 @@ export function module(xtype, cls) {
return () => Modules.getModule(xtype);
}
BI.module = BI.module || module;
let constantInjection = {};
export function constant(xtype, cls) {
@ -51,7 +50,6 @@ export function constant(xtype, cls) {
return () => Constants.getConstant(xtype);
}
BI.constant = BI.constant || constant;
let modelInjection = {};
export function model(xtype, cls) {
@ -63,7 +61,6 @@ export function model(xtype, cls) {
return (config) => Models.getModel(xtype, config);
}
BI.model = BI.model || model;
let storeInjection = {};
export function store(xtype, cls) {
@ -75,7 +72,6 @@ export function store(xtype, cls) {
return (config) => Stores.getStore(xtype, config);
}
BI.store = BI.store || store;
let serviceInjection = {};
export function service(xtype, cls) {
@ -87,7 +83,6 @@ export function service(xtype, cls) {
return (config) => Services.getService(xtype, config);
}
BI.service = BI.service || service;
let providerInjection = {};
export function provider(xtype, cls) {
@ -99,7 +94,6 @@ export function provider(xtype, cls) {
return (config) => Providers.getProvider(xtype, config);
}
BI.provider = BI.provider || provider;
let configFunctions = OB.configFunctions = {};
const runConfigFunction = function (type, configFn) {
@ -200,12 +194,10 @@ export function config(type, configFn, opt) {
return runConfigFunction(type, configFn);
}
}
BI.config = BI.config || config;
export function getReference(type, fn) {
return BI.Plugin.registerObject(type, fn);
}
BI.getReference = BI.getReference || getReference;
let actions = {};
let globalAction = [];
@ -227,7 +219,6 @@ export function action(type, actionFn) {
}
};
}
BI.action = BI.action || action;
let points = {};
export function point(type, action, pointFn, after) {
@ -242,7 +233,6 @@ export function point(type, action, pointFn, after) {
}
points[type][action][after ? "after" : "before"].push(pointFn);
}
BI.point = BI.point || point;
export const Modules = {
getModule: function (type) {
@ -255,7 +245,6 @@ export const Modules = {
return moduleInjection;
}
}
BI.Modules = BI.Modules || Modules;
export const Constants = {
getConstant: function (type) {
@ -266,7 +255,6 @@ export const Constants = {
return isFunction(constantInjection[type]) ? constantInjection[type]() : constantInjection[type];
}
}
BI.Constants = BI.Constants || Constants;
const callPoint = function (inst, types) {
types = isArray(types) ? types : [types];
@ -319,7 +307,6 @@ export const Models = {
return inst;
}
}
BI.Models = BI.Models || Models;
let stores = {};
export const Stores = {
@ -338,7 +325,6 @@ export const Stores = {
return inst;
}
}
BI.Stores = BI.Stores || Stores;
let services = {};
export const Services = {
@ -354,7 +340,6 @@ export const Services = {
return services[type];
}
}
BI.Services = BI.Services || Services;
let providers = {},
providerInstance = {};
@ -373,7 +358,6 @@ export const Providers = {
return providerInstance[type];
}
}
BI.Providers = BI.Providers || Providers;
export const Actions = {
runAction: function (type, event, config) {
@ -396,7 +380,6 @@ export const Actions = {
});
}
}
BI.Actions = BI.Actions || Actions;
let kv = {};
export function shortcut(xtype, cls) {
@ -408,7 +391,6 @@ export function shortcut(xtype, cls) {
}
kv[xtype] = cls;
}
BI.shortcut = BI.component = BI.shortcut || shortcut;
// 根据配置属性生成widget
const createRealWidget = function (config, context, lazy) {
@ -496,18 +478,15 @@ export function createWidget(item, options, context, lazy) {
}
throw new Error("组件:无法根据item创建组件", item);
}
BI.createWidget = BI.createWidget || createWidget;
export function _lazyCreateWidget (item, options, context) {
return createWidget(item, options, context, true);
}
BI._lazyCreateWidget = BI._lazyCreateWidget || _lazyCreateWidget;
export function createElement() {
const widget = createWidget.apply(this, arguments);
return widget.element;
}
BI.createElement = BI.createElement || createElement;
export function getResource(type, config) {
if (isNotNull(constantInjection[type])) {
@ -527,4 +506,3 @@ export function getResource(type, config) {
}
throw new Error("未知类型: [" + type + "] 未定义");
}
BI.getResource = BI.getResource || getResource;

4
src/core/action/action.js

@ -5,8 +5,8 @@
* @extends BI.OB
* @abstract
*/
import OB from "../3.ob";
export default class Action extends OB {
import { OB } from "../3.ob";
export class Action extends OB {
props = {
src: null,
tar: null

4
src/core/action/action.show.js

@ -4,8 +4,8 @@
* @class BI.ShowAction
* @extends BI.Action
*/
import Action from "./action";
export default class ShowAction extends Action {
import { Action } from "./action";
export class ShowAction extends Action {
actionPerformed(src, tar, callback) {
tar = tar || this.options.tar;
tar.setVisible(true);

2
src/core/action/index.js

@ -0,0 +1,2 @@
export { Action } from "./action";
export { ShowAction } from "./action.show";

4
src/core/behavior/0.behavior.js

@ -20,8 +20,8 @@ BI.BehaviorFactory = {
* @extends BI.OB
*/
import OB from "../3.ob";
export default class Behavior extends OB {
import { OB } from "../3.ob";
export class Behavior extends OB {
_defaultConfig() {
return BI.extend(super._defaultConfig(arguments), {
rule: () => true

4
src/core/behavior/behavior.highlight.js

@ -4,8 +4,8 @@
* @class BI.HighlightBehavior
* @extends BI.Behavior
*/
import Behavior from "./0.behavior";
export default class HighlightBehavior extends Behavior {
import { Behavior } from "./0.behavior";
export class HighlightBehavior extends Behavior {
doBehavior(items) {
const args = Array.prototype.slice.call(arguments, 1),
o = this.options;

4
src/core/behavior/behavior.redmark.js

@ -4,8 +4,8 @@
* @class BI.RedMarkBehavior
* @extends BI.Behavior
*/
import Behavior from "./0.behavior";
export default class RedMarkBehavior extends Behavior {
import { Behavior } from "./0.behavior";
export class RedMarkBehavior extends Behavior {
doBehavior(items) {
const args = Array.prototype.slice.call(arguments, 1),
o = this.options;

3
src/core/behavior/index.js

@ -0,0 +1,3 @@
export { Behavior } from "./0.behavior";
export { HighlightBehavior } from "./behavior.highlight";
export { RedMarkBehavior } from "./behavior.redmark";

4
src/core/controller/0.controller.js

@ -6,7 +6,7 @@
* @extends BI.OB
* @abstract
*/
import OB from "../3.ob";
export default class Controller extends OB {
import { OB } from "../3.ob";
export class Controller extends OB {
static EVENT_CHANGE = "__EVENT_CHANGE__";
}

4
src/core/controller/controller.broadcast.js

@ -4,8 +4,8 @@
* Created by GUY on 2015/12/23.
* @class
*/
import Controller from "./0.controller";
export default class BroadcastController extends Controller {
import { Controller } from "./0.controller";
export class BroadcastController extends Controller {
init() {
this._broadcasts = {};
}

4
src/core/controller/controller.bubbles.js

@ -5,8 +5,8 @@
* Created by GUY on 2015/8/21.
* @class
*/
import Controller from "./0.controller";
export default class BubblesController extends Controller {
import { Controller } from "./0.controller";
export class BubblesController extends Controller {
init() {
this.storeBubbles = {};
this.storePoppers = {};

4
src/core/controller/controller.drawer.js

@ -4,8 +4,8 @@
* @class BI.popoverController
* @extends BI.Controller
*/
import Controller from "./0.controller";
export default class DrawerController extends Controller {
import { Controller } from "./0.controller";
export class DrawerController extends Controller {
constructor() {
super();
this._constructor();

4
src/core/controller/controller.layer.js

@ -4,8 +4,8 @@
* Created by GUY on 2015/6/24.
* @class
*/
import Controller from "./0.controller";
export default class LayerController extends Controller {
import { Controller } from "./0.controller";
export class LayerController extends Controller {
constructor() {
super();
this._constructor();

4
src/core/controller/controller.masker.js

@ -4,8 +4,8 @@
* Created by GUY on 2015/6/24.
* @class
*/
import LayerController from "./controller.layer";
export default class MaskersController extends LayerController {
import { LayerController } from "./controller.layer";
export class MaskersController extends LayerController {
init() {
super.init(arguments);
this.zindex = BI.zIndex_masker;

4
src/core/controller/controller.popover.js

@ -4,8 +4,8 @@
* @class BI.popoverController
* @extends BI.Controller
*/
import Controller from "./0.controller";
export default class PopoverController extends Controller {
import { Controller } from "./0.controller";
export class PopoverController extends Controller {
constructor() {
super();
this._constructor();

4
src/core/controller/controller.resizer.js

@ -4,8 +4,8 @@
* Created by GUY on 2015/6/24.
* @class
*/
import Controller from "./0.controller";
export default class ResizeController extends Controller {
import { Controller } from "./0.controller";
export class ResizeController extends Controller {
init() {
this.resizerManger = {};

4
src/core/controller/controller.tooltips.js

@ -6,8 +6,8 @@
* @class BI.TooltipsController
* @extends BI.Controller
*/
import Controller from "./0.controller";
export default class TooltipsController extends Controller {
import { Controller } from "./0.controller";
export class TooltipsController extends Controller {
init() {
this.tooltipsManager = {};
this.showingTips = {};// 存储正在显示的tooltip

9
src/core/controller/index.js

@ -0,0 +1,9 @@
export { Controller } from "./0.controller";
export { BroadcastController } from "./controller.broadcast";
export { BubblesController } from "./controller.bubbles";
export { DrawerController } from "./controller.drawer";
export { LayerController } from "./controller.layer";
export { MaskersController } from "./controller.masker";
export { PopoverController } from "./controller.popover";
export { ResizeController } from "./controller.resizer";
export { TooltipsController } from "./controller.tooltips";

6
src/core/func/__test__/function.test.js

@ -8,7 +8,7 @@ describe("core-function-test", function () {
* test_author_lei.wang
*/
it("createDistinctName-支持字符串数组", function () {
var names = ["name", "name1"];
const names = ["name", "name1"];
expect(BI.Func.createDistinctName(names, "name")).to.equal("name2");
expect(BI.Func.createDistinctName(names, "name2")).to.equal("name2");
});
@ -17,8 +17,8 @@ describe("core-function-test", function () {
* test_author_lei.wang
*/
it("createDistinctName-支持对象数组数组", function () {
var names = [{ name: "name" }, { name: "name1" }];
const names = [{ name: "name" }, { name: "name1" }];
expect(BI.Func.createDistinctName(names, "name")).to.equal("name2");
expect(BI.Func.createDistinctName(names, "name2")).to.equal("name2");
});
});
});

1661
src/core/func/alias.js

File diff suppressed because it is too large Load Diff

29
src/core/func/array.js

@ -2,21 +2,18 @@
* 对数组对象的扩展
* @class Array
*/
BI._.extend(BI, {
export function pushArray(sArray, array) {
sArray.push(...array);
}
pushArray: function (sArray, array) {
for (var i = 0; i < array.length; i++) {
sArray.push(array[i]);
}
},
pushDistinct: function (sArray, obj) {
if (!BI.contains(sArray, obj)) {
sArray.push(obj);
}
},
pushDistinctArray: function (sArray, array) {
for (var i = 0, len = array.length; i < len; i++) {
BI.pushDistinct(sArray, array[i]);
}
export function pushDistinct(sArray, obj) {
if (sArray.indexOf(obj) !== -1) {
sArray.push(obj);
}
});
}
export function pushDistinctArray(sArray, array) {
for (let i = 0, len = array.length; i < len; i++) {
pushDistinct(sArray, array[i]);
}
}

615
src/core/func/date.js

@ -1,16 +1,14 @@
/** Constants used for time computations */
BI.Date = BI.Date || {};
BI.Date.SECOND = 1000;
BI.Date.MINUTE = 60 * BI.Date.SECOND;
BI.Date.HOUR = 60 * BI.Date.MINUTE;
BI.Date.DAY = 24 * BI.Date.HOUR;
BI.Date.WEEK = 7 * BI.Date.DAY;
import {getDate, getTime} from "../2.base";
// Monday first, etc.
BI.Date._FD = 1;
// short month names
BI.Date._SMN = [0,
const SECOND = 1000;
const MINUTE = 60 * SECOND;
const HOUR = 60 * MINUTE;
const DAY = 24 * HOUR;
const WEEK = 7 * DAY;
const _FD = 1;
const _SMN = [
0,
1,
2,
3,
@ -21,292 +19,361 @@ BI.Date._SMN = [0,
8,
9,
10,
11];
11
];
const _MD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const _OFFSET = [0, -1, -2, -3, -4, -5, -6]; // 实际上无论周几作为一周的第一天,周初周末都是在-6-0间做偏移,用一个数组就可以
/** Adds the number of days array to the Date object. */
BI.Date._MD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
export const Date = {
SECOND,
MINUTE,
HOUR,
DAY,
WEEK,
_FD,
_SMN,
_MD,
_OFFSET,
};
// 实际上无论周几作为一周的第一天,周初周末都是在-6-0间做偏移,用一个数组就可以
BI.Date._OFFSET = [0, -1, -2, -3, -4, -5, -6];
/**
* 获取时区
* @returns {String}
*/
export function getTimezone(date) {
return date.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
}
BI._.extend(BI, {
/**
* 获取时区
* @returns {String}
*/
getTimezone: function (date) {
return date.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
},
/**
* Returns the number of days in the current month
*/
export function getMonthDays(date, month = date.getMonth()) {
const year = date.getFullYear();
if (((0 === (year % 4)) && ((0 !== (year % 100)) || (0 === (year % 400)))) && month === 1) {
return 29;
}
return _MD[month];
}
/** Returns the number of days in the current month */
getMonthDays: function (date, month) {
var year = date.getFullYear();
if (typeof month === "undefined") {
month = date.getMonth();
}
if (((0 == (year % 4)) && ((0 != (year % 100)) || (0 == (year % 400)))) && month == 1) {
return 29;
}
return BI.Date._MD[month];
/**
* 获取每月的最后一天
* @returns {Date}
*/
export function getLastDateOfMont(date) {
return getDate(date.getFullYear(), date.getMonth(), getMonthDays(date));
}
},
/**
* 获取每月的最后一天
* @returns {Date}
*/
export function getLastDateOfMonth(date) {
return getDate(date.getFullYear(), date.getMonth(), getMonthDays(date));
}
/**
* 获取每月的最后一天
* @returns {Date}
*/
getLastDateOfMonth: function (date) {
return BI.getDate(date.getFullYear(), date.getMonth(), BI.getMonthDays(date));
},
/**
* Returns the number of day in the year.
* @param date
* @returns {number}
*/
export function getDayOfYear(date) {
const now = getDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
const then = getDate(date.getFullYear(), 0, 0, 0, 0, 0);
const time = now - then;
return Math.floor(time / DAY);
}
/** Returns the number of day in the year. */
getDayOfYear: function (date) {
var now = BI.getDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
var then = BI.getDate(date.getFullYear(), 0, 0, 0, 0, 0);
var time = now - then;
return Math.floor(time / BI.Date.DAY);
},
/** Returns the number of the week in year, as defined in ISO 8601. */
getWeekNumber: function (date) {
var d = BI.getDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
var week = d.getDay();
var startOfWeek = BI.StartOfWeek % 7;
var middleDay = (startOfWeek + 3) % 7;
middleDay = middleDay || 7;
// 偏移到周周首之前需要多少天
var offsetWeekStartCount = week < startOfWeek ? (7 + week - startOfWeek) : (week - startOfWeek);
var offsetWeekMiddleCount = middleDay < startOfWeek ? (7 + middleDay - startOfWeek) : (middleDay - startOfWeek);
d.setDate(d.getDate() - offsetWeekStartCount + offsetWeekMiddleCount);
var ms = d.valueOf();
d.setMonth(0);
d.setDate(1);
return Math.floor((ms - d.valueOf()) / (7 * 864e5)) + 1;
},
/**
* Returns the number of the week in year, as defined in ISO 8601.
* @param date
* @returns {number}
*/
export function getWeekNumber(date) {
const d = getDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
const week = d.getDay();
const startOfWeek = BI.StartOfWeek % 7;
let middleDay = (startOfWeek + 3) % 7;
middleDay = middleDay || 7;
// 偏移到周周首之前需要多少天
const offsetWeekStartCount = week < startOfWeek ? (7 + week - startOfWeek) : (week - startOfWeek);
const offsetWeekMiddleCount = middleDay < startOfWeek ? (7 + middleDay - startOfWeek) : (middleDay - startOfWeek);
d.setDate(d.getDate() - offsetWeekStartCount + offsetWeekMiddleCount);
const ms = d.valueOf();
d.setMonth(0);
d.setDate(1);
return Math.floor((ms - d.valueOf()) / (7 * 864e5)) + 1;
}
getQuarter: function (date) {
return Math.floor(date.getMonth() / 3) + 1;
},
export function getQuarter(date) {
return Math.floor(date.getMonth() / 3) + 1;
}
// 离当前时间多少天的时间
getOffsetDate: function (date, offset) {
return BI.getDate(BI.getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()) + offset * 864e5);
},
/**
* 离当前时间多少天的时间
* @param date
* @param offset
* @returns {Date}
*/
export function getOffsetDate(date, offset) {
return getDate(getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()) + offset * 864e5);
}
getOffsetQuarter: function (date, n) {
var dt = BI.getDate(BI.getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
var day = dt.getDate();
var monthDay = BI.getMonthDays(BI.getDate(dt.getFullYear(), dt.getMonth() + BI.parseInt(n) * 3, 1));
if (day > monthDay) {
day = monthDay;
}
dt.setDate(day);
dt.setMonth(dt.getMonth() + parseInt(n) * 3);
return dt;
},
export function getOffsetQuarter(date, n) {
const dt = getDate(getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
let day = dt.getDate();
const monthDay = BI.getMonthDays(getDate(dt.getFullYear(), dt.getMonth() + parseInt(n, 10) * 3, 1));
if (day > monthDay) {
day = monthDay;
}
dt.setDate(day);
dt.setMonth(dt.getMonth() + parseInt(n, 10) * 3);
return dt;
}
// 得到本季度的起始月份
getQuarterStartMonth: function (date) {
var quarterStartMonth = 0;
var nowMonth = date.getMonth();
if (nowMonth < 3) {
quarterStartMonth = 0;
}
if (2 < nowMonth && nowMonth < 6) {
quarterStartMonth = 3;
}
if (5 < nowMonth && nowMonth < 9) {
quarterStartMonth = 6;
}
if (nowMonth > 8) {
quarterStartMonth = 9;
}
return quarterStartMonth;
},
// 获得本季度的起始日期
getQuarterStartDate: function (date) {
return BI.getDate(date.getFullYear(), BI.getQuarterStartMonth(date), 1);
},
// 得到本季度的结束日期
getQuarterEndDate: function (date) {
var quarterEndMonth = BI.getQuarterStartMonth(date) + 2;
return BI.getDate(date.getFullYear(), quarterEndMonth, BI.getMonthDays(date, quarterEndMonth));
},
/**
* 得到本季度的起始月份
* @param date
* @returns {number}
*/
export function getQuarterStartMonth(date) {
let quarterStartMonth = 0;
const nowMonth = date.getMonth();
if (nowMonth < 3) {
quarterStartMonth = 0;
}
if (2 < nowMonth && nowMonth < 6) {
quarterStartMonth = 3;
}
if (5 < nowMonth && nowMonth < 9) {
quarterStartMonth = 6;
}
if (nowMonth > 8) {
quarterStartMonth = 9;
}
return quarterStartMonth;
}
// 指定日期n个月之前或之后的日期
getOffsetMonth: function (date, n) {
var dt = BI.getDate(BI.getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
var day = dt.getDate();
var monthDay = BI.getMonthDays(BI.getDate(dt.getFullYear(), dt.getMonth() + parseInt(n), 1));
if (day > monthDay) {
day = monthDay;
}
dt.setDate(day);
dt.setMonth(dt.getMonth() + parseInt(n));
return dt;
},
/**
* 获得本季度的起始日期
* @param date
* @returns {Date}
*/
export function getQuarterStartDate(date) {
return getDate(date.getFullYear(), getQuarterStartMonth(date), 1);
}
// 获得本周的起始日期
getWeekStartDate: function (date) {
var w = date.getDay();
var startOfWeek = BI.StartOfWeek % 7;
return BI.getOffsetDate(date, BI.Date._OFFSET[w < startOfWeek ? (7 + w - startOfWeek) : (w - startOfWeek)]);
},
// 得到本周的结束日期
getWeekEndDate: function (date) {
var w = date.getDay();
var startOfWeek = BI.StartOfWeek % 7;
return BI.getOffsetDate(date, BI.Date._OFFSET[w < startOfWeek ? (7 + w - startOfWeek) : (w - startOfWeek)] + 6);
},
/**
* 得到本季度的结束日期
* @param date
* @returns {Date}
*/
export function getQuarterEndDate(date) {
const quarterEndMonth = getQuarterStartMonth(date) + 2;
return getDate(date.getFullYear(), quarterEndMonth, getMonthDays(date));
}
getFullDayName: function (index) {
return [BI.i18nText("BI-Basic_Sunday"),
BI.i18nText("BI-Basic_Monday"),
BI.i18nText("BI-Basic_Tuesday"),
BI.i18nText("BI-Basic_Wednesday"),
BI.i18nText("BI-Basic_Thursday"),
BI.i18nText("BI-Basic_Friday"),
BI.i18nText("BI-Basic_Saturday"),
BI.i18nText("BI-Basic_Sunday")][index];
},
/**
* 指定日期n个月之前或之后的日期
* @param date
* @param n
* @returns {Date}
*/
export function getOffsetMonth(date, n) {
const dt = getDate(getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
let day = dt.getDate();
const monthDay = getMonthDays(getDate(dt.getFullYear(), dt.getMonth() + parseInt(n, 10), 1));
if (day > monthDay) {
day = monthDay;
}
dt.setDate(day);
dt.setMonth(dt.getMonth() + parseInt(n, 10));
return dt;
}
getShortDayName: function (index) {
return [BI.i18nText("BI-Basic_Simple_Sunday"),
BI.i18nText("BI-Basic_Simple_Monday"),
BI.i18nText("BI-Basic_Simple_Tuesday"),
BI.i18nText("BI-Basic_Simple_Wednesday"),
BI.i18nText("BI-Basic_Simple_Thursday"),
BI.i18nText("BI-Basic_Simple_Friday"),
BI.i18nText("BI-Basic_Simple_Saturday"),
BI.i18nText("BI-Basic_Simple_Sunday")][index];
},
/**
* 获得本周的起始日期
* @param date
* @returns {Date}
*/
export function getWeekStartDate(date) {
const w = date.getDay();
const startOfWeek = BI.StartOfWeek % 7;
return getOffsetDate(date, _OFFSET[w < startOfWeek ? (7 + w - startOfWeek) : (w - startOfWeek)]);
}
getMonthName: function (index) {
return [BI.i18nText("BI-Basic_January"),
BI.i18nText("BI-Basic_February"),
BI.i18nText("BI-Basic_March"),
BI.i18nText("BI-Basic_April"),
BI.i18nText("BI-Basic_May"),
BI.i18nText("BI-Basic_June"),
BI.i18nText("BI-Basic_July"),
BI.i18nText("BI-Basic_August"),
BI.i18nText("BI-Basic_September"),
BI.i18nText("BI-Basic_October"),
BI.i18nText("BI-Basic_November"),
BI.i18nText("BI-Basic_December")][index]
},
/**
* 得到本周的结束日期
* @param date
* @returns {Date}
*/
export function getWeekEndDate(date) {
const w = date.getDay();
const startOfWeek = BI.StartOfWeek % 7;
return getOffsetDate(date, _OFFSET[w < startOfWeek ? (7 + w - startOfWeek) : (w - startOfWeek)] + 6);
}
getQuarterName: function (index) {
return ["", BI.i18nText("BI-Quarter_1"),
BI.i18nText("BI-Quarter_2"),
BI.i18nText("BI-Quarter_3"),
BI.i18nText("BI-Quarter_4")][index];
},
export function getFullDayName(index) {
return [
BI.i18nText("BI-Basic_Sunday"),
BI.i18nText("BI-Basic_Monday"),
BI.i18nText("BI-Basic_Tuesday"),
BI.i18nText("BI-Basic_Wednesday"),
BI.i18nText("BI-Basic_Thursday"),
BI.i18nText("BI-Basic_Friday"),
BI.i18nText("BI-Basic_Saturday"),
BI.i18nText("BI-Basic_Sunday")
][index];
}
// 格式化打印日期
print: function (date, str) {
var m = date.getMonth();
var d = date.getDate();
var y = date.getFullYear();
var yWith4number = y + "";
while (yWith4number.length < 4) {
yWith4number = "0" + yWith4number;
}
var wn = BI.getWeekNumber(date);
var qr = BI.getQuarter(date);
var w = date.getDay();
var s = {};
var hr = date.getHours();
var pm = (hr >= 12);
var ir = (pm) ? (hr - 12) : hr;
var dy = BI.getDayOfYear(date);
if (ir == 0) {
ir = 12;
}
var min = date.getMinutes();
var sec = date.getSeconds();
s["%a"] = BI.getShortDayName(w); // abbreviated weekday name [FIXME: I18N]
s["%A"] = BI.getFullDayName(w); // full weekday name
s["%b"] = BI.Date._SMN[m]; // abbreviated month name [FIXME: I18N]
s["%B"] = BI.getMonthName(m); // full month name
// FIXME: %c : preferred date and time representation for the current locale
s["%C"] = 1 + Math.floor(y / 100); // the century number
s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
s["%e"] = d; // the day of the month (range 1 to 31)
// FIXME: %D : american date style: %m/%d/%y
// FIXME: %E, %F, %G, %g, %h (man strftime)
s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
s["%k"] = hr + ""; // hour, range 0 to 23 (24h format)
s["%l"] = ir + ""; // hour, range 1 to 12 (12h format)
s["%X"] = (m < 9) ? ("0" + (1 + m)) : (1 + m); // month, range 01 to 12
s["%x"] = m + 1; // month, range 1 to 12
s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
s["%n"] = "\n"; // a newline character
s["%p"] = pm ? "PM" : "AM";
s["%P"] = pm ? "pm" : "am";
// FIXME: %r : the time in am/pm notation %I:%M:%S %p
// FIXME: %R : the time in 24-hour notation %H:%M
s["%s"] = Math.floor(date.getTime() / 1000);
s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
s["%t"] = "\t"; // a tab character
// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON)
s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN)
// FIXME: %x : preferred date representation for the current locale without the time
// FIXME: %X : preferred time representation for the current locale without the date
s["%y"] = yWith4number.substr(2, 2); // year without the century (range 00 to 99)
s["%Y"] = yWith4number; // year with the century
s["%%"] = "%"; // a literal '%' character
s["%q"] = "0" + qr;
s["%Q"] = qr;
export function getShortDayName(index) {
return [
BI.i18nText("BI-Basic_Simple_Sunday"),
BI.i18nText("BI-Basic_Simple_Monday"),
BI.i18nText("BI-Basic_Simple_Tuesday"),
BI.i18nText("BI-Basic_Simple_Wednesday"),
BI.i18nText("BI-Basic_Simple_Thursday"),
BI.i18nText("BI-Basic_Simple_Friday"),
BI.i18nText("BI-Basic_Simple_Saturday"),
BI.i18nText("BI-Basic_Simple_Sunday")
][index];
}
var re = /%./g;
BI.isKhtml = BI.isKhtml || function () {
if(!_global.navigator) {
return false;
}
return /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
};
export function getMonthName(index) {
return [
BI.i18nText("BI-Basic_January"),
BI.i18nText("BI-Basic_February"),
BI.i18nText("BI-Basic_March"),
BI.i18nText("BI-Basic_April"),
BI.i18nText("BI-Basic_May"),
BI.i18nText("BI-Basic_June"),
BI.i18nText("BI-Basic_July"),
BI.i18nText("BI-Basic_August"),
BI.i18nText("BI-Basic_September"),
BI.i18nText("BI-Basic_October"),
BI.i18nText("BI-Basic_November"),
BI.i18nText("BI-Basic_December")
][index];
}
// 包含年周的格式化,ISO8601标准周的计数会影响年
if ((str.indexOf("%Y") !== -1 || str.indexOf("%y") !== -1) && (str.indexOf("%W") !== -1 || str.indexOf("%U") !== -1 || str.indexOf("%V") !== -1)) {
switch (wn) {
// 如果周数是1,但是当前却在12月,表示此周数为下一年的
case 1:
if (m === 11) {
s["%y"] = parseInt(s["%y"]) + 1;
s["%Y"] = parseInt(s["%Y"]) + 1;
}
break;
// 如果周数是53,但是当前却在1月,表示此周数为上一年的
case 53:
if (m === 0) {
s["%y"] = parseInt(s["%y"]) - 1;
s["%Y"] = parseInt(s["%Y"]) - 1;
}
break;
default:
break;
}
}
export function getQuarterName(index) {
return [
"",
BI.i18nText("BI-Quarter_1"),
BI.i18nText("BI-Quarter_2"),
BI.i18nText("BI-Quarter_3"),
BI.i18nText("BI-Quarter_4")
][index];
}
if (!BI.isKhtml()) {
return str.replace(re, function (par) {
return s[par] || par;
});
/**
* 格式化打印日期
* @param date
* @param str
* @returns {*}
*/
export function print(date, str) {
const m = date.getMonth();
const d = date.getDate();
const y = date.getFullYear();
let yWith4number = y + "";
while (yWith4number.length < 4) {
yWith4number = "0" + yWith4number;
}
const wn = getWeekNumber(date);
const qr = getQuarter(date);
const w = date.getDay();
const s = {};
const hr = date.getHours();
const pm = (hr >= 12);
let ir = (pm) ? (hr - 12) : hr;
const dy = getDayOfYear(date);
if (ir === 0) {
ir = 12;
}
const min = date.getMinutes();
const sec = date.getSeconds();
s["%a"] = getShortDayName(w); // abbreviated weekday name [FIXME: I18N]
s["%A"] = getFullDayName(w); // full weekday name
s["%b"] = _SMN[m]; // abbreviated month name [FIXME: I18N]
s["%B"] = getMonthName(m); // full month name
// FIXME: %c : preferred date and time representation for the current locale
s["%C"] = 1 + Math.floor(y / 100); // the century number
s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
s["%e"] = d; // the day of the month (range 1 to 31)
// FIXME: %D : american date style: %m/%d/%y
// FIXME: %E, %F, %G, %g, %h (man strftime)
s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
s["%k"] = hr + ""; // hour, range 0 to 23 (24h format)
s["%l"] = ir + ""; // hour, range 1 to 12 (12h format)
s["%X"] = (m < 9) ? ("0" + (1 + m)) : (1 + m); // month, range 01 to 12
s["%x"] = m + 1; // month, range 1 to 12
s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
s["%n"] = "\n"; // a newline character
s["%p"] = pm ? "PM" : "AM";
s["%P"] = pm ? "pm" : "am";
// FIXME: %r : the time in am/pm notation %I:%M:%S %p
// FIXME: %R : the time in 24-hour notation %H:%M
s["%s"] = Math.floor(date.getTime() / 1000);
s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
s["%t"] = "\t"; // a tab character
// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON)
s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN)
// FIXME: %x : preferred date representation for the current locale without the time
// FIXME: %X : preferred time representation for the current locale without the date
s["%y"] = yWith4number.substr(2, 2); // year without the century (range 00 to 99)
s["%Y"] = yWith4number; // year with the century
s["%%"] = "%"; // a literal '%' character
s["%q"] = "0" + qr;
s["%Q"] = qr;
let re = /%./g;
BI.isKhtml = BI.isKhtml || function () {
if (!_global.navigator) {
return false;
}
var a = str.match(re);
for (var i = 0; i < a.length; i++) {
var tmp = s[a[i]];
if (tmp) {
re = new RegExp(a[i], "g");
str = str.replace(re, tmp);
}
return /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
};
// 包含年周的格式化,ISO8601标准周的计数会影响年
if ((str.indexOf("%Y") !== -1 || str.indexOf("%y") !== -1) && (str.indexOf("%W") !== -1 || str.indexOf("%U") !== -1 || str.indexOf("%V") !== -1)) {
switch (wn) {
// 如果周数是1,但是当前却在12月,表示此周数为下一年的
case 1:
if (m === 11) {
s["%y"] = parseInt(s["%y"]) + 1;
s["%Y"] = parseInt(s["%Y"]) + 1;
}
break;
// 如果周数是53,但是当前却在1月,表示此周数为上一年的
case 53:
if (m === 0) {
s["%y"] = parseInt(s["%y"]) - 1;
s["%Y"] = parseInt(s["%Y"]) - 1;
}
break;
default:
break;
}
}
return str;
if (!BI.isKhtml()) {
return str.replace(re, function (par) {
return s[par] || par;
});
}
});
const a = str.match(re);
for (let i = 0; i < a.length; i++) {
const tmp = s[a[i]];
if (tmp) {
re = new RegExp(a[i], "g");
str = str.replace(re, tmp);
}
}
return str;
}

300
src/core/func/function.js

@ -2,167 +2,173 @@
* 基本的函数
* Created by GUY on 2015/6/24.
*/
BI.Func = BI.Func || {};
BI._.extend(BI.Func, {
/**
* 创建唯一的名字
* @param array
* @param name
* @returns {*}
*/
createDistinctName: function (array, name) {
var src = name, idx = 1;
name = name || "";
while (true) {
if (BI.every(array, function (i, item) {
return BI.isKey(item) ? item !== name : item.name !== name;
})) {
break;
}
name = src + (idx++);
import {every, isKey, isArray, toUpperCase, each, stripEL, isNotNull, isNull, isObject} from "../2.base";
import {makeFirstPY} from "../utils/chinesePY";
/**
* 创建唯一的名字
* @param array
* @param name
* @returns {*}
*/
export function createDistinctName(array, name) {
let src = name, idx = 1;
name = name || "";
while (true) {
if (every(array, function (i, item) {
return isKey(item) ? item !== name : item.name !== name;
})) {
break;
}
return name;
},
name = src + (idx++);
}
return name;
}
/**
* 获取字符宽度
* @param str
* @return {number}
*/
getGBWidth: function (str) {
str = str + "";
str = str.replace(/[^\x00-\xff]/g, "xx");
return Math.ceil(str.length / 2);
},
/**
* 获取字符宽度
* @param str
* @return {number}
*/
export function getGBWidth(str) {
str = str + "";
str = str.replace(/[^\x00-\xff]/g, "xx");
return Math.ceil(str.length / 2);
}
/**
* 获取搜索结果
* @param items
* @param keyword
* @param param 搜索哪个属性
*/
getSearchResult: function (items, keyword, param) {
var isArray = BI.isArray(items);
items = isArray ? BI.flatten(items) : items;
param || (param = "text");
if (!BI.isKey(keyword)) {
return {
find: items,
match: isArray ? [] : {}
};
/**
* 获取搜索结果
* @param items
* @param keyword
* @param param 搜索哪个属性
*/
export function getSearchResult(items, keyword, param) {
const array = isArray(items);
items = array ? BI.flatten(items) : items;
param || (param = "text");
if (!isKey(keyword)) {
return {
find: items,
match: array ? [] : {},
};
}
let t, text, py;
keyword = toUpperCase(keyword);
const matched = array ? [] : {}, find = array ? [] : {};
each(items, function (i, item) {
// 兼容item为null的处理
if (isNull(item)) {
return;
}
var t, text, py;
keyword = BI.toUpperCase(keyword);
var matched = isArray ? [] : {}, find = isArray ? [] : {};
BI.each(items, function (i, item) {
// 兼容item为null的处理
if (BI.isNull(item)) {
return;
}
t = BI.stripEL(item);
text = BI.find([t[param], t.text, t.value, t.name, t], function (index, val) {
return BI.isNotNull(val);
});
t = stripEL(item);
text = [t[param], t.text, t.value, t.name, t].find(isNotNull);
if (BI.isNull(text) || BI.isObject(text)) return;
if (isNull(text) || isObject(text)) return;
py = BI.makeFirstPY(text, {
splitChar: "\u200b"
});
text = BI.toUpperCase(text);
py = BI.toUpperCase(py);
var pidx;
if (text.indexOf(keyword) > -1) {
if (text === keyword) {
isArray ? matched.push(item) : (matched[i] = item);
} else {
isArray ? find.push(item) : (find[i] = item);
}
// BI-56386 这边两个pid / text.length是为了防止截取的首字符串不是完整的,但光这样做还不够,即时错位了,也不能说明就不符合条件
} else if (pidx = py.indexOf(keyword), (pidx > -1)) {
py = makeFirstPY(text, {
splitChar: "\u200b",
});
text = toUpperCase(text);
py = toUpperCase(py);
let pidx;
if (text.indexOf(keyword) > -1) {
if (text === keyword) {
array ? matched.push(item) : (matched[i] = item);
} else {
array ? find.push(item) : (find[i] = item);
}
} else { // BI-56386 这边两个pid / text.length是为了防止截取的首字符串不是完整的,但光这样做还不够,即时错位了,也不能说明就不符合条件
pidx = py.indexOf(keyword);
if (pidx > -1) {
if (text === keyword || keyword.length === text.length) {
isArray ? matched.push(item) : (matched[i] = item);
array ? matched.push(item) : (matched[i] = item);
} else {
isArray ? find.push(item) : (find[i] = item);
array ? find.push(item) : (find[i] = item);
}
}
});
return {
match: matched,
find: find
};
},
/**
* 获取按GB2312排序的结果
* @param items
* @param key
* @return {any[]}
*/
getSortedResult: function (items, key) {
var getTextOfItem = BI.isFunction(key) ? key :
function (item, key) {
if (BI.isNotNull(key)) {
return item[key];
}
if (BI.isNotNull(item.text)) {
return item.text;
}
if (BI.isNotNull(item.value)) {
return item.value;
}
return item;
};
}
});
return {
match: matched,
find: find,
};
}
return items.sort(function (item1, item2) {
var str1 = getTextOfItem(item1, key);
var str2 = getTextOfItem(item2, key);
if (BI.isNull(str1) && BI.isNull(str2)) {
return 0;
}
if (BI.isNull(str1)) {
return -1;
}
if (BI.isNull(str2)) {
return 1;
}
if (str1 === str2) {
return 0;
/**
* 获取按GB2312排序的结果
* @param items
* @param key
* @return {any[]}
*/
export function getSortedResult(items, key) {
const getTextOfItem = BI.isFunction(key) ? key :
function (item, key) {
if (BI.isNotNull(key)) {
return item[key];
}
var len1 = str1.length, len2 = str2.length;
for (var i = 0; i < len1 && i < len2; i++) {
var char1 = str1[i];
var char2 = str2[i];
if (char1 !== char2) {
// 找不到的字符都往后面放
return (BI.isNull(BI.CODE_INDEX[char1]) ? BI.MAX : BI.CODE_INDEX[char1]) - (BI.isNull(BI.CODE_INDEX[char2]) ? BI.MAX : BI.CODE_INDEX[char2]);
}
if (BI.isNotNull(item.text)) {
return item.text;
}
return len1 - len2;
});
}
});
BI._.extend(BI, {
beforeFunc: function (sFunc, func) {
var __self = sFunc;
return function () {
if (func.apply(sFunc, arguments) === false) {
return false;
if (BI.isNotNull(item.value)) {
return item.value;
}
return __self.apply(sFunc, arguments);
return item;
};
},
afterFunc: function (sFunc, func) {
var __self = sFunc;
return function () {
var ret = __self.apply(sFunc, arguments);
if (ret === false) {
return false;
return items.sort(function (item1, item2) {
const str1 = getTextOfItem(item1, key);
const str2 = getTextOfItem(item2, key);
if (BI.isNull(str1) && BI.isNull(str2)) {
return 0;
}
if (BI.isNull(str1)) {
return -1;
}
if (BI.isNull(str2)) {
return 1;
}
if (str1 === str2) {
return 0;
}
const len1 = str1.length, len2 = str2.length;
for (let i = 0; i < len1 && i < len2; i++) {
const char1 = str1[i];
const char2 = str2[i];
if (char1 !== char2) {
// 找不到的字符都往后面放
return (BI.isNull(BI.CODE_INDEX[char1]) ? BI.MAX : BI.CODE_INDEX[char1]) - (BI.isNull(BI.CODE_INDEX[char2]) ? BI.MAX : BI.CODE_INDEX[char2]);
}
func.apply(sFunc, arguments);
return ret;
};
}
});
}
return len1 - len2;
});
}
export function beforeFunc(sFunc, func) {
const __self = sFunc;
return function () {
if (func.apply(sFunc, arguments) === false) {
return false;
}
return __self.apply(sFunc, arguments);
};
}
export function afterFunc(sFunc, func) {
const __self = sFunc;
return function () {
const ret = __self.apply(sFunc, arguments);
if (ret === false) {
return false;
}
func.apply(sFunc, arguments);
return ret;
};
}
export const Func = {
createDistinctName,
getGBWidth,
getSearchResult,
getSortedResult,
};

6
src/core/func/index.js

@ -0,0 +1,6 @@
export * from "./alias";
export * from "./array";
export * from "./date";
export * from "./function";
export * from "./number";
export * from "./string";

274
src/core/func/number.js

@ -1,156 +1,154 @@
BI._.extend(BI, {
// 给Number类型增加一个add方法,调用起来更加方便。
add: function (num, arg) {
return accAdd(arg, num);
// 给Number类型增加一个add方法,调用起来更加方便。
export function add(num, arg) {
return accAdd(arg, num);
/**
** 加法函数用来得到精确的加法结果
** 说明javascript的加法结果会有误差在两个浮点数相加的时候会比较明显这个函数返回较为精确的加法结果
** 调用accAdd(arg1,arg2)
** 返回值arg1加上arg2的精确结果
**/
function accAdd (arg1, arg2) {
var r1, r2, m, c;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2));
if (c > 0) {
var cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
} else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
} else {
/**
** 加法函数用来得到精确的加法结果
** 说明javascript的加法结果会有误差在两个浮点数相加的时候会比较明显这个函数返回较为精确的加法结果
** 调用accAdd(arg1,arg2)
** 返回值arg1加上arg2的精确结果
**/
function accAdd(arg1, arg2) {
let r1, r2, m, c;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2));
if (c > 0) {
const cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
} else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
return (arg1 + arg2) / m;
} else {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
},
return (arg1 + arg2) / m;
}
}
// 给Number类型增加一个sub方法,调用起来更加方便。
sub: function (num, arg) {
return accSub(num, arg);
// 给Number类型增加一个sub方法,调用起来更加方便。
export function sub(num, arg) {
return accSub(num, arg);
/**
** 减法函数用来得到精确的减法结果
** 说明javascript的减法结果会有误差在两个浮点数相减的时候会比较明显这个函数返回较为精确的减法结果
** 调用accSub(arg1,arg2)
** 返回值arg1加上arg2的精确结果
**/
function accSub (arg1, arg2) {
var r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2)); // last modify by deeka //动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
/**
** 减法函数用来得到精确的减法结果
** 说明javascript的减法结果会有误差在两个浮点数相减的时候会比较明显这个函数返回较为精确的减法结果
** 调用accSub(arg1,arg2)
** 返回值arg1加上arg2的精确结果
**/
function accSub(arg1, arg2) {
let r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
},
m = Math.pow(10, Math.max(r1, r2)); // last modify by deeka //动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
}
// 给Number类型增加一个mul方法,调用起来更加方便。
mul: function (num, arg) {
return accMul(arg, num);
// 给Number类型增加一个mul方法,调用起来更加方便。
export function mul(num, arg) {
return accMul(arg, num);
/**
** 乘法函数用来得到精确的乘法结果
** 说明javascript的乘法结果会有误差在两个浮点数相乘的时候会比较明显这个函数返回较为精确的乘法结果
** 调用accMul(arg1,arg2)
** 返回值arg1乘以 arg2的精确结果
**/
function accMul (arg1, arg2) {
var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
try {
m += s1.split(".")[1].length;
} catch (e) {
}
try {
m += s2.split(".")[1].length;
} catch (e) {
}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
/**
** 乘法函数用来得到精确的乘法结果
** 说明javascript的乘法结果会有误差在两个浮点数相乘的时候会比较明显这个函数返回较为精确的乘法结果
** 调用accMul(arg1,arg2)
** 返回值arg1乘以 arg2的精确结果
**/
function accMul(arg1, arg2) {
let m = 0, s1 = arg1.toString(), s2 = arg2.toString();
try {
m += s1.split(".")[1].length;
} catch (e) {
}
},
// 给Number类型增加一个div方法,调用起来更加方便。
div: function (num, arg) {
return accDivide(num, arg);
/**
* Return digits length of a number
* @param {*number} num Input number
*/
function digitLength (num) {
// Get digit length of e
var eSplit = num.toString().split(/[eE]/);
var len = (eSplit[0].split(".")[1] || "").length - (+(eSplit[1] || 0));
return len > 0 ? len : 0;
}
/**
* 把小数转成整数支持科学计数法如果是小数则放大成整数
* @param {*number} num 输入数
*/
function float2Fixed (num) {
if (num.toString().indexOf("e") === -1) {
return Number(num.toString().replace(".", ""));
}
var dLen = digitLength(num);
return dLen > 0 ? num * Math.pow(10, dLen) : num;
try {
m += s2.split(".")[1].length;
} catch (e) {
}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
}
/**
* 精确乘法
*/
function times (num1, num2) {
var others = [];
for (var _i = 2; _i < arguments.length; _i++) {
others[_i - 2] = arguments[_i];
}
if (others.length > 0) {
return times.apply(void 0, [times(num1, num2), others[0]].concat(others.slice(1)));
}
var num1Changed = float2Fixed(num1);
var num2Changed = float2Fixed(num2);
var baseNum = digitLength(num1) + digitLength(num2);
var leftValue = num1Changed * num2Changed;
return leftValue / Math.pow(10, baseNum);
// 给Number类型增加一个div方法,调用起来更加方便。
export function div(num, arg) {
return accDivide(num, arg);
/**
* Return digits length of a number
* @param {*number} num Input number
*/
function digitLength(num) {
// Get digit length of e
const eSplit = num.toString().split(/[eE]/);
const len = (eSplit[0].split(".")[1] || "").length - (+(eSplit[1] || 0));
return len > 0 ? len : 0;
}
/**
* 把小数转成整数支持科学计数法如果是小数则放大成整数
* @param {*number} num 输入数
*/
function float2Fixed(num) {
if (num.toString().indexOf("e") === -1) {
return Number(num.toString().replace(".", ""));
}
const dLen = digitLength(num);
return dLen > 0 ? num * Math.pow(10, dLen) : num;
}
/**
* 精确除法
*/
function accDivide (num1, num2) {
var others = [];
for (var _i = 2; _i < arguments.length; _i++) {
others[_i - 2] = arguments[_i];
}
if (others.length > 0) {
return accDivide.apply(void 0, [accDivide(num1, num2), others[0]].concat(others.slice(1)));
}
var num1Changed = float2Fixed(num1);
var num2Changed = float2Fixed(num2);
return times((num1Changed / num2Changed), Math.pow(10, digitLength(num2) - digitLength(num1)));
/**
* 精确乘法
*/
function times(num1, num2) {
const others = [];
for (let _i = 2; _i < arguments.length; _i++) {
others[_i - 2] = arguments[_i];
}
if (others.length > 0) {
return times.apply(void 0, [times(num1, num2), others[0]].concat(others.slice(1)));
}
const num1Changed = float2Fixed(num1);
const num2Changed = float2Fixed(num2);
const baseNum = digitLength(num1) + digitLength(num2);
const leftValue = num1Changed * num2Changed;
return leftValue / Math.pow(10, baseNum);
}
});
/**
* 精确除法
*/
function accDivide(num1, num2) {
const others = [];
for (let _i = 2; _i < arguments.length; _i++) {
others[_i - 2] = arguments[_i];
}
if (others.length > 0) {
return accDivide.apply(void 0, [accDivide(num1, num2), others[0]].concat(others.slice(1)));
}
const num1Changed = float2Fixed(num1);
const num2Changed = float2Fixed(num2);
return times((num1Changed / num2Changed), Math.pow(10, digitLength(num2) - digitLength(num1)));
}
}

224
src/core/func/string.js

@ -1,123 +1,121 @@
import {isString} from "../2.base";
/**
* 对字符串对象的扩展
* @class String
* 判断字符串是否已指定的字符串开始
* @param str source字符串
* @param {String} startTag 指定的开始字符串
* @return {Boolean} 如果字符串以指定字符串开始则返回true否则返回false
*/
BI._.extend(BI, {
export function startWith(str, startTag) {
str = str || "";
if (startTag == null || startTag == "" || str.length === 0 || startTag.length > str.length) {
return false;
}
return str.substring(0, startTag.length) == startTag;
}
/**
* 判断字符串是否已指定的字符串开始
* @param str source字符串
* @param {String} startTag 指定的开始字符串
* @return {Boolean} 如果字符串以指定字符串开始则返回true否则返回false
*/
startWith: function (str, startTag) {
str = str || "";
if (startTag == null || startTag == "" || str.length === 0 || startTag.length > str.length) {
return false;
}
return str.substr(0, startTag.length) == startTag;
},
/**
* 判断字符串是否以指定的字符串结束
* @param str source字符串
* @param {String} endTag 指定的字符串
* @return {Boolean} 如果字符串以指定字符串结束则返回true否则返回false
*/
endWith: function (str, endTag) {
if (endTag == null || endTag == "" || str.length === 0 || endTag.length > str.length) {
return false;
}
return str.substring(str.length - endTag.length) == endTag;
},
/**
* 判断字符串是否以指定的字符串结束
* @param str source字符串
* @param {String} endTag 指定的字符串
* @return {Boolean} 如果字符串以指定字符串结束则返回true否则返回false
*/
export function endWith(str, endTag) {
if (endTag == null || endTag == "" || str.length === 0 || endTag.length > str.length) {
return false;
}
return str.substring(str.length - endTag.length) == endTag;
}
/**
* 获取url中指定名字的参数
* @param str source字符串
* @param {String} name 参数的名字
* @return {String} 参数的值
*/
getQuery: function (str, name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = str.substr(str.indexOf("?") + 1).match(reg);
if (r) {
return unescape(r[2]);
}
return null;
},
/**
* 获取url中指定名字的参数
* @param str source字符串
* @param {String} name 参数的名字
* @return {String} 参数的值
*/
export function getQuery(str, name) {
const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
const r = str.substr(str.indexOf("?") + 1).match(reg);
if (r) {
return unescape(r[2]);
}
return null;
}
/**
* 给url加上给定的参数
* @param str source字符串
* @param {Object} paras 参数对象是一个键值对对象
* @return {String} 添加了给定参数的url
*/
appendQuery: function (str, paras) {
if (!paras) {
return str;
}
var src = str;
// 没有问号说明还没有参数
if (src.indexOf("?") === -1) {
src += "?";
}
// 如果以问号结尾,说明没有其他参数
if (BI.endWith(src, "?") !== false) {
} else {
src += "&";
}
BI._.each(paras, function (value, name) {
if (typeof(name) === "string") {
src += name + "=" + value + "&";
}
});
src = src.substr(0, src.length - 1);
return src;
},
/**
* 将所有符合第一个字符串所表示的字符串替换成为第二个字符串
* @param str source字符串
* @param {String} s1 要替换的字符串的正则表达式
* @param {String} s2 替换的结果字符串
* @returns {String} 替换后的字符串
*/
replaceAll: function (str, s1, s2) {
return BI.isString(str) ? str.replace(new RegExp(s1, "gm"), s2) : str;
},
/**
* 总是让字符串以指定的字符开头
* @param str source字符串
* @param {String} start 指定的字符
* @returns {String} 以指定字符开头的字符串
*/
perfectStart: function (str, start) {
if (BI.startWith(str, start)) {
return str;
/**
* 给url加上给定的参数
* @param str source字符串
* @param {Object} paras 参数对象是一个键值对对象
* @return {String} 添加了给定参数的url
*/
export function appendQuery(str, paras) {
if (!paras) {
return str;
}
let src = str;
// 没有问号说明还没有参数
if (src.indexOf("?") === -1) {
src += "?";
}
// 如果以问号结尾,说明没有其他参数
if (BI.endWith(src, "?") !== false) {
} else {
src += "&";
}
BI._.each(paras, function (value, name) {
if (typeof (name) === "string") {
src += name + "=" + value + "&";
}
return start + str;
});
src = src.substr(0, src.length - 1);
return src;
}
},
/**
* 将所有符合第一个字符串所表示的字符串替换成为第二个字符串
* @param str source字符串
* @param {String} s1 要替换的字符串的正则表达式
* @param {String} s2 替换的结果字符串
* @returns {String} 替换后的字符串
*/
export function replaceAll(str, s1, s2) {
return isString(str) ? str.replace(new RegExp(s1, "gm"), s2) : str;
}
/**
* 获取字符串中某字符串的所有项位置数组
* @param str source字符串
* @param {String} sub 子字符串
* @return {Number[]} 子字符串在父字符串中出现的所有位置组成的数组
*/
allIndexOf: function (str, sub) {
if (typeof sub !== "string") {
return [];
}
var location = [];
var offset = 0;
while (str.length > 0) {
var loc = str.indexOf(sub);
if (loc === -1) {
break;
}
location.push(offset + loc);
str = str.substring(loc + sub.length, str.length);
offset += loc + sub.length;
/**
* 总是让字符串以指定的字符开头
* @param str source字符串
* @param {String} start 指定的字符
* @returns {String} 以指定字符开头的字符串
*/
export function perfectStart(str, start) {
if (BI.startWith(str, start)) {
return str;
}
return start + str;
}
/**
* 获取字符串中某字符串的所有项位置数组
* @param str source字符串
* @param {String} sub 子字符串
* @return {Number[]} 子字符串在父字符串中出现的所有位置组成的数组
*/
export function allIndexOf(str, sub) {
if (typeof sub !== "string") {
return [];
}
const location = [];
let offset = 0;
while (str.length > 0) {
const loc = str.indexOf(sub);
if (loc === -1) {
break;
}
return location;
location.push(offset + loc);
str = str.substring(loc + sub.length, str.length);
offset += loc + sub.length;
}
});
return location;
}

93
src/core/index.js

@ -1,66 +1,45 @@
import { shortcut } from "./decorator";
import OB from "./3.ob";
import Widget from "./4.widget";
import Action from "./action/action";
import ShowAction from "./action/action.show";
import Behavior from "./behavior/0.behavior";
import HighlightBehavior from "./behavior/behavior.highlight";
import RedMarkBehavior from "./behavior/behavior.redmark";
import Controller from "./controller/0.controller";
import BroadcastController from "./controller/controller.broadcast";
import BubblesController from "./controller/controller.bubbles";
import DrawerController from "./controller/controller.drawer";
import LayerController from "./controller/controller.layer";
import MaskersController from "./controller/controller.masker";
import PopoverController from "./controller/controller.popover";
import ResizeController from "./controller/controller.resizer";
import TooltipsController from "./controller/controller.tooltips";
import StyleLoaderManager from "./loader/loader.style";
BI.extend(BI, {
OB,
Widget,
Action,
ShowAction,
Behavior,
HighlightBehavior,
RedMarkBehavior,
Controller,
BroadcastController,
BubblesController,
DrawerController,
LayerController,
MaskersController,
PopoverController,
ResizeController,
TooltipsController,
StyleLoaderManager,
});
import * as base from "./2.base";
import * as ob from "./3.ob";
import * as widget from "./4.widget";
import * as inject from "./5.inject";
import * as action from "./action";
import * as behavior from "./behavior";
import * as controllers from "./controller";
import * as func from "./func";
import { StyleLoaderManager } from "./loader/loader.style";
import "./h";
import { ShowListener } from "./listener/listener.show";
import { shortcut } from "./decorator";
export * from './2.base';
export * from './4.widget';
export * from './5.inject';
export * from "./2.base";
export * from "./3.ob";
export * from "./4.widget";
export * from "./5.inject";
export * from "./action";
export * from "./behavior";
export * from "./controller";
export * from "./func";
// 有了后删掉
export const emptyFn = () => { }
export {
StyleLoaderManager,
ShowListener,
shortcut,
OB,
Widget,
Action,
ShowAction,
Behavior,
HighlightBehavior,
RedMarkBehavior,
Controller,
BroadcastController,
BubblesController,
DrawerController,
LayerController,
MaskersController,
PopoverController,
ResizeController,
TooltipsController,
}
Object.assign(BI, {
...base,
...ob,
...widget,
...inject,
...behavior,
component: inject.shortcut,
...action,
...controllers,
...func,
StyleLoaderManager,
}
ShowListener,
});

52
src/core/listener/listener.show.js

@ -5,44 +5,50 @@
* @class BI.ShowListener
* @extends BI.OB
*/
BI.ShowListener = BI.inherit(BI.OB, {
props: function () {
import { OB } from "../3.ob";
import { isArray, isNull, nextTick, } from "../2.base";
import { createWidget } from "../5.inject";
import { Controller } from "../controller/0.controller";
export class ShowListener extends OB {
static EVENT_CHANGE = "EVENT_CHANGE";
props() {
return {
eventObj: BI.createWidget(),
eventObj: createWidget(),
cardLayout: null,
cardNameCreator: function (v) {
cardNameCreator: (v) => {
return v;
},
cardCreator: BI.emptyFn,
afterCardCreated: BI.emptyFn,
afterCardShow: BI.emptyFn
};
},
}
init: function () {
var self = this, o = this.options;
if (o.eventObj) {
o.eventObj.on(BI.Controller.EVENT_CHANGE, function (type, v, ob) {
init() {
const { eventObj, cardLayout, afterCardCreated, cardNameCreator, cardCreator, afterCardShow } = this.options;
if (eventObj) {
eventObj.on(Controller.EVENT_CHANGE, (type, v, ob) => {
if (type === BI.Events.CLICK) {
v = v || o.eventObj.getValue();
v = BI.isArray(v) ? (v.length > 1 ? v.toString() : v[0]) : v;
if (BI.isNull(v)) {
v = v || eventObj.getValue();
v = isArray(v) ? (v.length > 1 ? v.toString() : v[0]) : v;
if (isNull(v)) {
throw new Error("不能为null");
}
var cardName = o.cardNameCreator(v);
if (!o.cardLayout.isCardExisted(cardName)) {
var card = o.cardCreator(cardName);
o.cardLayout.addCardByName(cardName, card);
o.afterCardCreated(cardName);
var cardName = cardNameCreator(v);
if (!cardLayout.isCardExisted(cardName)) {
const card = cardCreator(cardName);
cardLayout.addCardByName(cardName, card);
afterCardCreated(cardName);
}
o.cardLayout.showCardByName(cardName);
BI.nextTick(function () {
o.afterCardShow(cardName);
self.fireEvent(BI.ShowListener.EVENT_CHANGE, cardName);
cardLayout.showCardByName(cardName);
nextTick(() => {
afterCardShow(cardName);
this.fireEvent(ShowListener.EVENT_CHANGE, cardName);
});
}
});
}
}
});
BI.ShowListener.EVENT_CHANGE = "EVENT_CHANGE";
}

4
src/core/loader/loader.style.js

@ -4,9 +4,9 @@
* Created by GUY on 2015/9/7.
* @class
*/
import OB from "../3.ob";
import { OB } from "../3.ob";
export default class StyleLoaderManager extends OB {
export class StyleLoaderManager extends OB {
_defaultConfig() {
return BI.extend(super._defaultConfig(arguments), {});
}

123
src/core/platform/web/detectElementResize.js

@ -323,7 +323,22 @@ var ResizeObserverPolyfill = (function (exports) {
};
var CATCH_PERIOD = 250;
var observerConfig = { attributes: true, characterData: true, childList: true, subtree: true };
var events = ['resize', 'load', 'transitionend', 'animationend', 'animationstart', 'animationiteration', 'keyup', 'keydown', 'mouseup', 'mousedown', 'mouseover', 'mouseout', 'blur', 'focus'];
var events = [
'resize',
'load',
'transitionend',
'animationend',
'animationstart',
'animationiteration',
'keyup',
'keydown',
'mouseup',
'mousedown',
'mouseover',
'mouseout',
'blur',
'focus'
];
var time = function (timeout) {
if (timeout === void 0) {
timeout = 0;
@ -412,14 +427,17 @@ var ResizeObserverPolyfill = (function (exports) {
};
var skipNotifyOnElement = function (target) {
return !isSVG(target) && !isReplacedElement(target) && getComputedStyle(target).display === 'inline';
return !isSVG(target)
&& !isReplacedElement(target)
&& getComputedStyle(target).display === 'inline';
};
var ResizeObservation = (function () {
function ResizeObservation(target, observedBox) {
this.target = target;
this.observedBox = observedBox || ResizeObserverBoxOptions.CONTENT_BOX;
this.lastReportedSize = {
inlineSize: -1, blockSize: -1
inlineSize: -1,
blockSize: -1
};
}
@ -428,7 +446,8 @@ var ResizeObserverPolyfill = (function (exports) {
if (skipNotifyOnElement(this.target)) {
this.lastReportedSize = size;
}
if (this.lastReportedSize.inlineSize !== size.inlineSize || this.lastReportedSize.blockSize !== size.blockSize) {
if (this.lastReportedSize.inlineSize !== size.inlineSize
|| this.lastReportedSize.blockSize !== size.blockSize) {
return true;
}
return false;
@ -534,64 +553,58 @@ var ResizeObserverPolyfill = (function (exports) {
return ResizeObserver;
}());
exports.ResizeObserver = ResizeObserver;
exports.ResizeObserverEntry = ResizeObserverEntry;
exports.ResizeObserverSize = ResizeObserverSize;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({});
var ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill.ResizeObserver;
return ResizeObserver;
})();
!(function () {
var ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;
var addResizeListener = function (element, fn) {
if (ResizeObserver) {
if (!element.__resizeObserver__) {
var resizeObserver = new ResizeObserver(function () {
element.__resizeListeners__.forEach(function (listener) {
BI.$(element).is(":visible") && listener();
});
var addResizeListener = function (element, fn) {
if (ResizeObserver) {
if (!element.__resizeObserver__) {
var resizeObserver = new ResizeObserver(function () {
element.__resizeListeners__.forEach(function (listener) {
BI.$(element).is(":visible") && listener();
});
resizeObserver.observe(element);
element.__resizeObserver__ = resizeObserver;
}
if (!element.__resizeListeners__) {
element.__resizeListeners__ = [];
}
element.__resizeListeners__.push(fn);
});
resizeObserver.observe(element);
element.__resizeObserver__ = resizeObserver;
}
};
var removeResizeListener = function (element, fn) {
if (ResizeObserver) {
if (BI.isNull(fn)) {
element.__resizeListeners__ = [];
if (!element.__resizeListeners__) {
element.__resizeListeners__ = [];
}
element.__resizeListeners__.push(fn);
}
};
var removeResizeListener = function (element, fn) {
if (ResizeObserver) {
if (BI.isNull(fn)) {
element.__resizeListeners__ = [];
element.__resizeObserver__ && element.__resizeObserver__.unobserve(element);
element.__resizeObserver__ = null;
return;
}
var index = element.__resizeListeners__.indexOf(fn);
if (index >= 0) {
element.__resizeListeners__.splice(index, 1);
if (!element.__resizeListeners__.length) {
element.__resizeObserver__ && element.__resizeObserver__.unobserve(element);
element.__resizeObserver__ = null;
return;
}
var index = element.__resizeListeners__.indexOf(fn);
if (index >= 0) {
element.__resizeListeners__.splice(index, 1);
if (!element.__resizeListeners__.length) {
element.__resizeObserver__ && element.__resizeObserver__.unobserve(element);
element.__resizeObserver__ = null;
}
}
}
};
}
};
BI.ResizeDetector = {
addResizeListener: function (widget, fn) {
addResizeListener(widget.element[0], fn);
return function () {
removeResizeListener(widget.element[0], fn);
};
}, removeResizeListener: function (widget, fn) {
export const ResizeDetector = {
addResizeListener: function (widget, fn) {
addResizeListener(widget.element[0], fn);
return function () {
removeResizeListener(widget.element[0], fn);
}
};
})();
};
}, removeResizeListener: function (widget, fn) {
removeResizeListener(widget.element[0], fn);
}
};
Object.assign(BI, {
ResizeDetector
});

863
src/core/utils/chinesePY.js

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save