Browse Source

Pull request #3322: KERNEL-14035 refactor: constant、element、logic文件夹及整体eslint一下

Merge in VISUAL/fineui from ~ZHENFEI.LI/fineui:es6 to es6

* commit '8fcb09c1e3c2805906ed44cd4cda7426d3a2a65b':
  KERNEL-14035 refactor: 挂载Element
  KERNEL-14035 refactor: constant、element、logic文件夹及整体eslint一下
es6
Zhenfei.Li-李振飞 2 years ago
parent
commit
2e9e4426f1
  1. 12
      src/base/1.pane.js
  2. 3
      src/core/2.base.js
  3. 15
      src/core/action/action.js
  4. 17
      src/core/action/action.show.js
  5. 2
      src/core/action/index.js
  6. 24
      src/core/behavior/0.behavior.js
  7. 26
      src/core/behavior/behavior.highlight.js
  8. 19
      src/core/behavior/behavior.redmark.js
  9. 27
      src/core/behavior/index.js
  10. 9
      src/core/constant/events.js
  11. 2
      src/core/constant/index.js
  12. 141
      src/core/constant/var.js
  13. 4
      src/core/controller/0.controller.js
  14. 9
      src/core/controller/controller.broadcast.js
  15. 38
      src/core/controller/controller.bubbles.js
  16. 38
      src/core/controller/controller.drawer.js
  17. 55
      src/core/controller/controller.layer.js
  18. 2
      src/core/controller/controller.masker.js
  19. 46
      src/core/controller/controller.popover.js
  20. 21
      src/core/controller/controller.resizer.js
  21. 40
      src/core/controller/controller.tooltips.js
  22. 22
      src/core/element/element.js
  23. 26
      src/core/element/index.js
  24. 23
      src/core/element/plugins/attr.js
  25. 26
      src/core/element/plugins/class.js
  26. 22
      src/core/element/plugins/css.js
  27. 9
      src/core/element/plugins/data.js
  28. 7
      src/core/element/plugins/empty.js
  29. 55
      src/core/element/plugins/event.js
  30. 16
      src/core/element/plugins/html.js
  31. 28
      src/core/element/plugins/index.js
  32. 5
      src/core/element/plugins/keywordMark.js
  33. 58
      src/core/element/plugins/renderToHtml.js
  34. 42
      src/core/element/plugins/renderToString.js
  35. 8
      src/core/element/plugins/text.js
  36. 6
      src/core/element/plugins/val.js
  37. 14
      src/core/index.js
  38. 20
      src/core/listener/listener.show.js
  39. 7
      src/core/loader/loader.style.js
  40. 83
      src/core/logic/index.js
  41. 80
      src/core/logic/logic.js
  42. 109
      src/core/logic/logic.layout.js

12
src/base/1.pane.js

