efront 4.21.4 → 4.22.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.
Files changed (90) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +24 -0
  2. package/apps/blank/index.html +1 -1
  3. package/apps/index.jsp +76 -27
  4. package/apps/pay/alipay-query.jsp +1 -1
  5. package/apps/pay/alipay.jsp +1 -1
  6. package/apps/pivot/auth/login.js +2 -2
  7. package/apps/pivot/cert/main.xht +18 -5
  8. package/apps/pivot/db/act.xht +53 -0
  9. package/apps/pivot/db/config.xht +56 -16
  10. package/apps/pivot/home/welcome.html +12 -13
  11. package/apps/pivot/home/welcome.js +6 -6
  12. package/apps/pivot/home/welcome.less +12 -3
  13. package/apps/pivot/link/room.js +1 -1
  14. package/apps/pivot/main.js +3 -2
  15. package/apps/pivot/task/invoke.js +3 -3
  16. package/apps/pivot/task/rsync.js +2 -2
  17. package/apps/pivot/wow/root.js +8 -8
  18. package/coms/basic/#loader.js +9 -8
  19. package/coms/basic/Item.js +2 -2
  20. package/coms/basic/Tree.js +14 -2
  21. package/coms/basic/crc.js +5 -1
  22. package/coms/basic/cross_.js +2 -2
  23. package/coms/basic/decode62S.js +44 -0
  24. package/coms/basic/encode62S.js +40 -0
  25. package/coms/basic/encode62S_test.js +18 -0
  26. package/coms/basic/enrich.js +6 -1
  27. package/coms/basic/refilm_decode.js +40 -20
  28. package/coms/basic/refilm_decode_test.js +4 -0
  29. package/coms/basic/valid.js +4 -0
  30. package/coms/basic_/&Array.js +64 -49
  31. package/coms/basic_/&extends.js +9 -2
  32. package/coms/compile/Javascript.js +1 -1
  33. package/coms/compile/audit.js +23 -1
  34. package/coms/compile/cloneNode.js +3 -1
  35. package/coms/compile/downLevel.js +21 -11
  36. package/coms/compile/downLevel_test.js +52 -14
  37. package/coms/compile/rescan.js +8 -2
  38. package/coms/compile/unstruct.js +9 -9
  39. package/coms/crypt/encode62.js +36 -6
  40. package/coms/crypt/encode62_test.js +8 -48
  41. package/coms/explorer/main.less +1 -5
  42. package/coms/frame/chat.js +2 -2
  43. package/coms/frame/left.html +5 -4
  44. package/coms/frame/left.js +1 -0
  45. package/coms/frame/left.less +5 -3
  46. package/coms/frame/payment.js +2 -2
  47. package/coms/pivot/acme2.js +7 -4
  48. package/coms/pivot/left-footer.xht +25 -0
  49. package/coms/pivot/pedit.js +3 -3
  50. package/coms/pivot/plist.js +2 -2
  51. package/coms/pivot/qrcode.xht +3 -0
  52. package/coms/zimoli/XMLHttpRequest.js +2 -2
  53. package/coms/zimoli/container.js +34 -34
  54. package/coms/zimoli/design.html +6 -13
  55. package/coms/zimoli/design.js +49 -13
  56. package/coms/zimoli/design.less +62 -25
  57. package/coms/zimoli/drag.js +8 -3
  58. package/coms/zimoli/encode62.js +40 -12
  59. package/coms/zimoli/lattice.js +0 -1
  60. package/coms/zimoli/list.js +0 -8
  61. package/coms/zimoli/menu.js +29 -5
  62. package/coms/zimoli/menuList.js +1 -0
  63. package/coms/zimoli/menuList_test.js +1 -0
  64. package/coms/zimoli/model.js +150 -195
  65. package/coms/zimoli/model.less +4 -8
  66. package/coms/zimoli/on.js +14 -12
  67. package/coms/zimoli/padding.less +1 -0
  68. package/coms/zimoli/progbar.xht +9 -8
  69. package/coms/zimoli/prompt.less +0 -3
  70. package/coms/zimoli/render.js +210 -125
  71. package/coms/zimoli/select.js +9 -4
  72. package/coms/zimoli/select.less +3 -14
  73. package/coms/zimoli/selectList.js +5 -1
  74. package/coms/zimoli/selectList.less +3 -0
  75. package/coms/zimoli/table.html +7 -7
  76. package/coms/zimoli/table.js +12 -9
  77. package/coms/zimoli/table.less +5 -0
  78. package/coms/zimoli/tree.js +1 -2
  79. package/coms/zimoli/tree.less +3 -1
  80. package/coms/zimoli/tree_test.js +8 -6
  81. package/coms/zimoli/user.js +2 -2
  82. package/coms/zimoli/view.js +3 -4
  83. package/coms/zimoli/watch.js +3 -1
  84. package/coms/zimoli/zimoli.js +7 -3
  85. package/coms//350/214/250/350/217/260/tab.js +26 -2
  86. package/coms//350/214/250/350/217/260//346/240/207/347/255/276/345/214/226.js +1 -1
  87. package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +183 -20
  88. package/docs//345/267/245/345/205/267//345/233/275/351/231/205/345/214/226.xht +1 -0
  89. package/package.json +1 -1
  90. package/public/efront.js +1 -1
