efront 3.10.7 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33,7 +33,6 @@
33
33
  };
34
34
  var parseMenuList = function (items) {
35
35
  if (items instanceof Array) {
36
- console.log(items)
37
36
  return items;
38
37
  }
39
38
  if (items instanceof Object) {
@@ -1,8 +1,12 @@
1
1
  // 激活 自定义的 active 事件
2
- function active(target, value, item) {
2
+ function active(target, value, item, targetElement) {
3
3
  var activeEvent = createEvent("active");
4
4
  activeEvent.item = item;
5
5
  activeEvent.value = value;
6
+ if (targetElement) {
7
+ if (Object.defineProperty) Object.defineProperty(activeEvent, 'currentTarget', { value: targetElement });
8
+ else activeEvent.currentTarget = targetElement;
9
+ }
6
10
  activeEvent = dispatch(target, activeEvent);
7
11
  return activeEvent && !activeEvent.defaultPrevented;
8
12
  }
@@ -13,10 +13,9 @@ on("keydown")(window, function (event) {
13
13
  if (event.altKey) {
14
14
  var key = String.fromCharCode(which);
15
15
  var element = keyMap[key];
16
-
17
16
  if (element) {
18
17
  if (isMounted(element)) {
19
- dispatch(window, 'mousedown');
18
+ event.preventDefault();
20
19
  element.click();
21
20
  } else {
22
21
  delete keyMap[key];
@@ -148,20 +148,22 @@ function main(elem, mode) {
148
148
  case "x":
149
149
  case "horizonal":
150
150
  var direction = 'x';
151
+ mode = "horizonal";
151
152
  case "v":
152
153
  case "y":
153
154
  case "vertical":
154
- var emit = function (item) {
155
- active(elem, item, item.value);
155
+ var emit = function (item, target) {
156
+ active(elem, item, item.value, target);
156
157
  };
157
158
  if ("$src" in elem) {
158
159
  getGenerator(elem);
159
160
  care(elem, function (src) {
160
161
  menuList(elem, getTreeFromData(src), emit, direction);
161
162
  });
162
- } else {
163
+ }
164
+ else {
163
165
  var nodes = getArrayNodes(elem);
164
- elem = menuList(elem, nodes, emit);
166
+ elem = menuList(elem, nodes, emit, direction);
165
167
  }
166
168
  break;
167
169
  default:
@@ -94,10 +94,17 @@ body:active & {
94
94
  text-overflow: hidden;
95
95
  height: 40px;
96
96
  position: relative;
97
- border: 1px solid #18333c;
98
- background-color: #18333c;
99
- box-shadow: inset 0 0 12px #51ddf6, inset 0px -120px 120px -120px #51ddf6;
100
- border-right: none;
97
+ border-bottom: 1px solid #18333c;
98
+ padding: 0;
99
+
100
+ menu-item {
101
+ display: inline-block;
102
+
103
+ &.has-children:after {
104
+ padding-top: 3px;
105
+ content: "﹀";
106
+ }
107
+ }
101
108
 
102
109
  >div {
103
110
  vertical-align: top;
@@ -1,3 +1,3 @@
1
- <i ng-class="menu.icon" ng-if='useIcon||hasIcon||menu.icon'></i>
2
- <span ng-model="menu.name"></span>
1
+ <i ng-class="icon" ng-if='useIcon||hasIcon'></i>
2
+ <span ng-html="name"></span>
3
3
  <s></s>
@@ -1,11 +1,15 @@
1
1
  function main(elem, scope, hasIcon) {
2
2
  var item = elem || document.createElement('menu-item');
3
3
  item.innerHTML = menuItem;
4
- if (isObject(scope) && scope !== elem.$scope) {
5
- render(item, { menu: scope, useIcon: hasIcon, hasIcon })
4
+ if (isObject(scope) && scope !== item.$scope) {
6
5
  }
7
6
  else {
8
- extendIfNeeded(elem.$scope, { useIcon: false, hasIcon: false })
7
+ var scope = item.$scope;
9
8
  }
9
+ if (scope.menu) scope = scope.menu;
10
+ var name = scope.name;
11
+ var icon = scope.icon;
12
+ if (hasIcon === undefined) hasIcon = !!icon;
13
+ render(item.children, { useIcon: hasIcon, hasIcon, name, icon });
10
14
  return item;
11
15
  }
@@ -1,4 +1,4 @@
1
- <menu-item ng-repeat="menu in menus" ng-if="!menu.hidden" ng-click="open(menu,event)"
2
- ng-mouseleave="clearTimeout(popTimer)" ng-mouseenter="popTimer=popMenu(menu,event)"
1
+ <menu-item ng-repeat="menu in menus" ng-if="!menu.hidden" ng-click="open(menu,this)"
2
+ ng-mouseleave="clearTimeout(popTimer)" ng-mouseenter="popTimer=popMenu(menu,this)"
3
3
  ng-class="{'has-children':menu.children&&menu.children.length,'warn':menu.type==='danger'||menu.type==='warn'||menu.type==='red'}">
4
4
  </menu-item>
@@ -8,38 +8,52 @@ var release = function () {
8
8
  var clear = function () {
9
9
  clearTimeout(releaseTimer);
10
10
  };
11
+ var unfocus = function () {
12
+ remove(mounted_menus);
13
+ this.ispop = false;
14
+ };
11
15
  function main(page, items, active, direction = 'y') {
12
16
  if (!isNode(page)) {
13
17
  var page = div();
14
18
  }
15
19
  var main = this;
16
- function popMenu(item, event) {
20
+ if (direction !== 'x') page.ispop = true;
21
+ function popMenu(item, target) {
17
22
  if (page.active) {
18
23
  clear();
19
24
  remove(page.active);
20
25
  }
21
26
  if (!item.children || !item.children.length) return;
22
27
  var clone = template.cloneNode();
28
+ clone.$parentScopes = page.$parentScopes;
29
+ clone.$src = src;
23
30
  clone.innerHTML = template.innerHTML;
24
31
  var menu = main(clone, item.children, active);
25
32
  mounted_menus.push(menu);
26
-
27
33
  page.active = menu;
28
- popup(menu, event.target);
29
- var offleave0 = on("mouseleave")(event.target, release);
30
- var offenter0 = on("mouseenter")(event.target, clear);
31
- var offleave1 = on("mouseleave")(menu, release);
32
- var offenter1 = on("mouseenter")(menu, clear);
34
+ menu.root = page.root || page;
35
+ popup(menu, target);
36
+ if (page.ispop === true) {
37
+ var offleave0 = on("mouseleave")(target, release);
38
+ var offleave1 = on("mouseleave")(menu, release);
39
+ var offenter0 = on("mouseenter")(target, clear);
40
+ var offenter1 = on("mouseenter")(menu, clear);
41
+ } else {
42
+ page.ispop = 1;
43
+ page.tabIndex = 0;
44
+ page.focus();
45
+ }
46
+ on("mousedown")(menu, e => e.preventDefault());
33
47
  once("remove")(menu, function () {
34
- removeFromList(mounted_menus, page.active);
35
- offleave0();
36
- offenter0();
37
- offleave1();
38
- offenter1();
48
+ removeFromList(mounted_menus, this);
49
+ if (offleave0) offleave0();
50
+ if (offleave1) offleave1();
51
+ if (offenter0) offenter0();
52
+ if (offenter1) offenter1();
39
53
  });
40
54
  }
41
-
42
- var template = page.tempalte || page.cloneNode();
55
+ if (!page.ispop) on("blur")(page, unfocus);
56
+ var template = page.tempalte || document.createElement("ylist");
43
57
  if (!page.tempalte) {
44
58
  template.className = '';
45
59
  template.removeAttribute('mode');
@@ -47,7 +61,6 @@ function main(page, items, active, direction = 'y') {
47
61
  page.tempalte = template;
48
62
  }
49
63
  if (!page.children.length || page.menutype === 1) {
50
- page.innerHTML = menuList;
51
64
  page.menutype = 1;
52
65
  var hasIcon = function () {
53
66
  var menus = items;
@@ -58,26 +71,78 @@ function main(page, items, active, direction = 'y') {
58
71
  }
59
72
  return false;
60
73
  };
61
- render(page, {
62
- "menu-item": function () {
74
+ var $scope = {
75
+ "menu-item": function (e, s) {
63
76
  return button(
64
- menuItem.apply(null, arguments)
77
+ menuItem(e, s)
65
78
  );
66
79
  },
67
80
  menus: items,
68
81
  hasIcon: hasIcon(),
69
- open(menu, event) {
70
- active(menu, event);
82
+ open(menu, elem) {
83
+ var pop = active(menu, elem);
84
+ if (pop === false) return;
85
+ var root = page.root || page;
86
+ if (root.ispop === 1) root.ispop = false;
87
+ if (!mounted_menus.length) {
88
+ popMenu.apply(this, arguments);
89
+ }
90
+ else {
91
+ unfocus.call(page);
92
+ }
71
93
  },
72
94
  popTimer: 0,
73
95
  popMenu() {
96
+ if (!page.ispop) return;
74
97
  var args = arguments;
75
98
  return setTimeout(function () {
76
99
  popMenu.apply(null, args);
77
100
  }, 60);
78
101
  },
79
- });
80
- vbox(page);
102
+ };
103
+ if (page.$src) {
104
+ var src = page.$src;
105
+ var parentScopes = page.$parentScopes;
106
+ var itemName = src.itemName;
107
+ var className = `{'has-children':${itemName}.children&&${itemName}.children.length,'warn':${itemName}.type==='danger'||${itemName}.type==='warn'||${itemName}.type==='red'}`;
108
+ var notHidden = `!${itemName}.hidden`;
109
+ list(page, function (index) {
110
+ var item = items[index];
111
+ if (!item) return;
112
+ var a = menuItem(null, item, $scope.hasIcon);
113
+ var scope = {};
114
+ if (item instanceof Item) item = item.value;
115
+ if (src.itemName) scope[src.itemName] = item;
116
+ else scope.$item = item;
117
+ if (src.keyName) scope[src.keyName] = index;
118
+ else scope.$key = index;
119
+ if (src.indexName) scope[src.indexName] = index;
120
+ else scope.$index = index;
121
+ if (src.srcName) scope[src.srcName] = items;
122
+ if (src.itemName) a.setAttribute("e-if", notHidden);
123
+ on("mouseleave")(a, function () {
124
+ clearTimeout($scope.popTimer);
125
+ });
126
+ on("mouseenter")(a, function () {
127
+ $scope.popTimer = $scope.popMenu(item, this);
128
+ });
129
+ on("click")(a, function () {
130
+ $scope.open(items[index], this);
131
+ });
132
+ a.setAttribute("e-class", className);
133
+ a = button(a);
134
+ render(a, scope, parentScopes);
135
+ return a;
136
+ });
137
+ on("append")(page, function () {
138
+ this.go(0);
139
+ })
140
+ }
141
+ else {
142
+ page.innerHTML = menuList;
143
+ render(page, $scope);
144
+ vbox(page);
145
+ }
81
146
  page.renders.unshift(function () {
82
147
  this.$scope.hasIcon = hasIcon();
83
148
  });
@@ -86,11 +151,20 @@ function main(page, items, active, direction = 'y') {
86
151
  list(page, function (index) {
87
152
  var elem = generator(index);
88
153
  if (!elem) return;
89
- on("mouseenter")(elem, function (event) {
90
- popMenu(this.src[index], event);
154
+ on("mouseenter")(elem, function () {
155
+ if (page.ispop) popMenu(this.src[index], this);
91
156
  });
92
- on("click")(elem, function (event) {
93
- active(this.src[index], event);
157
+ on("click")(elem, function () {
158
+ var pop = active(this.src[index], this);
159
+ if (pop === false) return;
160
+ var root = page.root || page;
161
+ if (root.ispop === 1) root.ispop = false;
162
+ if (!mounted_menus.length) {
163
+ popMenu(this.src[index], this);
164
+ }
165
+ else {
166
+ unfocus.call(page);
167
+ }
94
168
  });
95
169
  return elem;
96
170
  }, direction);
@@ -527,25 +527,51 @@ var binders = {
527
527
  });
528
528
  }
529
529
  };
530
- var emiters = {
531
- on(key, search) {
530
+ var createEmiter = function (on) {
531
+ return function (key, search) {
532
+ if (this.$src) {
533
+ var parsedSrc = this.$src;
534
+ var scopes = this.$parentScopes;
535
+ search = search.slice();
536
+ search[0] += `with(this.$parentScopes[${scopes.length}])`;
537
+ this.$parentScopes = scopes.concat(this.$scope);
538
+ }
532
539
  var getter = createGetter(search, false);
533
540
  on(key)(this, function (e) {
534
- var res = getter.call(this, e);
535
- if (res && isFunction(res.then)) res.then(digest, digest);
536
- digest();
537
- return res;
538
- });
539
- },
540
- once(key, search) {
541
- var getter = createGetter(search, false);
542
- once(key)(this, function (e) {
543
- var res = getter.call(this, e);
541
+ if (parsedSrc) {
542
+ var target = e.currentTarget || e.target;
543
+ var scopes = target && target.$parentScopes;
544
+ if (scopes) {
545
+ var scope = null;
546
+ for (var cx = scopes.length - 1; cx >= 0; cx--) {
547
+ var s = scopes[cx];
548
+ if (s === this.$scope) {
549
+ scope = scopes[cx + 1];
550
+ break;
551
+ }
552
+ }
553
+ }
554
+ if (!scope && target.$scope !== this.$scope) scope = target.$scope;
555
+ }
556
+ var res;
557
+ if (scope) {
558
+ var temp = this.$scope;
559
+ this.$scope = scope;
560
+ res = getter.call(this, e);
561
+ this.$scope = temp;
562
+ }
563
+ else {
564
+ res = getter.call(this, e);
565
+ }
544
566
  if (res && isFunction(res.then)) res.then(digest, digest);
545
567
  digest();
546
568
  return res;
547
569
  });
548
- }
570
+ };
571
+ };
572
+ var emiters = {
573
+ on: createEmiter(on),
574
+ once: createEmiter(once),
549
575
  };
550
576
  emiters.v = emiters.ng = emiters.on;
551
577
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "3.10.7",
3
+ "version": "3.11.0",
4
4
  "description": "一个开发工具,开放源代码,自带组件库和编译环境,可以用来开发web组件,web应用或nodejs模块,或做为已有代码的加密工具,也可以做为静态页面服务器或跨域中转服务器使用",
5
5
  "main": "public/efront.js",
6
6
  "directories": {