@ -33,7 +33,7 @@ export class Pane extends Widget {
element: this,
items: [{
type: "bi.label",
ref: (_ref) => {
ref: _ref => {
this._tipText = _ref;
},
cls: "bi-tips",
@ -54,15 +54,15 @@ export class Pane extends Widget {
// loading的异步情况下由loaded后对面板的populate的时机决定
this.setTipVisible(false);
if (o.overlap === true) {
if (!Layers.has(this.getName() + "-loading")) {
if (!Layers.has(`${this.getName()}-loading`)) {
createWidget({
type: "bi.center_adapt",
cls: "loading-container",
items: this._getLoadingTipItems(loadingAnimation),
element: Layers.make(this.getName() + "-loading", this),
element: Layers.make(`${this.getName()}-loading`, this),
});
}
Layers.show(this.getName() + "-loading");
Layers.show(`${this.getName()}-loading`);
} else if (isNull(this._loading)) {
loadingAnimation.element.css("zIndex", 1);
createWidget({
@ -94,7 +94,7 @@ export class Pane extends Widget {
return [{
type: "bi.vertical",
ref: (_ref) => {
ref: _ref => {
this._loading = _ref;
},
items: loadingTipItems,
@ -102,7 +102,7 @@ export class Pane extends Widget {
}
loaded() {
Layers.remove(this.getName() + "-loading");
Layers.remove(`${this.getName()}-loading`);
this._loading && this._loading.destroy();
this.options.onLoaded();
this.fireEvent(Pane.EVENT_LOADED);

3
src/core/2.base.js

@ -488,7 +488,7 @@ 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"
"isBoolean", "isDate", "isRegExp", "isError", "isNaN", "isUndefined", "zipObject", "cloneDeep", "pickBy"
], name => {
BI[name] = _apply(name);
});
@ -526,6 +526,7 @@ export const isNaN = BI.isNaN;
export const isUndefined = BI.isUndefined;
export const zipObject = BI.zipObject;
export const cloneDeep = BI.cloneDeep;
export const pickBy = BI.pickBy;
BI._.each(["mapObject", "findKey", "pick", "omit", "tap"], name => {
BI[name] = _applyFunc(name);

15
src/core/action/action.js

@ -6,10 +6,11 @@
* @abstract
*/
import { OB } from "../3.ob";
export class Action extends OB {
props = {
src: null,
tar: null
tar: null,
};
actionPerformed(src, tar, callback) {
@ -20,15 +21,3 @@ export class Action extends OB {
}
}
BI.ActionFactory = {
createAction: function (key, options) {
var action;
switch (key) {
case "show":
action = BI.ShowAction;
break;
}
return new action(options);
}
};

17
src/core/action/action.show.js

@ -1,10 +1,9 @@
/**
* guy
* 由一个元素切换到另一个元素的行为
* @class BI.ShowAction
* @extends BI.Action
*/
import { Action } from "./action";
export class ShowAction extends Action {
actionPerformed(src, tar, callback) {
tar = tar || this.options.tar;
@ -18,3 +17,17 @@ export class ShowAction extends Action {
callback && callback();
}
}
export const ActionFactory = {
createAction (key, options) {
let Action;
switch (key) {
case "show":
Action = ShowAction;
break;
default:
}
return new Action(options);
},
};

2
src/core/action/index.js

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

24
src/core/behavior/0.behavior.js

@ -1,30 +1,14 @@
BI.BehaviorFactory = {
createBehavior: function (key, options) {
var behavior;
switch (key) {
case "highlight":
behavior = BI.HighlightBehavior;
break;
case "redmark":
behavior = BI.RedMarkBehavior;
break;
}
return new behavior(options);
}
};
/**
* guy
* 行为控件
* @class BI.Behavior
* @extends BI.OB
*/
import { OB } from "../3.ob";
import { extend } from "../2.base";
export class Behavior extends OB {
_defaultConfig() {
return BI.extend(super._defaultConfig(arguments), {
rule: () => true
return extend(super._defaultConfig(arguments), {
rule: () => true,
});
}

26
src/core/behavior/behavior.highlight.js

@ -1,33 +1,33 @@
/**
* guy
*
* @class BI.HighlightBehavior
* @extends BI.Behavior
*/
import { Behavior } from "./0.behavior";
import { isFunction, each } from "../2.base";
import { Single } from "../../base";
export class HighlightBehavior extends Behavior {
doBehavior(items) {
const args = Array.prototype.slice.call(arguments, 1),
o = this.options;
BI.each(items, function (i, item) {
if (item instanceof BI.Single) {
const rule = o.rule(item.getValue(), item);
{ rule } = this.options;
each(items, (i, item) => {
if (item instanceof Single) {
const rules = rule(item.getValue(), item);
function doBe (run) {
if (run === true) {
item.doHighLight && item.doHighLight.apply(item, args);
item.doHighLight && item.doHighLight(...args);
} else {
item.unHighLight && item.unHighLight.apply(item, args);
item.unHighLight && item.unHighLight(...args);
}
}
if (BI.isFunction(rule)) {
rule(doBe);
if (isFunction(rules)) {
rules(doBe);
} else {
doBe(rule);
doBe(rules);
}
} else {
item.doBehavior && item.doBehavior.apply(item, args);
item.doBehavior && item.doBehavior(...args);
}
});
}

19
src/core/behavior/behavior.redmark.js

@ -1,23 +1,24 @@
/**
* guy
* 标红行为
* @class BI.RedMarkBehavior
* @extends BI.Behavior
*/
import { Behavior } from "./0.behavior";
import { each } from "../2.base";
import { Single } from "../../base";
export class RedMarkBehavior extends Behavior {
doBehavior(items) {
const args = Array.prototype.slice.call(arguments, 1),
o = this.options;
BI.each(items, function (i, item) {
if(item instanceof BI.Single) {
if (o.rule(item.getValue(), item)) {
item.doRedMark && item.doRedMark.apply(item, args);
{ rule } = this.options;
each(items, (i, item) => {
if (item instanceof Single) {
if (rule(item.getValue(), item)) {
item.doRedMark && item.doRedMark(...args);
} else {
item.doRedMark && item.unRedMark.apply(item, args);
item.doRedMark && item.unRedMark(...args);
}
} else {
item.doBehavior && item.doBehavior.apply(item, args);
item.doBehavior && item.doBehavior(...args);
}
});
}

27
src/core/behavior/index.js

@ -1,3 +1,26 @@
import { HighlightBehavior } from "./behavior.highlight";
import { RedMarkBehavior } from "./behavior.redmark";
export const BehaviorFactory = {
createBehavior (key, options) {
let Behavior;
switch (key) {
case "highlight":
Behavior = HighlightBehavior;
break;
case "redmark":
Behavior = RedMarkBehavior;
break;
default:
}
return new Behavior(options);
},
};
export { Behavior } from "./0.behavior";
export { HighlightBehavior } from "./behavior.highlight";
export { RedMarkBehavior } from "./behavior.redmark";
export {
HighlightBehavior,
RedMarkBehavior
};

9
src/core/constant/events.js

@ -1,9 +1,7 @@
/**
* 事件集合
* @class BI.Events
*/
BI._.extend(BI, {
Events: {
export const Events = {
/**
* @static
@ -439,6 +437,5 @@ BI._.extend(BI, {
* @static
* @property 邮件发送后事件
*/
AEMAIL: "afteremail"
}
});
AEMAIL: "afteremail",
};

2
src/core/constant/index.js

@ -0,0 +1,2 @@
export { Events } from "./events";
export * from "./var";

141
src/core/constant/var.js

@ -1,50 +1,22 @@
/**
* 常量
*/
import { isNumber } from "../2.base";
BI._.extend(BI, {
MAX: 0xfffffffffffffff,
MIN: -0xfffffffffffffff,
EVENT_RESPONSE_TIME: 200,
EVENT_BLUR: true,
zIndex_layer: 1e5,
zIndex_popover: 1e6,
zIndex_popup: 1e7,
zIndex_masker: 1e8,
zIndex_tip: 1e9,
emptyStr: "",
pixUnit: "px",
pixRatio: 1,
// 一定返回最终的单位
pixFormat: function (pix, border) {
if (!BI.isNumber(pix)) {
return pix;
}
if (BI.pixUnit === "px") {
return (pix / BI.pixRatio - (border || 0)) + BI.pixUnit;
}
var length = pix / BI.pixRatio + BI.pixUnit;
if (border > 0) {
return `calc(${length} - ${border + "px"})`;
}
return length;
},
toPix: function (pix, border) {
if (!BI.isNumber(pix)) {
return pix;
}
if (BI.pixUnit === "px") {
return pix - (border || 0) * BI.pixRatio;
}
if (border > 0) {
return `calc(${pix / BI.pixRatio + BI.pixUnit} - ${border + "px"})`;
}
return pix;
},
emptyFn: function () {
},
empty: null,
Key: {
export const MAX = 0xfffffffffffffff;
export const MIN = -0xfffffffffffffff;
export const EVENT_RESPONSE_TIME = 200;
export const EVENT_BLUR = true;
export const zIndex_layer = 1e5;
export const zIndex_popover = 1e6;
export const zIndex_popup = 1e7;
export const zIndex_masker = 1e8;
export const zIndex_tip = 1e9;
export const emptyStr = "";
export const pixUnit = "px";
export const pixRatio = 1;
export const empty = null;
export const Key = {
48: "0",
49: "1",
50: "2",
@ -95,9 +67,9 @@ BI._.extend(BI, {
107: "+",
109: "-",
110: ".",
111: "/"
},
KeyCode: {
111: "/",
};
export const KeyCode = {
BACKSPACE: 8,
COMMA: 188,
DELETE: 46,
@ -119,9 +91,9 @@ BI._.extend(BI, {
RIGHT: 39,
SPACE: 32,
TAB: 9,
UP: 38
},
Status: {
UP: 38,
};
export const Status = {
SUCCESS: 1,
WRONG: 2,
START: 3,
@ -130,38 +102,69 @@ BI._.extend(BI, {
READY: 6,
RUNNING: 7,
OUTOFBOUNDS: 8,
NULL: -1
},
Direction: {
NULL: -1,
};
export const Direction = {
Top: "top",
Bottom: "bottom",
Left: "left",
Right: "right",
Custom: "custom"
},
Axis: {
Custom: "custom",
};
export const Axis = {
Vertical: "vertical",
Horizontal: "horizontal"
},
Selection: {
Horizontal: "horizontal",
};
export const Selection = {
Default: -2,
None: -1,
Single: 0,
Multi: 1,
All: 2
},
HorizontalAlign: {
All: 2,
};
export const HorizontalAlign = {
Left: "left",
Right: "right",
Center: "center",
Stretch: "stretch"
},
VerticalAlign: {
Stretch: "stretch",
};
export const VerticalAlign = {
Middle: "middle",
Top: "top",
Bottom: "bottom",
Stretch: "stretch"
},
StartOfWeek: 1,
BlankSplitChar: "\u200b \u200b",
});
Stretch: "stretch",
};
export const StartOfWeek = 1;
export const BlankSplitChar = "\u200b \u200b";
// 一定返回最终的单位
export function pixFormat(pix, border) {
if (!isNumber(pix)) {
return pix;
}
if (pixUnit === "px") {
return (pix / pixRatio - (border || 0)) + pixUnit;
}
const length = pix / pixRatio + pixUnit;
if (border > 0) {
return `calc(${length} - ${`${border}px`})`;
}
return length;
}
export function toPix(pix, border) {
if (!isNumber(pix)) {
return pix;
}
if (pixUnit === "px") {
return pix - (border || 0) * pixRatio;
}
if (border > 0) {
return `calc(${pix / pixRatio + pixUnit} - ${`${border}px`})`;
}
return pix;
}
export function emptyFn() {}

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

@ -2,11 +2,9 @@
* guy
* 控制器
* Controller层超类
* @class BI.Controller
* @extends BI.OB
* @abstract
*/
import { OB } from "../3.ob";
export class Controller extends OB {
static EVENT_CHANGE = "__EVENT_CHANGE__";
}

9
src/core/controller/controller.broadcast.js

@ -2,9 +2,10 @@
* 广播
*
* Created by GUY on 2015/12/23.
* @class
*/
import { Controller } from "./0.controller";
import { each, remove } from "../2.base";
export class BroadcastController extends Controller {
init() {
this._broadcasts = {};
@ -15,23 +16,25 @@ export class BroadcastController extends Controller {
this._broadcasts[name] = [];
}
this._broadcasts[name].push(fn);
return () => this.remove(name, fn);
}
send(name) {
const args = [].slice.call(arguments, 1);
BI.each(this._broadcasts[name], (i, fn) => fn.apply(null, args));
each(this._broadcasts[name], (i, fn) => fn(...args));
}
remove(name, fn) {
if (fn) {
BI.remove(this._broadcasts[name], (index, cb) => fn === cb);
remove(this._broadcasts[name], (index, cb) => fn === cb);
if (this._broadcasts[name].length === 0) {
delete this._broadcasts[name];
}
} else {
delete this._broadcasts[name];
}
return this;
}
}

38
src/core/controller/controller.bubbles.js

@ -3,9 +3,11 @@
* 控制气泡图的显示方向
*
* Created by GUY on 2015/8/21.
* @class
*/
import { Controller } from "./0.controller";
import { isNotNull, each } from "../2.base";
import { createWidget } from "../5.inject";
export class BubblesController extends Controller {
init() {
this.storeBubbles = {};
@ -30,12 +32,12 @@ export class BubblesController extends Controller {
// const fixed = opt.fixed !== false;
if (!this.storeBubbles[name]) {
this.storeBubbles[name] = BI.createWidget({
this.storeBubbles[name] = createWidget({
type: "bi.text",
cls: "bi-bubble" + " bubble-" + level,
text: text,
cls: `bi-bubble bubble-${level}`,
text,
hgap: 5,
height: 18
height: 18,
});
}
const bubble = this.storeBubbles[name];
@ -43,14 +45,14 @@ export class BubblesController extends Controller {
bubble.setText(text);
}
BI.createWidget({
createWidget({
type: "bi.default",
element: container,
items: [
{
el: bubble
el: bubble,
}
]
],
});
if (this.storePoppers[name]) {
this.storePoppers[name].destroy();
@ -59,32 +61,34 @@ export class BubblesController extends Controller {
placement: ({
left: "top-start",
center: "top",
right: "top-end"
right: "top-end",
})[offsetStyle],
strategy: "fixed",
modifiers: [
{
name: "offset",
options: {
offset: [adjustXOffset, adjustYOffset]
}
offset: [adjustXOffset, adjustYOffset],
},
},
{
name: "preventOverflow",
enabled: false
enabled: false,
}
]
],
});
return this;
}
hide(name) {
this.remove(name);
return this;
}
has(name) {
return this.storeBubbles[name] != null;
return isNotNull(this.storeBubbles[name]);
}
remove(name) {
@ -94,14 +98,16 @@ export class BubblesController extends Controller {
this.storeBubbles[name].destroy();
this.storePoppers[name] && this.storePoppers[name].destroy();
delete this.storeBubbles[name];
return this;
}
removeAll() {
BI.each(this.storeBubbles, (name, bubble) => bubble.destroy());
BI.each(this.storePoppers, (name, popper) => popper.destroy());
each(this.storeBubbles, (name, bubble) => bubble.destroy());
each(this.storePoppers, (name, popper) => popper.destroy());
this.storeBubbles = {};
this.storePoppers = {};
return this;
}
}

38
src/core/controller/controller.drawer.js

@ -1,10 +1,11 @@
/**
* guy
* popover弹出层控制器, z-index在100w层级
* @class BI.popoverController
* @extends BI.Controller
*/
import { Controller } from "./0.controller";
import { each, isNotNull } from "../2.base";
import { createWidget } from "../5.inject";
export class DrawerController extends Controller {
constructor() {
super();
@ -13,7 +14,7 @@ export class DrawerController extends Controller {
}
props = {
modal: true, // 模态窗口
render: "body"
render: "body",
}
init() {
@ -28,15 +29,15 @@ export class DrawerController extends Controller {
if (this.has(name)) {
return this;
}
const popover = BI.createWidget(options || {}, {
type: "bi.drawer"
const popover = createWidget(options || {}, {
type: "bi.drawer",
}, context);
this.add(name, popover, options, context);
return this;
}
open(name) {
const o = this.options;
if (!this.has(name)) {
return this;
}
@ -59,6 +60,7 @@ export class DrawerController extends Controller {
const popover = this.get(name);
popover.show && popover.show();
}
return this;
}
@ -71,6 +73,7 @@ export class DrawerController extends Controller {
this.floatContainer[name].invisible();
this.modal && this.floatContainer[name].element.__releaseZIndexMask__(this.zindexMap[name]);
}
return this;
}
@ -91,23 +94,23 @@ export class DrawerController extends Controller {
if (this.has(name)) {
return this;
}
this.floatContainer[name] = BI.createWidget({
this.floatContainer[name] = createWidget({
type: "bi.absolute",
cls: "bi-popup-view",
items: [{
el: (this.floatLayer[name] = BI.createWidget({
el: (this.floatLayer[name] = createWidget({
type: "bi.absolute",
items: [popover]
items: [popover],
}, context)),
left: 0,
right: 0,
top: 0,
bottom: 0
}]
bottom: 0,
}],
});
this.floatManager[name] = popover;
popover.on(BI.Drawer.EVENT_CLOSE, () => this.close(name));
BI.createWidget({
createWidget({
type: "bi.absolute",
element: options.container || this.options.render,
items: [{
@ -115,9 +118,10 @@ export class DrawerController extends Controller {
left: 0,
right: 0,
top: 0,
bottom: 0
}]
bottom: 0,
}],
});
return this;
}
@ -126,7 +130,7 @@ export class DrawerController extends Controller {
}
has(name) {
return BI.isNotNull(this.floatManager[name]);
return isNotNull(this.floatManager[name]);
}
remove(name) {
@ -140,11 +144,12 @@ export class DrawerController extends Controller {
delete this.zindexMap[name];
delete this.floatContainer[name];
delete this.floatOpened[name];
return this;
}
removeAll() {
BI.each(this.floatContainer, (name, container) => {
each(this.floatContainer, (name, container) => {
container.destroy();
this.modal && this.floatContainer[name].element.__releaseZIndexMask__(this.zindexMap[name]);
});
@ -153,6 +158,7 @@ export class DrawerController extends Controller {
this.floatContainer = {};
this.floatOpened = {};
this.zindexMap = {};
return this;
}
}

55
src/core/controller/controller.layer.js

@ -2,9 +2,12 @@
* 弹出层面板控制器, z-index在10w层级
*
* Created by GUY on 2015/6/24.
* @class
*/
import { Controller } from "./0.controller";
import { isNull, isNotNull, each, keys, isWidget, isNotEmptyString, extend } from "../2.base";
import { Widget } from "../4.widget";
import { createWidget } from "../5.inject";
export class LayerController extends Controller {
constructor() {
super();
@ -12,7 +15,7 @@ export class LayerController extends Controller {
}
props = {
render: "body"
render: "body",
}
init() {
@ -22,11 +25,11 @@ export class LayerController extends Controller {
}
_initResizer() {
this.resizer = BI.Resizers.add("layerController" + BI.uniqueId(), BI.bind(this._resize, this));
this.resizer = BI.Resizers.add(`layerController${BI.uniqueId()}`, BI.bind(this._resize, this));
}
_resize() {
BI.each(this.layouts, function (i, layer) {
each(this.layouts, (i, layer) => {
if (layer.element.is(":visible")) {
layer.element.trigger("__resize__");
}
@ -34,37 +37,38 @@ export class LayerController extends Controller {
}
make(name, container, op, context) {
if (BI.isWidget(container)) {
if (isWidget(container)) {
op = op || {};
op.container = container;
} else {
context = op;
op = container;
}
return this.create(name, null, op, context);
}
create(name, from, op, context) {
BI.isNull(this.resizer) && this._initResizer();
isNull(this.resizer) && this._initResizer();
if (this.has(name)) {
return this.get(name);
}
op || (op = {});
const offset = op.offset || {};
let w = from;
if (BI.isWidget(from)) {
if (isWidget(from)) {
w = from.element;
}
if (BI.isNotEmptyString(w)) {
w = BI.Widget._renderEngine.createElement(w);
if (isNotEmptyString(w)) {
w = Widget._renderEngine.createElement(w);
}
if (this.has(name)) {
return this.get(name);
}
const widget = BI.createWidget((op.render || {}), BI.extend({
type: "bi.layout"
const widget = createWidget((op.render || {}), extend({
type: "bi.layout",
}, op), context);
const layout = BI.createWidget({
const layout = createWidget({
type: "bi.absolute",
invisible: true,
items: [
@ -73,11 +77,11 @@ export class LayerController extends Controller {
left: 0,
right: 0,
top: 0,
bottom: 0
bottom: 0,
}
]
],
}, context);
BI.createWidget({
createWidget({
type: "bi.absolute",
element: op.container || this.options.render,
items: [
@ -86,20 +90,19 @@ export class LayerController extends Controller {
left: offset.left || 0,
right: offset.right || 0,
top: offset.top || 0,
bottom: offset.bottom || 0
bottom: offset.bottom || 0,
}
]
],
});
if (w) {
layout.element.addClass("bi-popup-view");
function getComputedPosition() {
var css = {
const css = {
left: w.offset().left + (offset.left || 0),
top: w.offset().top + (offset.top || 0),
width: offset.width || (w.outerWidth() - (offset.left || 0) - (offset.right || 0)) || "",
height: offset.height || (w.outerHeight() - (offset.top || 0) - (offset.bottom || 0)) || ""
height: offset.height || (w.outerHeight() - (offset.top || 0) - (offset.bottom || 0)) || "",
};
const { top, left, scaleY, scaleX } = BI.DOM.getPositionRelativeContainingBlockRect(layout.element[0]);
@ -112,12 +115,13 @@ export class LayerController extends Controller {
layout.element.css(getComputedPosition());
layout.element.on("__resize__", function () {
layout.element.on("__resize__", () => {
w.is(":visible") &&
layout.element.css(getComputedPosition());
});
}
this.add(name, widget, layout);
return widget;
}
@ -127,6 +131,7 @@ export class LayerController extends Controller {
}
this._getLayout(name).visible();
this._getLayout(name).element.css("z-index", this.zindex++).show(0, callback).trigger("__resize__");
return this;
}
@ -136,6 +141,7 @@ export class LayerController extends Controller {
}
this._getLayout(name).invisible();
this._getLayout(name).element.hide(0, callback);
return this;
}
@ -151,6 +157,7 @@ export class LayerController extends Controller {
this.layerManager[name] = layer;
this.layouts[name] = layout;
layout.element.css("z-index", this.zindex++);
return this;
}
@ -163,7 +170,7 @@ export class LayerController extends Controller {
}
has(name) {
return this.layerManager[name] != null;
return isNotNull(this.layerManager[name]);
}
remove(name) {
@ -174,16 +181,18 @@ export class LayerController extends Controller {
this.layouts[name].destroy();
delete this.layerManager[name];
delete this.layouts[name];
return this;
}
removeAll() {
BI.each(BI.keys(this.layerManager), (index, name) => {
each(keys(this.layerManager), (index, name) => {
this.layerManager[name].destroy();
this.layouts[name].destroy();
});
this.layerManager = {};
this.layouts = {};
return this;
}
}

2
src/core/controller/controller.masker.js

@ -2,9 +2,9 @@
* 遮罩面板, z-index在1亿层级
*
* Created by GUY on 2015/6/24.
* @class
*/
import { LayerController } from "./controller.layer";
export class MaskersController extends LayerController {
init() {
super.init(arguments);

46
src/core/controller/controller.popover.js

@ -1,10 +1,12 @@
/**
* guy
* popover弹出层控制器, z-index在100w层级
* @class BI.popoverController
* @extends BI.Controller
*/
import { Controller } from "./0.controller";
import { isNotNull, each } from "../2.base";
import { Widget } from "../4.widget";
import { createWidget } from "../5.inject";
export class PopoverController extends Controller {
constructor() {
super();
@ -14,7 +16,7 @@ export class PopoverController extends Controller {
props = {
modal: true, // 模态窗口
render: "body"
render: "body",
}
init() {
@ -30,10 +32,11 @@ export class PopoverController extends Controller {
if (this.has(name)) {
return this;
}
const popover = BI.createWidget(options || {}, {
type: "bi.popover"
const popover = createWidget(options || {}, {
type: "bi.popover",
}, context);
this.add(name, popover, options, context);
return this;
}
@ -52,8 +55,8 @@ export class PopoverController extends Controller {
this.floatContainer[name].visible();
const popover = this.get(name);
popover.show && popover.show();
const W = BI.Widget._renderEngine.createElement(this.options.render).width(),
H = BI.Widget._renderEngine.createElement(this.options.render).height();
const W = Widget._renderEngine.createElement(this.options.render).width(),
H = Widget._renderEngine.createElement(this.options.render).height();
const w = popover.element.width(), h = popover.element.height();
let left = (W - w) / 2, top = (H - h) / 2;
if (left < 0) {
@ -64,10 +67,11 @@ export class PopoverController extends Controller {
}
popover.element.css({
// 这里直接用px就可以
left: left + "px",
top: top + "px"
left: `${left}px`,
top: `${top}px`,
});
}
return this;
}
@ -80,6 +84,7 @@ export class PopoverController extends Controller {
this.floatContainer[name].invisible();
this.modal && this.floatContainer[name].element.__releaseZIndexMask__(this.zindexMap[name]);
}
return this;
}
@ -100,23 +105,23 @@ export class PopoverController extends Controller {
if (this.has(name)) {
return this;
}
this.floatContainer[name] = BI.createWidget({
this.floatContainer[name] = createWidget({
type: "bi.absolute",
cls: "bi-popup-view",
items: [{
el: (this.floatLayer[name] = BI.createWidget({
el: (this.floatLayer[name] = createWidget({
type: "bi.absolute",
items: [popover]
items: [popover],
}, context)),
left: 0,
right: 0,
top: 0,
bottom: 0
}]
bottom: 0,
}],
});
this.floatManager[name] = popover;
popover.on(BI.Popover.EVENT_CLOSE, () => this.close(name));
BI.createWidget({
createWidget({
type: "bi.absolute",
element: options.container || this.options.render,
items: [{
@ -124,9 +129,10 @@ export class PopoverController extends Controller {
left: 0,
right: 0,
top: 0,
bottom: 0
}]
bottom: 0,
}],
});
return this;
}
@ -135,7 +141,7 @@ export class PopoverController extends Controller {
}
has(name) {
return BI.isNotNull(this.floatManager[name]);
return isNotNull(this.floatManager[name]);
}
remove(name) {
@ -149,11 +155,12 @@ export class PopoverController extends Controller {
delete this.zindexMap[name];
delete this.floatContainer[name];
delete this.floatOpened[name];
return this;
}
removeAll() {
BI.each(this.floatContainer, (name, container) => {
each(this.floatContainer, (name, container) => {
container.destroy();
this.modal && this.floatContainer[name].element.__releaseZIndexMask__(this.zindexMap[name]);
});
@ -162,6 +169,7 @@ export class PopoverController extends Controller {
this.floatContainer = {};
this.floatOpened = {};
this.zindexMap = {};
return this;
}

21
src/core/controller/controller.resizer.js

@ -2,49 +2,53 @@
* window.resize 控制器
*
* Created by GUY on 2015/6/24.
* @class
*/
import { Controller } from "./0.controller";
export class ResizeController extends Controller {
import { isNull, each, debounce, isNotNull, isFunction } from "../2.base";
import { Widget } from "../4.widget";
export class ResizeController extends Controller {
init() {
this.resizerManger = {};
}
_initResizeListener() {
this.resizeHandler = BI.debounce((ev) => this._resize(ev), 30);
this.resizeHandler = debounce(ev => this._resize(ev), 30);
if ("onorientationchange" in _global) {
_global.onorientationchange = this.resizeHandler;
} else {
BI.Widget._renderEngine.createElement(_global).resize(this.resizeHandler);
Widget._renderEngine.createElement(_global).resize(this.resizeHandler);
}
}
_resize(ev) {
BI.each(this.resizerManger, function (key, resizer) {
each(this.resizerManger, (key, resizer) => {
if (resizer instanceof BI.$) {
if (resizer.is(":visible")) {
resizer.trigger("__resize__");
}
return;
}
if (resizer instanceof BI.Layout) {
resizer.resize();
return;
}
if (BI.isFunction(resizer)) {
if (isFunction(resizer)) {
resizer(ev);
}
});
}
add(name, resizer) {
BI.isNull(this.resizeHandler) && this._initResizeListener();
isNull(this.resizeHandler) && this._initResizeListener();
if (this.has(name)) {
return this;
}
this.resizerManger[name] = resizer;
return () => this.remove(name);
}
@ -53,7 +57,7 @@ export class ResizeController extends Controller {
}
has(name) {
return this.resizerManger[name] != null;
return isNotNull(this.resizerManger[name]);
}
remove(name) {
@ -61,6 +65,7 @@ export class ResizeController extends Controller {
return this;
}
delete this.resizerManger[name];
return this;
}
}

40
src/core/controller/controller.tooltips.js

@ -3,10 +3,12 @@
* 控制tooltip的显示, 且页面中只有一个tooltip显示
*
* Created by GUY on 2015/9/8.
* @class BI.TooltipsController
* @extends BI.Controller
*/
import { Controller } from "./0.controller";
import { each, isNotNull } from "../2.base";
import { Widget } from "../4.widget";
import { createWidget } from "../5.inject";
export class TooltipsController extends Controller {
init() {
this.tooltipsManager = {};
@ -23,17 +25,17 @@ export class TooltipsController extends Controller {
* @private
*/
_createTooltip(opt) {
return BI.createWidget({
return createWidget({
type: "bi.tooltip",
...opt,
stopEvent: true
stopEvent: true,
});
}
// opt: {container: '', belowMouse: false}
show(e, name, tooltipOpt, context, opt) {
opt || (opt = {});
BI.each(this.showingTips, (i, tip) => this.hide(i));
each(this.showingTips, (i, tip) => this.hide(i));
this.showingTips = {};
if (!this.has(name)) {
this.create(name, tooltipOpt, document.fullscreenElement ? context : (opt.container || "body"));
@ -51,7 +53,7 @@ export class TooltipsController extends Controller {
const tooltip = this.get(name);
tooltip.element.css({
left: "0px",
top: "0px"
top: "0px",
});
tooltip.visible();
tooltip.element.height(tooltip.element[0].scrollHeight);
@ -60,10 +62,10 @@ export class TooltipsController extends Controller {
// const scale = context.element.offset().left / context.element.get(0).getBoundingClientRect().left;
// const x = (e.pageX || e.clientX) * scale + 15, y = (e.pageY || e.clientY) * scale + 15;
let x = (e.pageX || e.clientX) + 15, y = (e.pageY || e.clientY) + 15;
if (x + tooltip.element.outerWidth() > BI.Widget._renderEngine.createElement("body").outerWidth()) {
if (x + tooltip.element.outerWidth() > Widget._renderEngine.createElement("body").outerWidth()) {
x -= tooltip.element.outerWidth() + 15;
}
const bodyHeight = BI.Widget._renderEngine.createElement("body").outerHeight();
const bodyHeight = Widget._renderEngine.createElement("body").outerHeight();
if (y + tooltip.element.outerHeight() > bodyHeight || top + tooltip.element.outerHeight() > bodyHeight) {
y -= tooltip.element.outerHeight() + 15;
!opt.belowMouse && (y = Math.min(y, offset.top - tooltip.element.outerHeight() - 5));
@ -72,13 +74,14 @@ export class TooltipsController extends Controller {
}
tooltip.element.css({
// 这里直接用px就可以
left: x < 0 ? 0 : x + "px",
top: y < 0 ? 0 : y + "px"
left: x < 0 ? 0 : `${x}px`,
top: y < 0 ? 0 : `${y}px`,
});
tooltip.element.hover(() => {
this.remove(name);
context.element.trigger("mouseleave.title" + context.getName());
context.element.trigger(`mouseleave.title${context.getName()}`);
});
return this;
}
@ -89,6 +92,7 @@ export class TooltipsController extends Controller {
delete this.showingTips[name];
this.get(name).element.hide(0, callback);
this.get(name).invisible();
return this;
}
@ -96,15 +100,16 @@ export class TooltipsController extends Controller {
if (!this.has(name)) {
const tooltip = this._createTooltip(tooltipOpt);
this.add(name, tooltip);
BI.createWidget({
createWidget({
type: "bi.absolute",
element: context || "body",
items: [{
el: tooltip
}]
el: tooltip,
}],
});
tooltip.invisible();
}
return this.get(name);
}
@ -113,6 +118,7 @@ export class TooltipsController extends Controller {
return this;
}
this.set(name, bubble);
return this;
}
@ -125,7 +131,7 @@ export class TooltipsController extends Controller {
}
has(name) {
return this.tooltipsManager[name] != null;
return isNotNull(this.tooltipsManager[name]);
}
remove(name) {
@ -134,15 +140,17 @@ export class TooltipsController extends Controller {
}
this.tooltipsManager[name].destroy();
delete this.tooltipsManager[name];
return this;
}
removeAll() {
BI.each(this.tooltipsManager, function (name, tooltip) {
each(this.tooltipsManager, (name, tooltip) => {
tooltip.destroy();
});
this.tooltipsManager = {};
this.showingTips = {};
return this;
}
}

22
src/core/element/element.js

@ -1,4 +1,5 @@
import { registFunction } from './plugins';
import { registFunction } from "./plugins";
import { isWidget, isString } from "../2.base";
export function Element(widget, attribs) {
this.l = this.r = this.t = this.b = 0; // 边框
@ -10,18 +11,18 @@ export function Element(widget, attribs) {
this.attribs = attribs || {};
this.styles = {};
// 兼容处理
this['0'] = this;
this["0"] = this;
this.style = {};
if (!widget) {
this.nodeName = 'body';
this.nodeName = "body";
this.position.x = 0;
this.position.y = 0;
this.attribs.id = 'body';
} else if (BI.isWidget(widget)) {
this.attribs.id = "body";
} else if (isWidget(widget)) {
this.widget = widget;
this.nodeName = widget.options.tagName;
this.textBaseLine = widget.options.textBaseLine;
} else if (BI.isString(widget)) {
} else if (isString(widget)) {
this.nodeName = widget;
}
}
@ -34,7 +35,7 @@ function initElement(element) {
appendChild(child) {
child.parent = this;
if (this.children.push(child) !== 1) {
var sibling = this.children[this.children.length - 2];
const sibling = this.children[this.children.length - 2];
sibling.next = child;
child.prev = sibling;
child.next = null;
@ -43,7 +44,7 @@ function initElement(element) {
append(child) {
child.parent = this;
if (this.children.push(child) !== 1) {
var sibling = this.children[this.children.length - 2];
const sibling = this.children[this.children.length - 2];
sibling.next = child;
child.prev = sibling;
child.next = null;
@ -53,7 +54,8 @@ function initElement(element) {
return this.parent;
},
getSiblings() {
var parent = this.getParent();
const parent = this.getParent();
return parent ? parent.getChildren() : [this];
},
getChildren() {
@ -69,6 +71,6 @@ function initElement(element) {
},
height() {
}
},
};
}

26
src/core/element/index.js

@ -1,16 +1,16 @@
import { Element } from './element';
import { Element } from "./element";
import { isString, isWidget } from "../2.base";
BI.Element = Element;
BI.Element.renderEngine = {
createElement: (widget) => {
// eslint-disable-next-line no-undef
if (BI.isWidget(widget)) {
var o = widget.options;
Element.renderEngine = {
createElement: widget => {
if (isWidget(widget)) {
const o = widget.options;
if (o.element instanceof Element) {
return o.element;
}
if (typeof o.element === 'string' && o.element !== 'body') {
if (typeof o.element === "string" && o.element !== "body") {
o.root = false;
return new Element(widget);
}
@ -18,14 +18,16 @@ BI.Element.renderEngine = {
return new Element();
}
}
// eslint-disable-next-line no-undef
if (BI.isString(widget)) {
if (isString(widget)) {
return new Element(widget);
}
return new Element(widget);
},
createFragment() {
return new Element();
}
}
},
};
export { Element };

23
src/core/element/plugins/attr.js

@ -1,22 +1,25 @@
export const registAttrFun = (Element) => {
Element.registerFunction('attr', function (key, value) {
var self = this;
if (BI.isObject(key)) {
BI.each(key, (k, v) => {
self.attr(k, v);
import { isObject, each, isNull, isNotNull } from "../../2.base";
export const registAttrFun = Element => {
Element.registerFunction("attr", function (key, value) {
if (isObject(key)) {
each(key, (k, v) => {
this.attr(k, v);
});
return this;
}
if (BI.isNull(value)) {
if (isNull(value)) {
return this.attribs[key];
}
this.attribs[key] = value;
return this;
});
Element.registerFunction('hasAttrib', function (key) {
return this.attribs[key] != null;
Element.registerFunction("hasAttrib", function (key) {
return isNotNull(this.attribs[key]);
});
Element.registerFunction('removeAttr', function (key) {
Element.registerFunction("removeAttr", function (key) {
delete this.attribs[key];
});
};

26
src/core/element/plugins/class.js

@ -1,23 +1,23 @@
export const registClassFun = (Element) => {
Element.registerFunction('addClass', function (classList) {
var self = this;
BI.each(classList.split(' '), (i, cls) => {
if (cls && !self.classMap[cls]) {
self.classList.push(cls);
export const registClassFun = Element => {
Element.registerFunction("addClass", function (classList) {
BI.each(classList.split(" "), (i, cls) => {
if (cls && !this.classMap[cls]) {
this.classList.push(cls);
}
cls && (self.classMap[cls] = true);
cls && (this.classMap[cls] = true);
});
return this;
});
Element.registerFunction('removeClass', function (classList) {
var self = this;
BI.each(classList.split(' '), (i, cls) => {
if (cls && self.classMap[cls]) {
delete self.classMap[cls];
self.classList.splice(self.classList.indexOf(cls), 1);
Element.registerFunction("removeClass", function (classList) {
BI.each(classList.split(" "), (i, cls) => {
if (cls && this.classMap[cls]) {
delete this.classMap[cls];
this.classList.splice(this.classList.indexOf(cls), 1);
}
});
return this;
});
};

22
src/core/element/plugins/css.js

@ -1,22 +1,26 @@
export const registCssFun = (Element) => {
Element.registerFunction('css', function (key, value) {
var self = this;
if (BI.isObject(key)) {
BI.each(key, (k, v) => {
self.css(k, v);
import { isNull, isObject, each, trim, camelize } from "../../2.base";
export const registCssFun = Element => {
Element.registerFunction("css", function (key, value) {
if (isObject(key)) {
each(key, (k, v) => {
this.css(k, v);
});
return this;
}
key = BI.trim(BI.camelize(key));
key = trim(camelize(key));
return css(this, key, value);
});
};
const css = (elem, key, value) => {
key = BI.trim(BI.camelize(key));
if (BI.isNull(value)) {
key = trim(camelize(key));
if (isNull(value)) {
return elem.styles[key];
}
elem.styles[key] = value;
return elem;
};

9
src/core/element/plugins/data.js

@ -1,12 +1,15 @@
export const registDataFun = (Element) => {
Element.registerFunction('data', function (key, value) {
import { isNull } from "../../2.base";
export const registDataFun = Element => {
Element.registerFunction("data", function (key, value) {
if (!this._data) {
this._data = {};
}
if (BI.isNull(value)) {
if (isNull(value)) {
return this._data[key];
}
this._data[key] = value;
return this;
});
};

7
src/core/element/plugins/empty.js

@ -1,9 +1,10 @@
export const registEmptyFun = (Element) => {
Element.registerFunction('empty', function (text) {
export const registEmptyFun = Element => {
Element.registerFunction("empty", function (text) {
this.children = [];
return this;
});
Element.registerFunction('destroy', function (text) {
Element.registerFunction("destroy", function (text) {
return this;
});
};

55
src/core/element/plugins/event.js

@ -1,32 +1,33 @@
var returnThis = function () {
function returnThis () {
return this;
};
export const registEventFun = (Element) => {
}
export const registEventFun = Element => {
[
'mousedown',
'mouseup',
'mousewheel',
'keydown',
'keyup',
'focus',
'focusin',
'focusout',
'click',
'on',
'off',
'bind',
'unbind',
'trigger',
'hover',
'scroll',
'scrollLeft',
'scrollTop',
'resize',
'show',
'hide',
'dblclick',
'blur',
].forEach((event) => {
"mousedown",
"mouseup",
"mousewheel",
"keydown",
"keyup",
"focus",
"focusin",
"focusout",
"click",
"on",
"off",
"bind",
"unbind",
"trigger",
"hover",
"scroll",
"scrollLeft",
"scrollTop",
"resize",
"show",
"hide",
"dblclick",
"blur"
].forEach(event => {
Element.registerFunction(event, returnThis);
});
};

16
src/core/element/plugins/html.js

@ -1,15 +1,19 @@
export const registHtmlFun = (Element) => {
Element.registerFunction('html', function (text) {
if (text && text.charAt(0) === '<') {
BI.createWidget({
type: 'bi.html',
import { createWidget } from "../../5.inject";
import { htmlDecode } from "../../func";
export const registHtmlFun = Element => {
Element.registerFunction("html", function (text) {
if (text && text.charAt(0) === "<") {
createWidget({
type: "bi.html",
element: this.widget,
html: text,
});
this.originalHtml = text;
} else {
this.text = BI.htmlDecode(text);
this.text = htmlDecode(text);
}
return this;
});
};

28
src/core/element/plugins/index.js

@ -1,18 +1,18 @@
import { registAttrFun } from './attr';
import { registClassFun } from './class';
import { registCssFun } from './css';
import { registDataFun } from './data';
import { registEmptyFun } from './empty';
import { registEventFun } from './event';
import { registHtmlFun } from './html';
import { registKeywordMarkFun } from './keywordMark';
import { registRenderToHtmlFun } from './renderToHtml';
import { registRenderToStringFun } from './renderToString';
import { registTextFun } from './text';
import { registValFun } from './val';
import { registAttrFun } from "./attr";
import { registClassFun } from "./class";
import { registCssFun } from "./css";
import { registDataFun } from "./data";
import { registEmptyFun } from "./empty";
import { registEventFun } from "./event";
import { registHtmlFun } from "./html";
import { registKeywordMarkFun } from "./keywordMark";
import { registRenderToHtmlFun } from "./renderToHtml";
import { registRenderToStringFun } from "./renderToString";
import { registTextFun } from "./text";
import { registValFun } from "./val";
export const registFunction = (Element) => {
var functionMap = {};
export const registFunction = Element => {
const functionMap = {};
Element.registerFunction = (key, fn) => {
Element.prototype[key] = functionMap[key] = fn;
};

5
src/core/element/plugins/keywordMark.js

@ -1,6 +1,7 @@
export const registKeywordMarkFun = (Element) => {
Element.registerFunction('__textKeywordMarked__', function (text) {
export const registKeywordMarkFun = Element => {
Element.registerFunction("__textKeywordMarked__", function (text) {
this[0].textContent = text;
return this;
});
};

58
src/core/element/plugins/renderToHtml.js

@ -1,65 +1,69 @@
var skipArray = [];
var pxStyle = ['font-size', 'width', 'height'];
var _renderToHtml = function (root) {
var str = '';
if (BI.isNull(root.originalHtml)) {
if (root.tag !== 'body') {
import { each, isNull, hyphenate, isNumeric, isKey } from "../../2.base";
const skipArray = [];
const pxStyle = ["font-size", "width", "height"];
function _renderToHtml(root) {
let str = "";
if (isNull(root.originalHtml)) {
if (root.tag !== "body") {
str += `<${root.tag}`;
if (root.classList.length > 0) {
str += ' class="';
BI.each(root.classList, (i, cls) => {
str += " class=\"";
each(root.classList, (i, cls) => {
str += ` ${cls}`;
});
str += '"';
str += "\"";
}
str += ' style="';
BI.each(root.originalStyles, (key, stl) => {
str += " style=\"";
each(root.originalStyles, (key, stl) => {
if (
skipArray.contains(key) ||
(key == 'height' && root.classList.contains('bi-design-components-data-data-table-cell'))
(key === "height" && root.classList.contains("bi-design-components-data-data-table-cell"))
) {
return;
}
key = BI.hyphenate(key);
if (key === 'font-family') {
stl = stl.replace(/\"/g, '');
key = hyphenate(key);
if (key === "font-family") {
stl = stl.replace(/"/g, "");
}
if (pxStyle.contains(key) && BI.isNumeric(stl)) {
stl += 'px';
if (pxStyle.contains(key) && isNumeric(stl)) {
stl += "px";
}
if (BI.isKey(stl)) {
if (isKey(stl)) {
str += ` ${key}:${stl};`;
}
});
str += '"';
BI.each(root.attribs, (key, attr) => {
if (BI.isKey(attr)) {
str += "\"";
each(root.attribs, (key, attr) => {
if (isKey(attr)) {
str += ` ${key}=${attr}`;
}
});
if (root.textContent) {
str += ` title=${root.textContent}`;
}
str += '>';
str += ">";
}
// 特殊处理,spread_table的行列元素是不取配置里的高度的,使用stretch拉伸的(leaves取了高度),但是功能代码里给单元格默认高度了,导致拉伸不了
// 而spread_grid_table的行列元素是取配置里的高度的,拉不拉伸都一样
BI.each(root.children, (i, child) => {
each(root.children, (i, child) => {
str += _renderToHtml(child);
});
} else {
str += root.originalHtml;
}
if (root.tag !== 'body') {
if (root.tag !== "body") {
if (root.textContent) {
str += root.textContent;
}
str += `</${root.tag}>`;
}
return str;
};
export const registRenderToHtmlFun = (Element) => {
Element.registerFunction('renderToHtml', function () {
}
export const registRenderToHtmlFun = Element => {
Element.registerFunction("renderToHtml", function () {
return _renderToHtml(this);
});
};

42
src/core/element/plugins/renderToString.js

@ -1,50 +1,54 @@
var skipArray = ['width', 'height'];
var _renderToString = function (root) {
var str = '';
if (root.nodeName !== 'body') {
import { each, hyphenate } from "../../2.base";
const skipArray = ["width", "height"];
function _renderToString(root) {
let str = "";
if (root.nodeName !== "body") {
str += `<${root.nodeName}`;
if (root.classList.length > 0) {
str += ' class="';
BI.each(root.classList, (i, cls) => {
str += " class=\"";
each(root.classList, (i, cls) => {
str += ` ${cls}`;
});
str += '"';
str += "\"";
}
str += ' style="';
BI.each(root.styles, (key, stl) => {
str += " style=\"";
each(root.styles, (key, stl) => {
if (skipArray.includes(key)) {
return;
}
key = BI.hyphenate(key);
key = hyphenate(key);
str += ` ${key}:${stl};`;
});
str += ` width:${root.width}px;`;
str += ` height:${root.height}px;`;
str += ' position: fixed;';
str += " position: fixed;";
str += ` left: ${root.position.x}px;`;
str += ` top: ${root.position.y}px;`;
str += '"';
BI.each(root.attribs, (key, attr) => {
str += "\"";
each(root.attribs, (key, attr) => {
str += ` ${key}:${attr}`;
});
str += '>';
str += ">";
}
BI.each(root.children, (i, child) => {
each(root.children, (i, child) => {
str += _renderToString(child);
});
// if (root.htmlContent) {
// str += root.htmlContent;
// }
if (root.nodeName !== 'body') {
if (root.nodeName !== "body") {
if (root.text) {
str += root.text;
}
str += `</${root.nodeName}>`;
}
return str;
};
export const registRenderToStringFun = (Element) => {
Element.registerFunction('renderToString', function () {
}
export const registRenderToStringFun = Element => {
Element.registerFunction("renderToString", function () {
return _renderToString(this);
});
};

8
src/core/element/plugins/text.js

@ -1,10 +1,12 @@
export const registTextFun = (Element) => {
Element.registerFunction('setText', function (text) {
export const registTextFun = Element => {
Element.registerFunction("setText", function (text) {
this.text = text;
return this;
});
Element.registerFunction('setValue', function (text) {
Element.registerFunction("setValue", function (text) {
this.text = text;
return this;
});
};

6
src/core/element/plugins/val.js

@ -1,9 +1,11 @@
export const registValFun = (Element) => {
Element.registerFunction('val', function (value) {
export const registValFun = Element => {
Element.registerFunction("val", function (value) {
if (BI.isNotNull(value)) {
this.text = `${value}`;
return this;
}
return this.text;
});
};

14
src/core/index.js

@ -12,6 +12,9 @@ import * as structure from "./structure";
import { StyleLoaderManager } from "./loader/loader.style";
import { ShowListener } from "./listener/listener.show";
import { useInWorker } from "./worker";
import * as constant from "./constant";
import * as logic from "./logic";
import { Element } from "./element";
export * from "./decorator";
export * from "./2.base";
@ -24,15 +27,15 @@ export * from "./controller";
export * from "./func";
export * from "./structure";
export * from "./h";
// 有了后删掉
export const emptyFn = () => { };
export * from "./constant";
export * from "./logic";
export {
StyleLoaderManager,
ShowListener,
Plugin,
useInWorker
useInWorker,
Element
};
Object.assign(BI, {
@ -42,12 +45,15 @@ Object.assign(BI, {
...inject,
Plugin,
...behavior,
...constant,
component: inject.shortcut,
...action,
...controllers,
Element,
...func,
StyleLoaderManager,
ShowListener,
...logic,
...structure,
useInWorker,
...h,

20
src/core/listener/listener.show.js

@ -1,14 +1,12 @@
/**
* guy
* 检测某个Widget的EventChange事件然后去show某个card
* @type {*|void|Object}
* @class BI.ShowListener
* @extends BI.OB
*/
import { OB } from "../3.ob";
import { isArray, isNull, nextTick, } from "../2.base";
import { isArray, isNull, nextTick } from "../2.base";
import { createWidget } from "../5.inject";
import { Controller } from "../controller/0.controller";
import { Events, emptyFn } from "../constant";
export class ShowListener extends OB {
static EVENT_CHANGE = "EVENT_CHANGE";
@ -17,12 +15,10 @@ export class ShowListener extends OB {
return {
eventObj: createWidget(),
cardLayout: null,
cardNameCreator: (v) => {
return v;
},
cardCreator: BI.emptyFn,
afterCardCreated: BI.emptyFn,
afterCardShow: BI.emptyFn
cardNameCreator: v => v,
cardCreator: emptyFn,
afterCardCreated: emptyFn,
afterCardShow: emptyFn,
};
}
@ -30,13 +26,13 @@ export class ShowListener extends OB {
const { eventObj, cardLayout, afterCardCreated, cardNameCreator, cardCreator, afterCardShow } = this.options;
if (eventObj) {
eventObj.on(Controller.EVENT_CHANGE, (type, v, ob) => {
if (type === BI.Events.CLICK) {
if (type === Events.CLICK) {
v = v || eventObj.getValue();
v = isArray(v) ? (v.length > 1 ? v.toString() : v[0]) : v;
if (isNull(v)) {
throw new Error("不能为null");
}
var cardName = cardNameCreator(v);
const cardName = cardNameCreator(v);
if (!cardLayout.isCardExisted(cardName)) {
const card = cardCreator(cardName);
cardLayout.addCardByName(cardName, card);

7
src/core/loader/loader.style.js

@ -2,13 +2,13 @@
* style加载管理器
*
* Created by GUY on 2015/9/7.
* @class
*/
import { extend, isNotNull } from "../2.base";
import { OB } from "../3.ob";
export class StyleLoaderManager extends OB {
_defaultConfig() {
return BI.extend(super._defaultConfig(arguments), {});
return extend(super._defaultConfig(arguments), {});
}
_init() {
@ -38,7 +38,7 @@ export class StyleLoaderManager extends OB {
}
has(name) {
return this.stylesManager[name] != null;
return isNotNull(this.stylesManager[name]);
}
removeStyle(name) {
@ -47,6 +47,7 @@ export class StyleLoaderManager extends OB {
}
this.stylesManager[name].parentNode.removeChild(this.stylesManager[name]);
delete this.stylesManager[name];
return this;
}
}

83
src/core/logic/index.js

@ -0,0 +1,83 @@
import { Logic } from "./logic";
import { VerticalLayoutLogic, HorizontalLayoutLogic, TableLayoutLogic, HorizontalFillLayoutLogic } from "./logic.layout";
export const LogicFactory = {
Type: {
Vertical: "vertical",
Horizontal: "horizontal",
Table: "table",
HorizontalFill: "horizontal_fill",
},
createLogic (key, options) {
let LogicCls;
switch (key) {
case LogicFactory.Type.Vertical:
LogicCls = VerticalLayoutLogic;
break;
case LogicFactory.Type.Horizontal:
LogicCls = HorizontalLayoutLogic;
break;
case LogicFactory.Type.Table:
LogicCls = TableLayoutLogic;
break;
case LogicFactory.Type.HorizontalFill:
LogicCls = HorizontalFillLayoutLogic;
break;
default:
LogicCls = Logic;
break;
}
return new LogicCls(options).createLogic();
},
createLogicTypeByDirection (direction) {
switch (direction) {
case BI.Direction.Top:
case BI.Direction.Bottom:
case BI.Direction.Custom:
return BI.LogicFactory.Type.Vertical;
case BI.Direction.Left:
case BI.Direction.Right:
return BI.LogicFactory.Type.Horizontal;
default:
}
},
createLogicItemsByDirection (direction) {
let items = Array.prototype.slice.call(arguments, 1);
items = BI.map(items, (i, item) => {
if (BI.isWidget(item)) {
return {
el: item,
width: item.options.width,
height: item.options.height,
};
}
return item;
});
switch (direction) {
case BI.Direction.Bottom:
items.reverse();
break;
case BI.Direction.Right:
items.reverse();
break;
case BI.Direction.Custom:
items = items.slice(1);
break;
default:
}
return items;
},
};
export {
Logic,
VerticalLayoutLogic,
HorizontalLayoutLogic,
TableLayoutLogic,
HorizontalFillLayoutLogic
};

80
src/core/logic/logic.js

@ -1,80 +1,8 @@
/**
* @class BI.Logic
* @extends BI.OB
*/
BI.Logic = BI.inherit(BI.OB, {
createLogic: function () {
return this.options || {};
}
});
BI.LogicFactory = {
Type: {
Vertical: "vertical",
Horizontal: "horizontal",
Table: "table",
HorizontalFill: "horizontal_fill"
},
createLogic: function (key, options) {
var logic;
switch (key) {
case BI.LogicFactory.Type.Vertical:
logic = BI.VerticalLayoutLogic;
break;
case BI.LogicFactory.Type.Horizontal:
logic = BI.HorizontalLayoutLogic;
break;
case BI.LogicFactory.Type.Table:
logic = BI.TableLayoutLogic;
break;
case BI.LogicFactory.Type.HorizontalFill:
logic = BI.HorizontalFillLayoutLogic;
break;
default:
logic = BI.Logic;
break;
}
return new logic(options).createLogic();
},
import { OB } from "../3.ob";
createLogicTypeByDirection: function (direction) {
switch (direction) {
case BI.Direction.Top:
case BI.Direction.Bottom:
case BI.Direction.Custom:
return BI.LogicFactory.Type.Vertical;
case BI.Direction.Left:
case BI.Direction.Right:
return BI.LogicFactory.Type.Horizontal;
}
},
createLogicItemsByDirection: function (direction) {
var layout;
var items = Array.prototype.slice.call(arguments, 1);
items = BI.map(items, function (i, item) {
if (BI.isWidget(item)) {
return {
el: item,
width: item.options.width,
height: item.options.height
};
}
return item;
});
switch (direction) {
case BI.Direction.Bottom:
layout = BI.LogicFactory.Type.Vertical;
items.reverse();
break;
case BI.Direction.Right:
layout = BI.LogicFactory.Type.Horizontal;
items.reverse();
break;
case BI.Direction.Custom:
items = items.slice(1);
break;
export class Logic extends OB {
createLogic() {
return this.options || {};
}
return items;
}
};

109
src/core/logic/logic.layout.js

@ -1,13 +1,13 @@
import { Logic } from "./logic";
import { isNotNull, each, pickBy } from "../2.base";
/**
* guy
* 上下布局逻辑
* 上下布局的时候要考虑到是动态布局还是静态布局
*
* @class BI.VerticalLayoutLogic
* @extends BI.Logic
*/
BI.VerticalLayoutLogic = BI.inherit(BI.Logic, {
props: function () {
export class VerticalLayoutLogic extends Logic {
props() {
return {
dynamic: false,
scrollable: null,
@ -21,18 +21,20 @@ BI.VerticalLayoutLogic = BI.inherit(BI.Logic, {
tgap: 0,
bgap: 0,
innerVgap: 0,
innerHgap: 0
innerHgap: 0,
};
},
}
createLogic: function () {
var layout, o = this.options;
createLogic() {
let layout;
const o = this.options;
if (o.dynamic) {
layout = "bi.vertical";
} else {
layout = "bi.vtape";
}
return BI._.pickBy({
return pickBy({
type: layout,
scrollable: o.scrollable,
scrolly: o.scrolly,
@ -49,22 +51,19 @@ BI.VerticalLayoutLogic = BI.inherit(BI.Logic, {
horizontalAlign: o.horizontalAlign,
verticalAlign: o.verticalAlign,
columnSize: o.columnSize,
rowSize: o.rowSize
}, BI.isNotNull);
rowSize: o.rowSize,
}, isNotNull);
}
}
});
/**
* guy
* 左右布局逻辑
* 左右布局的时候要考虑到是动态布局还是静态布局
*
* @class BI.HorizontalLayoutLogic
* @extends BI.Logic
*/
BI.HorizontalLayoutLogic = BI.inherit(BI.Logic, {
props: function () {
export class HorizontalLayoutLogic extends Logic {
props() {
return {
dynamic: false,
scrollable: null,
@ -78,18 +77,20 @@ BI.HorizontalLayoutLogic = BI.inherit(BI.Logic, {
tgap: 0,
bgap: 0,
innerVgap: 0,
innerHgap: 0
innerHgap: 0,
};
},
}
createLogic: function () {
var layout, o = this.options;
createLogic() {
let layout;
const o = this.options;
if (o.dynamic) {
layout = "bi.vertical_adapt";
} else {
layout = "bi.htape";
}
return BI._.pickBy({
return pickBy({
type: layout,
scrollable: o.scrollable,
scrolly: o.scrolly,
@ -106,21 +107,18 @@ BI.HorizontalLayoutLogic = BI.inherit(BI.Logic, {
horizontalAlign: o.horizontalAlign,
verticalAlign: o.verticalAlign,
columnSize: o.columnSize,
rowSize: o.rowSize
}, BI.isNotNull);
rowSize: o.rowSize,
}, isNotNull);
}
}
});
/**
* guy
* 表格布局逻辑
* 表格布局的时候要考虑到是动态布局还是静态布局
*
* @class BI.TableLayoutLogic
* @extends BI.OB
*/
BI.TableLayoutLogic = BI.inherit(BI.Logic, {
props: function () {
export class TableLayoutLogic extends Logic {
props() {
return {
dynamic: false,
scrollable: null,
@ -132,18 +130,20 @@ BI.TableLayoutLogic = BI.inherit(BI.Logic, {
rowSize: [],
hgap: 0,
vgap: 0,
items: []
items: [],
};
},
}
createLogic: function () {
var layout, o = this.options;
createLogic() {
let layout;
const o = this.options;
if (o.dynamic) {
layout = "bi.table";
} else {
layout = "bi.window";
}
return BI._.pickBy({
return pickBy({
type: layout,
scrollable: o.scrollable,
scrolly: o.scrolly,
@ -156,20 +156,17 @@ BI.TableLayoutLogic = BI.inherit(BI.Logic, {
horizontalAlign: o.horizontalAlign,
verticalAlign: o.verticalAlign,
columnSize: o.columnSize,
rowSize: o.rowSize
}, BI.isNotNull);
rowSize: o.rowSize,
}, isNotNull);
}
}
});
/**
* guy
* 左右充满布局逻辑
*
* @class BI.HorizontalFillLayoutLogic
* @extends BI.Logic
*/
BI.HorizontalFillLayoutLogic = BI.inherit(BI.Logic, {
props: function () {
export class HorizontalFillLayoutLogic extends Logic {
props() {
return {
dynamic: false,
scrollable: null,
@ -183,14 +180,15 @@ BI.HorizontalFillLayoutLogic = BI.inherit(BI.Logic, {
tgap: 0,
bgap: 0,
innerVgap: 0,
innerHgap: 0
innerHgap: 0,
};
},
}
createLogic: function () {
var layout, o = this.options;
var columnSize = [];
BI.each(o.items, function (i, item) {
createLogic() {
let layout;
const o = this.options;
const columnSize = [];
each(o.items, (i, item) => {
columnSize.push(item.width || 0);
});
if (o.dynamic) {
@ -198,7 +196,8 @@ BI.HorizontalFillLayoutLogic = BI.inherit(BI.Logic, {
} else {
layout = "bi.htape";
}
return BI._.pickBy({
return pickBy({
type: layout,
scrollable: o.scrollable,
scrolly: o.scrolly,
@ -214,8 +213,8 @@ BI.HorizontalFillLayoutLogic = BI.inherit(BI.Logic, {
items: o.items,
horizontalAlign: o.horizontalAlign,
verticalAlign: o.verticalAlign,
columnSize: columnSize,
rowSize: o.rowSize
}, BI.isNotNull);
columnSize,
rowSize: o.rowSize,
}, isNotNull);
}
}
});

Loading…
Cancel
Save