@@ -35,7 +35,7 @@ var createTemplateNodes = function (text) {
35
35
  this.with = Array.apply(null, node.childNodes);
36
36
  }
37
37
  appendChild.after(this, this.with);
38
- this.with = renderElement(this.with, this.$scope, this.$parentScopes, this.$renderid === 9);
38
+ this.with = render(this.with, this.$scope, this.$parentScopes, this.$renderid !== 9);
39
39
  };
40
40
  presets.template = function (t) {
41
41
  var comment = document.createComment('template');
@@ -52,7 +52,9 @@ presets.template = function (t) {
52
52
  }
53
53
  return comment;
54
54
  };
55
- if (!isProduction) window.renderElements = renderElements;
55
+ // <!--
56
+ window.renderElements = renderElements;
57
+ // -->
56
58
  var renderidOffset = 10;
57
59
  var renderidClosed = 0;
58
60
  var addRenderElement = function () {
@@ -63,7 +65,7 @@ var addRenderElement = function () {
63
65
  if (element.$renderid < 10 && element.$renderid > 0) element.$renderid = ++renderidOffset;
64
66
  renderElements[element.$renderid] = element;
65
67
  }
66
- rebuild(element);
68
+ buildFirst(element);
67
69
  };
68
70
  var removeRenderElement = function () {
69
71
  var element = this;
@@ -88,25 +90,53 @@ function refresh(root) {
88
90
  }
89
91
  }
90
92
  }
93
+ callDigest();
91
94
  if (rest.length) rest.forEach(a => removeRenderElement.call(a));
92
95
  }
93
- function rebuild(element) {
96
+ function fireChanges(element, changes) {
97
+ var event = createEvent('changes');
98
+ event.changes = changes;
99
+ dispatch(event, element);
100
+ }
101
+
102
+ function buildFirst(element) {
103
+ rebuild(element, '$ready' in element);
104
+ }
105
+ var digests = [];
106
+ function callDigest() {
107
+ var d = digests;
108
+ digests = [];
109
+ d.forEach(a => {
110
+ a.$digest();
111
+ });
112
+ }
113
+ function getWatchData(element) {
114
+ var { $watches } = element;
115
+ var props = {};
116
+ for (var key in $watches) {
117
+ var data = element[key];
118
+ props[key] = isObject(data) && !isFunction(data) && !isDate(data) && !isNode(data) ? extend(data instanceof Array ? [] : {}, data) : data;
119
+ }
120
+ return props;
121
+ }
122
+ function rebuild(element, isFirstRender) {
123
+ if (isFirstRender) delete element.$ready;
124
+ if (element.$digest) digests.push(element);
94
125
  if (!element.$needchanges) {
95
126
  element.$renders.forEach(a => a.call(element));
96
127
  return;
97
128
  }
98
- var props = {};
99
- Object.keys(element).forEach(function (key) {
100
- var data = element[key];
101
- props[key] = isObject(data) && !isFunction(data) && !isDate(data) && !isNode(data) ? extend(data instanceof Array ? [] : {}, data) : data;
102
- });
129
+ var props = getWatchData(isFirstRender ? { $watches: element.$watches } : element);
103
130
  element.$renders.forEach(a => a.call(element));
104
- var changes = getChanges(element, props);
105
- if (changes) {
106
- var event = createEvent('changes');
107
- event.changes = changes;
108
- dispatch(event, element);
131
+ var capture = null;
132
+ for (var k in props) {
133
+ var current = element[k];
134
+ var previous = props[k];
135
+ if (shallowEqual(current, previous)) continue;
136
+ if (!capture) capture = {};
137
+ capture[k] = { current, previous };
109
138
  }
139
+ if (capture) fireChanges(element, capture);
110
140
  }
111
141
  var variableReg = /([^\:\,\+\=\-\!%\^\|\/\&\*\!\;\?\>\<~\{\}\s\[\]\(\)]|\?\s*\.(?=[^\d])|\s*\.\s*)+/g;
112
142
  var variableOnlyReg = new RegExp(`^${variableReg.source}$`);
@@ -474,18 +504,42 @@ var createMapper = function (write, mapper) {
474
504
  });
475
505
  }
