efront 3.4.5 → 3.5.1

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.
@@ -1,7 +1,12 @@
1
1
 
2
2
  var _slider = createElement(div);
3
- var getGenerator = function (container, parsedSrc) {
3
+ var empty = function (index, item) {
4
+ if (!item) return;
5
+ return document.createElement('empty');
6
+ };
7
+ var getGenerator = function (container) {
4
8
  if (!container) return;
9
+ if (!container.childNodes.length) return container.$generator || empty;
5
10
  var template = document.createElement("div");
6
11
  var templates = [].concat.apply([], container.childNodes).filter(a => {
7
12
  if (a.hasAttribute('insert')) {
@@ -20,26 +25,27 @@ var getGenerator = function (container, parsedSrc) {
20
25
  appendChild(template, templates);
21
26
  container.insertBefore = _slider.insertBefore;
22
27
  container.appendChild = _slider.appendChild;
23
- return function (index, com) {
28
+ var scopes = container.$parentScopes.concat(container.$scope);
29
+ return container.$generator = function (index, com) {
24
30
  if (!com) {
25
31
  if (!container.src || index >= container.src.length) return;
26
32
  com = container.src[index];
27
33
  }
28
34
  if (!com) return;
29
- var template1 = template.cloneNode();
30
- template1.innerHTML = template.innerHTML;
35
+ var template1 = template.cloneNode(true);
31
36
  if (!template1.childNodes.length) return template1;
32
37
  var item = template1.childNodes[0];
33
38
  item.with = [].concat.apply([], template1.childNodes).slice(1);
39
+ var parsedSrc = container.$src;
34
40
  if (parsedSrc) {
35
41
  var { keyName, itemName, indexName } = parsedSrc;
36
- var newScope = extend(Object.create(container.$scope), {
42
+ var newScope = {
37
43
  [keyName || '$key']: index,
38
44
  [itemName || '$item']: com,
39
45
  [indexName || '$index']: index
40
- });
41
- var newItem = render(item, newScope);
42
- newItem.with = render(item.with, newScope);
46
+ };
47
+ var newItem = render(item, newScope, scopes);
48
+ if (item.with.length) newItem.with = render(item.with, newScope, scopes);
43
49
  } else {
44
50
  var newScope = container.src[index];
45
51
  if (!isObject(newScope)) newScope = {
@@ -59,8 +65,8 @@ var getGenerator = function (container, parsedSrc) {
59
65
  return this.$item;
60
66
  }
61
67
  }
62
- var newItem = render(item, newScope, [container.$scope]);
63
- newItem.with = render(newItem.with = item.with, newScope, [container.$scope]);
68
+ var newItem = render(item, newScope, scopes);
69
+ newItem.with = render(newItem.with = item.with, newScope, scopes);
64
70
  }
65
71
  return newItem;
66
72
  };
@@ -14,6 +14,10 @@
14
14
 
15
15
  >.button {
16
16
  border: none;
17
+ width: 100%;
18
+ cursor: pointer;
19
+ padding: 0;
20
+ margin: 0;
17
21
 
18
22
  >.track {
19
23
 
@@ -433,18 +433,8 @@ function list() {
433
433
  bindSrc = container;
434
434
  container = div();
435
435
  } else if (container && !generator) {
436
- var src = container.getAttribute("src") || container.getAttribute("ng-src") || container.getAttribute("v-src");
437
- if (src) {
438
- var parsedSrc = render.parseRepeat(src);
439
- if (!parsedSrc) {
440
- container.setAttribute("ng-src", src);
441
- container.removeAttribute("src");
442
- var generator = getGenerator(container);
443
- } else {
444
- container.setAttribute("ng-src", parsedSrc.srcName);
445
- container.removeAttribute("src");
446
- var generator = getGenerator(container, parsedSrc);
447
- }
436
+ if ("$src" in container) {
437
+ generator = getGenerator(container);
448
438
  care(container, function () {
449
439
  var index = container.index();
450
440
  container.clean();
@@ -110,18 +110,6 @@ function main(elem, mode) {
110
110
  }
111
111
  }
112
112
  mode = mode ? mode.toLowerCase() : "horizonal";
113
- var src = elem.getAttribute("src") || elem.getAttribute("ng-src") || elem.getAttribute("v-src");
114
- if (src) {
115
- var parsedSrc = render.parseRepeat(src);
116
- if (!parsedSrc) {
117
- elem.removeAttribute("src");
118
- var generator = getGenerator(elem);
119
- } else {
120
- elem.removeAttribute("src");
121
- var generator = getGenerator(elem, parsedSrc);
122
- }
123
- elem.setAttribute("ng-src", parsedSrc ? parsedSrc.srcName : src);
124
- }
125
113
 
126
114
  switch (mode) {
127
115
  case "i":
@@ -130,6 +118,7 @@ function main(elem, mode) {
130
118
  case "t":
131
119
  case "tree":
132
120
  if (elem) {
121
+ var generator = getGenerator(elem);
133
122
  tree(elem, function (index, item) {
134
123
  var e = generator(index, item);
135
124
  if (!e || e.children.length) return e;
@@ -165,9 +154,10 @@ function main(elem, mode) {
165
154
  var emit = function (item) {
166
155
  active(elem, item, item.value);
167
156
  };
168
- if (src) {
157
+ if ("$src" in elem) {
158
+ getGenerator(elem);
169
159
  care(elem, function (src) {
170
- menuList(elem, getTreeFromData(src), emit, generator, direction);
160
+ menuList(elem, getTreeFromData(src), emit, direction);
171
161
  });
172
162
  } else {
173
163
  var nodes = getArrayNodes(elem);
@@ -8,7 +8,7 @@ var release = function () {
8
8
  var clear = function () {
9
9
  clearTimeout(releaseTimer);
10
10
  };
11
- function main(page, items, active, generator, direction = 'y') {
11
+ function main(page, items, active, direction = 'y') {
12
12
  if (!isNode(page)) {
13
13
  var page = div();
14
14
  }
@@ -21,7 +21,7 @@ function main(page, items, active, generator, direction = 'y') {
21
21
  if (!item.children || !item.children.length) return;
22
22
  var clone = template.cloneNode();
23
23
  clone.innerHTML = template.innerHTML;
24
- var menu = main(clone, item.children, active, generator);
24
+ var menu = main(clone, item.children, active);
25
25
  mounted_menus.push(menu);
26
26
 
27
27
  page.active = menu;
@@ -46,7 +46,7 @@ function main(page, items, active, generator, direction = 'y') {
46
46
  template.innerHTML = page.innerHTML;
47
47
  page.tempalte = template;
48
48
  }
49
- if (!generator || !page.children.length || page.menutype === 1) {
49
+ if (!page.children.length || page.menutype === 1) {
50
50
  page.innerHTML = menuList;
51
51
  page.menutype = 1;
52
52
  var hasIcon = function () {
@@ -82,6 +82,7 @@ function main(page, items, active, generator, direction = 'y') {
82
82
  this.$scope.hasIcon = hasIcon();
83
83
  });
84
84
  } else {
85
+ var generator = getGenerator(page);
85
86
  list(page, function (index) {
86
87
  var elem = generator(index);
87
88
  if (!elem) return;
package/coms/zimoli/on.js CHANGED
@@ -144,6 +144,22 @@ function checkKeyNeed(eventtypes, e) {
144
144
  }
145
145
  return true;
146
146
  }
147
+ function wrapHandler(h) {
148
+ if (h instanceof Function) {
149
+ return function () {
150
+ var res = h.apply(this, arguments);
151
+ if (res && isFunction(res.then)) {
152
+ this.setAttribute('pending', '');
153
+ var removePending = () => {
154
+ this.removeAttribute('pending');
155
+ };
156
+ res.then(removePending, removePending);
157
+ }
158
+ return res;
159
+ }
160
+ }
161
+ return h;
162
+ }
147
163
  if (is_addEventListener_enabled) {
148
164
  var on = function (k) {
149
165
  var on_event_path = "on" + k;
@@ -151,6 +167,7 @@ if (is_addEventListener_enabled) {
151
167
  var eventtypes = parseEventTypes(k);
152
168
  k = k.replace(eventtypereg, '');
153
169
  function addhandler(element, handler, firstmost) {
170
+ handler = wrapHandler(handler);
154
171
  if (eventtypes.capture) firstmost = true;
155
172
  if (k === changes_key) {
156
173
  if (!element.needchanges) element.needchanges = 0;
@@ -190,6 +207,7 @@ if (is_addEventListener_enabled) {
190
207
 
191
208
  if (handlersMap[on_event_path]) return handlersMap[on_event_path];
192
209
  function addhandler(element, handler, firstmost = false) {
210
+ handler = wrapHandler(handler);
193
211
  if (eventtypes.capture) {
194
212
  console.warn("当前运行环境不支持事件capture");
195
213
  firstmost = true;
@@ -1,4 +1,4 @@
1
1
  <a ng-repeat="o in options" ng-click="select(o)" ng-class="{activate:o===options.active}">
2
- <r>◯<s>●</s></r>
2
+ <r><s></s></r>
3
3
  <span ng-bind=o.name||o></span>
4
4
  </a>
@@ -6,18 +6,36 @@
6
6
  font-family: sans-serif;
7
7
  display: inline-block;
8
8
  position: relative;
9
- margin-right: 4px;
10
- line-height: 1;
9
+ margin-right: .3em;
11
10
  text-align: center;
11
+ vertical-align: middle;
12
+ width: 1em;
13
+ height: 1em;
14
+ border: .1em solid;
15
+ border-radius: 50%;
12
16
 
13
17
  >s {
14
18
  display: none;
15
19
  position: absolute;
16
20
  text-decoration: none;
17
- left: 0;
18
- right: 0;
19
- top: -3%;
20
- bottom: 0;
21
+ overflow: hidden;
22
+ border-radius: 50%;
23
+ width: .4em;
24
+ height: .4em;
25
+ top: 50%;
26
+ left: 50%;
27
+ margin: -.2em;
28
+
29
+ text-indent: -.5em;
30
+
31
+ &:after {
32
+ position: absolute;
33
+ left: 0;
34
+ top: 0;
35
+ display: block;
36
+ content: "";
37
+ border: .3em solid;
38
+ }
21
39
  }
22
40
  }
23
41
 
@@ -25,7 +43,7 @@
25
43
  &.activate {
26
44
  >r {
27
45
  >s {
28
- display: inline;
46
+ display: block;
29
47
  }
30
48
  }
31
49
  }
@@ -55,7 +55,7 @@ var variableReg = /([^\:\,\+\=\-\!%\^\|\/\&\*\!\;\?\>\<~\{\}\s]|\?\s*\.(?=[^\d])
55
55
  var createGetter = function (search, isprop = true) {
56
56
  var [withContext, searchContext] = search;
57
57
  if (!searchContext) return function () { };
58
- var ret = /\;|(\d\.|[^\{\.\+\:\?\-\=\*\/\?\\,~!<>%\^&\}\s])\s*([\r\n\u2028\u2029])\s*(\.\d|[^\.\+\-\=\*\/\?\\,~!<>%\^&\[\}\(\?\:\s])/.test(searchContext) ? "" : "return ";
58
+ var ret = /\;/.test(searchContext) ? "" : "return ";
59
59
  if (/\?\s*\.(?=[^\d])/.test(searchContext)) {
60
60
  searchContext = searchContext.replace(variableReg, function (context) {
61
61
  var dist;
@@ -144,7 +144,10 @@ var createRepeat = function (search, id = 0) {
144
144
  throw new Error("数据量过大,取消绘制!");
145
145
  }
146
146
  var $parentScopes = element.$parentScopes || [];
147
- if (element.$scope) $parentScopes = $parentScopes.concat(element.$scope);
147
+ var $struct = element.$struct;
148
+ if (element.$scope) {
149
+ $struct = Object.assign({}, $struct, { context: $struct.context + `with(this.$parentScopes[${$parentScopes.length}])` }), $parentScopes = $parentScopes.concat(element.$scope);
150
+ }
148
151
  var clonedElements1 = Object.create(null);
149
152
  var cloned = keys.map(function (key, cx) {
150
153
  var k = isArrayResult ? cx : key;
@@ -161,6 +164,7 @@ var createRepeat = function (search, id = 0) {
161
164
  };
162
165
  clone.$scope = $scope;
163
166
  clone.$parentScopes = $parentScopes;
167
+ clone.$struct = $struct;
164
168
  clone = render(clone, $scope, clone.$parentScopes);
165
169
  clonedElements1[k] = clone;
166
170
  return clone;
@@ -302,19 +306,17 @@ var parseIfWithRepeat = function (ifExpression, repeatExpression) {
302
306
 
303
307
  var createStructure = function ({ name: ifkey, key, value: ifexp } = {}, { name: forkey, value: repeat } = {}, context) {
304
308
  var element = this;
305
- if (!ifkey) return structures.repeat.call(element, [context, repeat]);
306
- if (!repeat) return structures[key].call(element, [context, ifexp]);
309
+ if (!ifkey) return element.removeAttribute(forkey), structures.repeat.call(element, [context, repeat]);
310
+ if (!repeat) return element.removeAttribute(ifkey), structures[key].call(element, [context, ifexp]);
307
311
  if (!ifexp) {
308
312
  element.removeAttribute(ifkey);
309
313
  return structures[key].call(element, [context, ifexp]);
310
314
  }
311
315
  var { before, after } = parseIfWithRepeat(ifexp, repeat);
312
- if (!after.length) {
313
- element.removeAttribute(ifkey);
314
- } else {
315
- element.setAttribute(ifkey, after.join("&&"));
316
+ element.removeAttribute(ifkey);
317
+ if (after.length) {
318
+ element.setAttribute("a-if", after.join("&&"));
316
319
  }
317
-
318
320
  if (before.length > 0) {
319
321
  // 懒渲染
320
322
  createIf.call(element, [context, before.join("&&")], null);
@@ -367,6 +369,27 @@ var createBinder = function (binder) {
367
369
 
368
370
  }
369
371
  }
372
+
373
+ var src2 = function (search) {
374
+ var getter = createGetter(search).bind(this);
375
+ var savedValue;
376
+ this.renders.push(function () {
377
+ var origin = getter();
378
+ var temp = origin;
379
+ if (origin instanceof Array) {
380
+ temp = extend([], origin);
381
+ } else if (isObject(origin)) {
382
+ temp = extend({}, origin);
383
+ } else if (isEmpty(origin)) {
384
+ temp = "";
385
+ }
386
+ var changes = getChanges(temp, savedValue);
387
+ if (!changes || isEmpty(origin) && isEmpty(this.src)) return;
388
+ savedValue = temp;
389
+ this.src = origin;
390
+ cast(this, origin);
391
+ });
392
+ }
370
393
  var directives = {
371
394
  bind: createBinder(text),
372
395
  html: createBinder(html),
@@ -379,47 +402,9 @@ var directives = {
379
402
  elem.style.display = value ? '' : 'none';
380
403
  }),
381
404
  style: createBinder(css),
382
- src(search) {
383
- var getter = createGetter(search).bind(this);
384
- var savedValue, pending;
385
- var refresh = function () {
386
- that.src = savedValue;
387
- removeClass(that, "pending");
388
- pending = 0;
389
- };
390
- var img = document.createElement("img");
391
- var that = this;
392
- this.renders.push(function () {
393
- var origin = getter();
394
- var temp = origin;
395
- if (origin instanceof Array) {
396
- temp = extend([], origin);
397
- } else if (isObject(origin)) {
398
- temp = extend({}, origin);
399
- } else if (isEmpty(origin)) {
400
- temp = "";
401
- }
402
- var changes = getChanges(temp, savedValue);
403
- if (!changes) return;
404
- savedValue = temp;
405
- if (/^img$/i.test(this.tagName)) {
406
- if (!isString(origin)) {
407
- return;
408
- }
409
- if (origin) {
410
- img.src = origin;
411
- if (img.complete) {
412
- this.src = origin;
413
- } else if (!pending) {
414
- addClass(this, "pending");
415
- pending = setTimeout(refresh);
416
- }
417
- }
418
- } else {
419
- this.src = origin;
420
- cast(this, origin);
421
- }
422
- });
405
+ src([s, src]) {
406
+ var parsedSrc = this.$src;
407
+ return src2.call(this, [s, parsedSrc ? parsedSrc.srcName : src]);
423
408
  },
424
409
  model(search) {
425
410
  var getter = createGetter(search).bind(this);
@@ -510,6 +495,7 @@ var directives = {
510
495
  });
511
496
  },
512
497
  };
498
+ directives.text = directives.bind;
513
499
  // property binder
514
500
  var binders = {
515
501
  _(attr, search) {
@@ -551,6 +537,7 @@ var emiters = {
551
537
  var res = getter.call(this, e);
552
538
  if (res && isFunction(res.then)) res.then(digest, digest);
553
539
  digest();
540
+ return res;
554
541
  });
555
542
  },
556
543
  once(key, search) {
@@ -559,6 +546,7 @@ var emiters = {
559
546
  var res = getter.call(this, e);
560
547
  if (res && isFunction(res.then)) res.then(digest, digest);
561
548
  digest();
549
+ return res;
562
550
  });
563
551
  }
564
552
  };
@@ -607,10 +595,14 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
607
595
  if (parentNode) {
608
596
  if (parentNode.renderid > 1 || parentNode.isMounted) element.renderid = 2;
609
597
  }
610
- var ons = [];
611
598
 
612
599
  if (isFirstRender) {
613
- var attrs = [].concat.apply([], element.attributes);
600
+ element.renders = element.renders ? [].concat(element.renders) : [];
601
+ var { ons, copys, attrs, props, binds, context: withContext } = element.$struct;
602
+ delete element.$struct;
603
+ if (binds.src) {
604
+ element.$src = parseRepeat(binds.src);
605
+ }
614
606
  var { tagName, parentNode, nextSibling } = element;
615
607
  // 替换元素
616
608
  var constructor = getFromScopes(tagName, scope, parentScopes);
@@ -623,13 +615,12 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
623
615
  constructor = getFromScopes(tagName, scope, parentScopes);
624
616
  }
625
617
  if (isFunction(constructor)) {
626
- var attrsMap = {};
627
618
  var replacer = constructor.call(scope, element, scope, parentScopes);
628
619
  if (isNode(replacer) && element !== replacer) {
629
620
  if (nextSibling) appendChild.before(nextSibling, replacer);
630
621
  else if (parentNode) appendChild(parentNode, replacer);
631
622
  if (element.parentNode === parentNode) remove(element);
632
- attrs.map(function (attr) {
623
+ copys.forEach(function (attr) {
633
624
  var { name, value } = attr;
634
625
  switch (name.toLowerCase()) {
635
626
  case "class":
@@ -643,62 +634,39 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
643
634
  replacer[name] = value;
644
635
  break;
645
636
  default:
646
- if (!/[\-@\:\._]/.test(name)) {
647
- replacer.setAttribute(name, value);
648
- } else {
649
- attrsMap[name] = attr;
650
- }
637
+ replacer.setAttribute(name, value);
651
638
  }
652
639
  });
653
640
  replacer.renderid = element.renderid;
641
+ replacer.renders = element.renders;
642
+ if (binds.src) replacer.$src = element.$src;
654
643
  element = replacer;
655
644
  element.$scope = scope;
656
645
  element.$parentScopes = parentScopes;
657
646
  }
658
- [].concat.apply([], element.attributes).forEach(attr => {
659
- if (attrsMap[attr.name]) {
660
- delete attrsMap[attr.name];
661
- }
662
- attrsMap[attr.name] = attr;
663
- });
664
- attrs = Object.keys(attrsMap).map(key => attrsMap[key]);
665
647
  }
666
648
  }
667
649
  if (element.children.length) renderElement(element.children, scope, parentScopes);
668
650
  if (!isFirstRender) return element;
669
- // 解析属性
670
- element.renders = element.renders ? [].concat(element.renders) : [];
671
- var withContext = parentScopes ? parentScopes.map((_, cx) => `with(this.$parentScopes[${cx}])`).join("") : '';
672
- var emiter_reg = /^(?:(v|ng|on|once)\-|v\-on\:|@|once|on)/i;
673
- attrs.map(function (attr) {
674
- var { name, value } = attr;
675
- if (/^(?:class|style|src|\:)$/i.test(name)) return;
676
- var key = name.replace(/^(ng|v|.*?)\-|^[\:\_\.]/i, "").toLowerCase();
677
- if (directives.hasOwnProperty(key) && isFunction(directives[key])) {
678
- directives[key].call(element, [withContext, value]);
679
- element.removeAttribute(name);
680
- } else if (emiter_reg.test(name)) {
681
- var match = emiter_reg.exec(name);
682
- var ngon = (match[1] || match[0]).toLowerCase() === 'once' ? 'once' : 'on';
683
- element.removeAttribute(name);
684
- ons.push([emiters[ngon], name.replace(emiter_reg, ''), value]);
685
- } else if (/^([\_\:\.]|v\-bind\:)/.test(name)) {
686
- binders._.call(element, name.replace(/^([\_\:\.]|v\-bind\:)/, ""), [withContext, value]);
687
- element.removeAttribute(name);
688
- } else if (/[_@\:\.]$/.test(name)) {
689
- binders[""].call(element, name.replace(/[_@\:\.]$/, ""), [withContext, value]);
690
- element.removeAttribute(name);
691
- } else {
692
- name = name.replace(/\-(\w)/g, (_, w) => w.toUpperCase());
693
- try {
694
- element[name] = value === '' ? true : value;
695
- } catch (e) {
696
- }
651
+ for (var k in binds) {
652
+ if (directives.hasOwnProperty(k)) {
653
+ directives[k].call(element, [withContext, binds[k]])
697
654
  }
698
- });
699
- rebuild(element);
655
+ else {
656
+ binders._.call(element, k, [withContext, binds[k]]);
657
+ }
658
+ }
659
+ for (var k in attrs) {
660
+ binders[""].call(element, k, [withContext, attrs[k]]);
661
+ }
662
+ for (var k in props) {
663
+ try {
664
+ element[k] = props[k];
665
+ } catch (e) { }
666
+ }
700
667
  ons.forEach(([on, key, value]) => on.call(element, key, [withContext, value]));
701
668
  if (element.renders.length) {
669
+ rebuild(element);
702
670
  onappend(element, addRenderElement);
703
671
  onremove(element, removeRenderElement);
704
672
  if (element.isMounted || element.renderid > 1) addRenderElement.call(element);
@@ -720,11 +688,19 @@ function renderStructure(element, scope, parentScopes = []) {
720
688
  }
721
689
  var attrs = [].concat.apply([], element.attributes);
722
690
  var withContext = parentScopes ? parentScopes.map((_, cx) => `with(this.$parentScopes[${cx}])`).join("") : '';
723
- attrs = attrs.filter(a => structures.hasOwnProperty(a.name.replace(/^(ng|V|.*?)\-/i, '').toLowerCase()));
724
691
  var types = {};
725
- if (attrs.length > 2) throw new Error(`请不要在同一元素上使用三次及以上的结构属性:${attrs.map(a => a.name)}`);
726
- attrs.map(function (attr) {
727
- var { name } = attr;
692
+ var emiter_reg = /^(?:(v|ng|on|once)\-|v\-on\:|@|once|on)/i;
693
+ var ons = [];
694
+ var copys = [];
695
+ var binds = {};
696
+ var attr1 = {};
697
+ var props = {};
698
+ for (var attr of attrs) {
699
+ var { name, value } = attr;
700
+ if (/^(?:class|style|src|\:|placeholder)$/i.test(name)) {
701
+ copys.push(attr);
702
+ continue;
703
+ }
728
704
  var key = name.replace(/^(ng|v|.*?)\-/i, "").toLowerCase();
729
705
  if (structures.hasOwnProperty(key) && isFunction(structures[key])) {
730
706
  if (element.renderid <= -2) {
@@ -747,9 +723,29 @@ function renderStructure(element, scope, parentScopes = []) {
747
723
  }
748
724
  if (!element.renderid) element.renderid = -1;
749
725
  else element.renderid = -2;
726
+ // element.removeAttribute(name);
727
+ }
728
+ if (element.$struct) continue;
729
+ var key = name.replace(/^(ng|v|.*?)\-|^[\:\_\.]|^v\-bind\:/i, "").toLowerCase();
730
+ if (directives.hasOwnProperty(key) || /^([\_\:\.]|v\-bind\:)/.test(name)) {
731
+ binds[key] = value;
750
732
  element.removeAttribute(name);
751
733
  }
752
- });
734
+ else if (emiter_reg.test(name)) {
735
+ var match = emiter_reg.exec(name);
736
+ var ngon = (match[1] || match[0]).toLowerCase() === 'once' ? 'once' : 'on';
737
+ element.removeAttribute(name);
738
+ ons.push([emiters[ngon], name.replace(emiter_reg, ''), value]);
739
+ }
740
+ else if (/[_@\:\.]$/.test(name)) {
741
+ attr1[name.replace(/[_@\:\.]$/, "")] = value;
742
+ element.removeAttribute(name);
743
+ }
744
+ else {
745
+ props[name.replace(/\-(\w)/g, (_, w) => w.toUpperCase())] = value === "" ? true : value;
746
+ }
747
+ }
748
+ if (!element.$struct) element.$struct = { ons, copys, binds, attrs: attr1, props, context: withContext };
753
749
  if (element.renderid <= -1) createStructure.call(element, types.if, types.repeat, withContext);
754
750
  }
755
751
  function render(element, scope, parentScopes) {
@@ -0,0 +1,16 @@
1
+ <thead>
2
+ <tr>
3
+ <td -repeat="f in fields"><i -if="f.icon" -class="f.icon"></i></span><span -if="f.name" -html="f.name"></span>
4
+ </td>
5
+ </tr>
6
+ </thead>
7
+ <tbody -src="d in data">
8
+ <tr>
9
+ <td -repeat="f in fields">
10
+ <span -if="f.key" -text="d[f.key]"></span>
11
+ <a on-click="o.do(d)" -if="f.options" -repeat="o in f.options">
12
+ <span -text=o.name></span>
13
+ </a>
14
+ </td>
15
+ </tr>
16
+ </tbody>
@@ -142,6 +142,7 @@ function table(elem) {
142
142
  var cellMatchManager = function (element) {
143
143
  if (!thead) [thead] = table.getElementsByTagName("thead");
144
144
  if (table.resizing) return false;
145
+ if (!getTargetIn(thead, element)) return false;
145
146
  if (!tdElementReg.test(element.tagName)) return false;
146
147
  var savedRowDeltas = [];
147
148
  [].map.call(thead.children, function (tr) {
@@ -153,10 +154,24 @@ function table(elem) {
153
154
  table.dragbox = function () {
154
155
  return thead;
155
156
  };
157
+ care(table, function ([fields, data]) {
158
+ this.innerHTML = template;
159
+ render(this, {
160
+ fields,
161
+ tbody: list,
162
+ data,
163
+ a: button,
164
+ }, this.$parentScopes.concat(this.$scope));
165
+ })
156
166
  autodragchildren(
157
167
  table,
158
168
  cellMatchManager,
159
169
  function (src, dst, rel, append, parentNode) {
170
+ if (table.src) {
171
+ var [fields] = table.src;
172
+ var [f] = fields.splice(src, 1);
173
+ fields.splice(dst, 0, f);
174
+ }
160
175
  var children = parentNode.children;
161
176
  var srcElement = children[src];
162
177
  var dstElement = children[rel];