476
506
  }
507
+
508
+ class Binder {
509
+ constructor(getter, write) {
510
+ this.gt = getter;
511
+ this.st = write;
512
+ }
513
+ call(elem) {
514
+ var value = this.gt.call(elem);
515
+ var oldv = elem.$value;
516
+ if (shallowEqual(oldv, value)) return;
517
+ elem.$value = value;
518
+ if (!isHandled(value)) value = '';
519
+ this.st.call(elem, value, oldv);
520
+ }
521
+ }
522
+ class Binder2 {
523
+ constructor(getter, write, oldValue) {
524
+ this.get = getter;
525
+ this.set = write;
526
+ this.value = oldValue;
527
+ }
528
+ call(elem) {
529
+ var value = this.get.call(elem);
530
+ var oldv = this.value;
531
+ if (shallowEqual(oldv, value)) return;
532
+ this.value = value;
533
+ if (!isHandled(value)) value = '';
534
+ this.set.call(elem, value, oldv);
535
+ }
536
+ }
537
+
477
538
  var createBinder2 = function (write, read) {
478
539
  return function (search) {
479
540
  var getter = createGetter(this, search);
480
541
  var oldValue = isFunction(read) ? read(this) : undefined;
481
- this.$renders.push(function () {
482
- var value = getter(this);
483
- if (shallowEqual(value, oldValue)) return;
484
- var oldv = oldValue;
485
- oldValue = value;
486
- if (!isHandled(value)) value = '';
487
- write(this, value, oldv);
488
- });
542
+ this.$renders.push(new Binder2(getter, write, oldValue));
489
543
  };
490
544
  }
491
545
 
@@ -507,43 +561,98 @@ var src2 = function (search) {
507
561
  cast(this, origin);
508
562
  });
509
563
  }
510
-
564
+ var gtValue = function () { return this.value };
565
+ var stValue = function (v) { this.value = v };
566
+ var gtChecked = function () { return this.checked };
567
+ var stChecked = function (v) { this.checked = v };
568
+ var gtHtml = function () { return this.innerHTML };
569
+ var stHtml = function (v) { this.innerHTML = v };
570
+ class Model {
571
+ constructor(getScope, setScope, target) {
572
+ this.gs = getScope;
573
+ this.ss = setScope;
574
+ var getValue = target.getValue;
575
+ var setValue = target.setValue;
576
+ if (getValue && setValue);
577
+ else if (("value" in target || target.getValue instanceof Function) && target.setValue instanceof Function) {
578
+ if (!getValue) getValue = gtValue;
579
+ if (!setValue) setValue = stValue;
580
+ } else if (/^input$/i.test(target.tagName) && /^checkbox$/i.test(target.type) || /^checkbox$/i.test(target.tagName)) {
581
+ if (!getValue) getValue = gtChecked;
582
+ if (!setValue) setValue = stChecked;
583
+ } else if (/^(select|input|textarea)$/i.test(target.tagName) || "value" in target) {
584
+ if (!getValue) getValue = gtValue;
585
+ if (!setValue) setValue = stValue;
586
+ } else {
587
+ if (!getValue) getValue = gtHtml;
588
+ if (!setValue) setValue = stHtml;
589
+ }
590
+ this.gv = getValue;
591
+ this.sv = setValue;
592
+ this.target = target;
593
+ }
594
+ call(elem) {
595
+ var value = this.gv.call(elem);
596
+ if (value === this.value) {
597
+ return;
598
+ }
599
+ this.ss.call(this.target, value);
600
+ this.value = value;
601
+ this.bd.value = this.gs.call(this.target, value);
602
+ userChanged = true;
603
+ }
604
+ hook(elem, emit) {
605
+ var binder = new Binder2(this.gs, this.target !== elem ? this.sv.bind(this.target) : this.sv);
606
+ elem.$renders.push(binder);
607
+ binder.call(elem);
608
+ this.bd = binder;
609
+ if (emit) {
610
+ eventsBinders.forEach(on => on(this.target, this, true));
611
+ this.value = this.gv.call(elem);
612
+ this.target = elem;
613
+ }
614
+ return binder;
615
+ }
616
+ }
617
+ var createSetter = function (elem, search) {
618
+ return $$eval.bind(elem, search + "=arguments[2]", getScopeList(elem), elem);
619
+ };
511
620
  var directives = {
512
- text: createBinder2(function (elem, value) {
621
+ text: createBinder2(function (value) {
513
622
  if (isNode(value) || isArray(value)) {
514
- if (value !== elem.firstChild) {
515
- remove(elem.childNodes);
516
- appendChild(elem, value);
623
+ if (value !== this.firstChild) {
624
+ remove(this.childNodes);
625
+ appendChild(this, value);
517
626
  }
518
627
  }
519
628
  else {
520
- elem.innerText = value;
629
+ this.innerText = value;
521
630
  }
522
631
  }),
523
- html: createBinder2(function (elem, value) {
632
+ html: createBinder2(function (value) {
524
633
  if (isNode(value) || isArray(value)) {
525
- if (value !== elem.firstChild) {
526
- remove(elem.childNodes);
527
- appendChild(elem, value);
634
+ if (value !== this.firstChild) {
635
+ remove(this.childNodes);
636
+ appendChild(this, value);
528
637
  }
529
638
  }
530
639
  else {
531
- elem.innerHTML = value;
640
+ this.innerHTML = value;
532
641
  }
533
642
  }),
534
- hide: createBinder2(function (elem, value) {
643
+ hide: createBinder2(function (value) {
535
644
  var display = value ? 'none' : '';
536
- var style = elem.style;
645
+ var style = this.style;
537
646
  if (style.display !== display) style.display = display;
538
- }, function (elem) {
539
- return elem.style.display === 'none';
647
+ }, function () {
648
+ return this.style?.display === 'none';
540
649
  }),
541
- show: createBinder2(function (elem, value) {
650
+ show: createBinder2(function (value) {
542
651
  var display = value ? '' : 'none';
543
- var style = elem.style;
652
+ var style = this.style;
544
653
  if (style.display !== display) style.display = display;
545
- }, function (elem) {
546
- return elem.style.display !== 'none';
654
+ }, function () {
655
+ return this.style?.display !== 'none';
547
656
  }),
548
657
  style: createMapper(css, css.styleToMap),
549
658
  class: createMapper(addClass, addClass.classToMap),
@@ -553,54 +662,9 @@ var directives = {
553
662
  },
554
663
  model(search, target, change) {
555
664
  var getter = createGetter(this, search);
556
- var oldValue;
557
- var getstr = target.getValue instanceof Function ? "this.getValue()" : "";
558
- var setter = target.setValue instanceof Function ? function () {
559
- var value = getter(this);
560
- if (value === undefined) value = "";
561
- if (deepEqual(oldValue, value)) return;
562
- oldValue = value;
563
- this.setValue(value);
564
- } : null;
565
- var setter2 = function (key) {
566
- var value = getter(this);
567
- if (value === undefined) value = "";
568
- if (deepEqual(oldValue, value)) return;
569
- oldValue = value;
570
- this[key] = value;
571
- };
572
- if (("value" in target || target.getValue instanceof Function) && target.setValue instanceof Function) {
573
- this.$renders.push(setter);
574
- var change = getstr || "this.value";
575
- } else if (/^input$/i.test(target.tagName) && /^checkbox$/i.test(target.type) || /^checkbox$/i.test(target.tagName)) {
576
- this.$renders.push(setter || setter2.bind(target, 'checked'));
577
- var change = getstr || "this.checked";
578
- } else if (/^(select|input|textarea)$/i.test(target.tagName) || "value" in target) {
579
- this.$renders.push(setter || setter2.bind(target, 'value'));
580
- var change = getstr || "this.value";
581
- } else {
582
- this.$renders.push(setter || function () {
583
- var value = getter(this);
584
- if (value === undefined) value = "";
585
- if (deepEqual(oldValue, value)) return;
586
- oldValue = value;
587
- if (html(this) !== value) html(this, value);
588
- });
589
- var change = getstr || "'value' in this?this.value:this.innerHTML";
590
- }
591
- if (change === false) return;
592
- setter2 = null;
593
- var changeme = $$eval.bind(this, search + "=" + change, getScopeList(this));
594
- var onchange = function () {
595
- changeme(this);
596
- var value = getter(this);
597
- if (value === oldValue) {
598
- return;
599
- }
600
- oldValue = value;
601
- userChanged = true;
602
- };
603
- eventsBinders.forEach(on => on(target, onchange, true));
665
+ var setter = createSetter(this, search);
666
+ var model = new Model(getter, setter, target);
667
+ model.hook(this, change !== false ? target : null);
604
668
  },
605
669
  value(search, target) {
606
670
  directives.model.call(this, search, target, false);
@@ -622,7 +686,7 @@ var binders = {
622
686
  if (this[attr] !== value) {
623
687
  this[attr] = this[attr.replace(/\-[a-z]/g, a => a.toUpperCase())] = value;
624
688
  }
625
- }
689
+ };
626
690
  this.$renders.push(hook);
627
691
  return hook;
628
692
  },
@@ -737,14 +801,11 @@ function renderProp(elem, props) {
737
801
 
738
802
  function renderBinds(element, binds, init) {
739
803
  var bind = binders._;
740
- var hs = [];
741
804
  for (var k in binds) {
742
- if (k === 'src') continue;
743
805
  if (directives.hasOwnProperty(k)) continue;
744
806
  var h = bind.call(element, k, binds[k]);
745
- hs.push(h);
807
+ h.call(element);
746
808
  }
747
- return hs;
748
809
  }
749
810
 
750
811
  function renderRest(element, struct, replacer = element) {
@@ -756,14 +817,25 @@ function renderRest(element, struct, replacer = element) {
756
817
  }
757
818
  element.$renders = [];
758
819
  var { attrs, binds } = struct;
759
- for (var k in binds) if (k !== 'src' && k in directives) {
760
- directives[k].call(element, binds[k], replacer);
820
+ var bindWatch = !!element.$needchanges;
821
+ for (var k in binds) {
822
+ if (k in directives) {
823
+ if (k !== 'src') directives[k].call(element, binds[k], replacer);
824
+ }
825
+ else {
826
+ if (element !== replacer) replacer[k] = element[k];
827
+ if (bindWatch) {
828
+ var watches = element.$watches;
829
+ if (!watches) watches = element.$watches = {};
830
+ if (!watches[k]) watches[k] = true;
831
+ }
832
+ }
761
833
  }
762
834
  for (var k in struct.attrs) {
763
835
  binders[""].call(element, k, attrs[k]);
764
836
  }
765
- if (binds.src) directives.src.call(element, binds.src);
766
837
  if (renders && renders.length) element.$renders.push.apply(element.$renders, renders);
838
+ if (binds.src) directives.src.call(element, binds.src);
767
839
  if (!isElement(replacer)) replacer = element;
768
840
  struct.ons.forEach(([on, key, value]) => on.call(element, replacer, key, value));
769
841
  }
@@ -850,23 +922,16 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
850
922
  if (!replacer || element === replacer) {
851
923
  if (element.children && element.children.length) renderElement(element.children, scope, parentScopes, once);
852
924
  }
853
- if (!isFirstRender) return element;
854
- renderRest(element, $struct, replacer);
855
- if (isNode(replacer) && replacer !== element) {
856
- if (!replacer.$renders) replacer.$renders = [];
857
- replacer.$renders.push.apply(replacer.$renders, element.$renders);
858
- element = replacer;
859
- }
860
- if (element.$renders.length) {
861
- if (element.$renderid !== 9) {
862
- on("append")(element, addRenderElement);
863
- onremove(element, removeRenderElement);
864
- if (isMounted(element));
865
- else if (element.$renderid > 1) addRenderElement.call(element);
866
- else if (eagermount) rebuild(element);
925
+ if (isFirstRender) {
926
+ renderRest(element, $struct, replacer);
927
+ if (isNode(replacer) && replacer !== element) {
928
+ if (!replacer.$renders) replacer.$renders = [];
929
+ replacer.$renders.push.apply(replacer.$renders, element.$renders);
930
+ element = replacer;
867
931
  }
868
- else {
869
- rebuild(element);
932
+ if (element.$digest || element.$renders.length) {
933
+ element.$ready = true;
934
+ renderlock.push(element);
870
935
  }
871
936
  }
872
937
  return element;
@@ -1104,24 +1169,42 @@ function createStructure(element, useExists) {
1104
1169
  element.$eval = $eval;
1105
1170
  return element.$struct = new Struct(ons, types, copys, binds, attr1, props, ids, once);
1106
1171
  }
1107
- var eagermount = false, renderlock = false;
1172
+ function renderUnlock() {
1173
+ var locked = renderlock.reverse();
1174
+ renderlock = null;
1175
+ locked.forEach(element => {
1176
+ if (element.$renderid !== 9) {
1177
+ on("append")(element, addRenderElement);
1178
+ onremove(element, removeRenderElement);
1179
+ if (isMounted(element));
1180
+ else if (element.$renderid > 1) addRenderElement.call(element);
1181
+ else if (eagermount) buildFirst(element);
1182
+ }
1183
+ else {
1184
+ buildFirst(element);
1185
+ }
1186
+ });
1187
+ eagermount = false;
1188
+ }
1189
+ function renderLock() {
1190
+ if (!renderlock) {
1191
+ renderlock = [];
1192
+ return true;
1193
+ }
1194
+ return false;
1195
+ }
1196
+ var eagermount = false, renderlock = null;
1108
1197
  function render(element, scope, parentScopes, lazy = true) {
1198
+ var haslock = renderLock();
1109
1199
  var if_top_length = if_top.length;
1110
- var haslock = false;
1111
1200
  if (isFinite(scope) && arguments.length === 2) lazy = scope, scope = undefined;
1112
1201
  else if (isFinite(parentScopes) && arguments.length === 3) lazy = parentScopes, parentScopes = undefined;
1113
1202
  var renderonce = lazy === 0;
1114
- if (!renderlock) {
1115
- haslock = true;
1116
- renderlock = true;
1117
- eagermount = !+lazy;
1118
- }
1203
+ if (haslock) eagermount = !+lazy;
1119
1204
  var e = renderElement(element, scope, parentScopes, renderonce);
1120
- if (haslock) {
1121
- renderlock = false;
1122
- eagermount = false;
1123
- }
1205
+ if (haslock) renderUnlock(element);
1124
1206
  if (if_top_length < if_top.length) initIf(if_top.splice(if_top_length, if_top.length - if_top_length));
1207
+ if (haslock) callDigest();
1125
1208
  return e;
1126
1209
  }
1127
1210
  var digest = lazy(refresh, -{});
@@ -1153,4 +1236,6 @@ render.register = function (key, name) {
1153
1236
  };
1154
1237
  render.getFromScopes = getFromScopes;
1155
1238
  render.struct = createStructure;
1156
- render.mergeStruct = mergeStruct;
1239
+ render.mergeStruct = mergeStruct;
1240
+ render.Binder = Binder;
1241
+ render.Model = Model;
@@ -165,16 +165,19 @@ function select() {
165
165
  var $name = 'name';
166
166
  var template = target.$template;
167
167
  var isIndexedKey = false;
168
- if (template) {
168
+ var $item = '';
169
+ if (template) a: {
169
170
  var { attrs, binds } = template.childNodes[0].$struct;
170
- if (attrs.value) $key = attrs.value;
171
+ if (!attrs.value && !binds.value) break a;
172
+ $key = attrs.value || binds.value;
171
173
  if ($key === target.$src.indexName || $key === target.$src.keyName) isIndexedKey = true;
172
174
  $name = binds.bind || binds.html || binds.text || $name;
175
+ $item = target.$src.itemName;
173
176
  }
174
177
  var initList2 = function (src) {
175
178
  if (isIndexedKey) optionsMap = src;
176
179
  else src.forEach(s => {
177
- optionsMap[seek(s, $key)] = s;
180
+ optionsMap[seek($item ? { [$item]: s } : s, $key)] = s;
178
181
  if (isObject(s)) s.selected = s.key === target.value;
179
182
  });
180
183
  list = selectList(generator, src, !!target.multiple, !!target.editable);
@@ -263,9 +266,11 @@ function select() {
263
266
  }
264
267
  };
265
268
  if (!target.$renders) {
266
- target.$renders = [setEmpty, setFocus];
269
+ target.$renders = [];
267
270
  }
268
271
  target.$renders.push(setIcon);
272
+ if (!isNode(list)) target.$renders.push(setEmpty, setFocus);
273
+
269
274
  onclick(target, mousedown);
270
275
  return target;
271
276
  }
@@ -1,7 +1,3 @@
1
- & {
2
- background: #fff;
3
- }
4
-
5
1
  select& {
6
2
  border: 1px solid #00000033;
7
3
  -webkit-appearance: none;
@@ -23,13 +19,11 @@ select& {
23
19
  }
24
20
 
25
21
  &:hover {
26
- color: #fff;
27
- background-color: #2ca2f9;
22
+ border-color: #2ca2f9;
28
23
  }
29
24
 
30
25
  &:active {
31
- color: #fff;
32
- background-color: #1c82c9;
26
+ border-color: #1c82c9;
33
27
  }
34
28
 
35
29
  &[iconed] {
@@ -46,10 +40,5 @@ model>& {
46
40
  }
47
41
 
48
42
  &[empty] {
49
- color: #0009;
50
-
51
- &:hover,
52
- &:active {
53
- color: #fff9;
54
- }
43
+ color: #0008;
55
44
  }
@@ -79,6 +79,7 @@ function main() {
79
79
  var key = isEmpty(option.key) ? option.value : option.key;
80
80
  if (key in itemMap) return itemMap[key];
81
81
  var item = itemMap[key] = document.createElement('div');
82
+ if (isEmpty(key)) item.setAttribute('empty', '');
82
83
  item.setAttribute("item", '');
83
84
  item.innerHTML = option.innerHTML || option.name;
84
85
  item.name = option.name || option.innerHTML;
@@ -216,7 +217,10 @@ function main() {
216
217
  page.go(0);
217
218
  appendChild(page, adder);
218
219
  });
219
- popup(edit, [.5, .5]);
220
+ on("remove")(edit, function () {
221
+ page.with = null;
222
+ });
223
+ popup(edit, [.5, .5], true);
220
224
  break;
221
225
  }
222
226
  });
@@ -33,6 +33,9 @@
33
33
  background-color: transparent;
34
34
  }
35
35
  }
36
+ >[empty]{
37
+ opacity: .6;
38
+ }
36
39
  }
37
40
 
38
41
  &[iconed] {
@@ -1,22 +1,22 @@
1
1
  <thead @mounted="setFixedColumn.call(this.parentNode),setContextMenu(this)">
2
- <tr inline-block #adapter thead @mounted="resizeT(this)">
2
+ <tr inline-block #adapter thead @append="resizeT(this)">
3
3
  <td draggable="false" fixed row-index>
4
4
  <mask></mask>${i18n`序号`}
5
5
  </td>
6
- <td fixed:="f.fixed" -repeat="f in fields track by f.id" :style="{width:f.width}" @dblclick="sort(f)"
7
- swapped_="f.summary">
6
+ <td fixed:="f.fixed" -repeat="f in fields track by f.id" once-append="this.style.width=f.width_p"
7
+ @dblclick="sort(f)" swapped_="f.summary">
8
8
  <mask></mask><i -if="f.icon" -class="f.icon"></i><span -if="f.name" -html="f.name"
9
9
  type@="typeof f.type==='string'?f.type:''"></span><template -else>&nbsp;</template>
10
10
  </td>
11
11
  <td style="min-width: 0;" draggable="false">&nbsp;</td>
12
12
  </tr>
13
13
  </thead>
14
- <tbody -src="(d,i) in data" :style="tbodyHeight(this,hasFoot)">
15
- <tr inline-block :style="{width:adapter.style.width}" @click="rowClick(d,i,event)" @mounted="resizeR(this)">
16
- <td fixed row-index :style="adapter.firstChild.getAttribute('style')">
14
+ <tbody -src="(d,i) in data" :style="tbodyHeight(this,hasFoot,adapter.offsetWidth)">
15
+ <tr inline-block @click="rowClick(d,i,event)" once-mounted="resizeR(this)">
16
+ <td fixed row-index @append="this.style=adapter.firstChild.getAttribute('style')">
17
17
  <mask></mask><span -bind="i+1"></span>
18
18
  </td>
19
- <td fixed:="f.fixed" -repeat="(f,i) in fields" :style="adapter.children[i+1].getAttribute('style')">
19
+ <td fixed:="f.fixed" -repeat="(f,i) in fields" once-append="this.style=adapter.children[i+1].getAttribute('style')">
20
20
  <mask></mask>
21
21
  <model -if="!isEmpty(f.key)" :field=f :data=d readonly></model>
22
22
  <template -else>&nbsp;</template>
@@ -219,7 +219,10 @@ var trElementReg = /^tr$/i;
219
219
  var id = 0;
220
220
  function enrichField(f) {
221
221
  if (!f.id) f.id = ++id;
222
- if (f.width) return;
222
+ if (f.width) {
223
+ f.width_p = fromPixel(f.width);
224
+ return;
225
+ }
223
226
  var width;
224
227
  if (f.size) {
225
228
  width = f.size;
@@ -250,13 +253,17 @@ function enrichField(f) {
250
253
  }
251
254
  if (width > 600) width = 600;
252
255
  f.width = parseFloat(width) + 60;
256
+ f.width_p = fromPixel(f.width);
253
257
  if (!f.key && f.options && isEmpty(f.fixed)) {
254
258
  f.fixed = true;
255
259
  }
256
260
  }
257
- var tbodyHeight = function (tbody, hasFoot) {
261
+ var tbodyHeight = function (tbody, hasFoot, width) {
258
262
  var rowHeight = calcPixel(36);
259
- return { 'max-height': ((innerHeight - (!!hasFoot ? rowHeight : 6) - getScreenPosition(tbody).top - 10) / rowHeight | 0) * rowHeight }
263
+ return {
264
+ 'max-height': ((innerHeight - (!!hasFoot ? rowHeight : 6) - getScreenPosition(tbody).top - 10) / rowHeight | 0) * rowHeight,
265
+ width
266
+ }
260
267
  };
261
268
 
262
269
  var setFixed = function (children, scrolled, left, borderRight) {
@@ -336,7 +343,6 @@ var setFixedColumn = function (remark) {
336
343
  css(tfoot, { left: this.scrollLeft });
337
344
  }
338
345
  };
339
- var setLazyFixedColumn = lazy(setFixedColumn, 0);
340
346
  var setClass = function (tds, cls, old) {
341
347
  tds.forEach(td => td[cls] = true);
342
348
  old.forEach(td => { if (!td[cls]) removeClass(td, cls) });
@@ -402,7 +408,6 @@ function setContextMenu(thead) {
402
408
  if (td.offsetWidth > width) css(td, { width });
403
409
  }
404
410
  });
405
- setLazyFixedColumn.call(thead.parentNode, true)
406
411
  };
407
412
  var menuItems = fields.map((f, i) => ({ name: f.name || "&nbsp", index: i, width: f.width, key: f.key, checked: !f.hidden, do: _do }));
408
413
  var scope = this;
@@ -544,7 +549,7 @@ function table(elem) {
544
549
  tbody() {
545
550
  var e = list.apply(null, arguments);
546
551
  css(e, tbodyHeight(e, this.hasFoot));
547
- css(e, { width: this.adapter.offsetWidth, display: 'block' });
552
+ css(e, { width: this.adapter.style.width, display: 'block' });
548
553
  this.tbody0 = e;
549
554
  return e;
550
555
  },
@@ -574,13 +579,13 @@ function table(elem) {
574
579
  pagination
575
580
  };
576
581
  render(this, $scope, this.$parentScopes.concat(this.$scope));
577
- if (isMounted(table)) setFixedColumn.call(table);
578
582
  await data;
579
583
  if (!data.is_errored) $scope.data = Table.from(fields, data);
580
584
  $scope.data.callback = function () {
581
585
  render.digest();
582
586
  };
583
587
  })
588
+
584
589
  autodragchildren(
585
590
  table,
586
591
  cellMatchManager,
@@ -630,10 +635,8 @@ function table(elem) {
630
635
  }
631
636
  markThead();
632
637
  markedRows = true;
633
- setLazyFixedColumn.call(table);
634
638
  }
635
639
  );
636
640
  resizingList.set(table, setFixedColumn);
637
- on("scroll")(table, setFixedColumn);
638
641
  return table;
639
642
  }