efront 4.21.3 → 4.22.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.
Files changed (96) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +117 -66
  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/parseNumber.js +12 -7
  28. package/coms/basic/percent.js +28 -0
  29. package/coms/basic/refilm.js +24 -5
  30. package/coms/basic/refilm_decode.js +46 -22
  31. package/coms/basic/refilm_decode_test.js +5 -0
  32. package/coms/basic/valid.js +4 -0
  33. package/coms/basic_/&Array.js +64 -49
  34. package/coms/basic_/&extends.js +9 -2
  35. package/coms/compile/Html_test.js +5 -0
  36. package/coms/compile/Javascript.js +13 -3
  37. package/coms/compile/Javascript_test.js +3 -0
  38. package/coms/compile/Program.js +119 -43
  39. package/coms/compile/audit.js +23 -1
  40. package/coms/compile/cloneNode.js +3 -1
  41. package/coms/compile/common.js +7 -1
  42. package/coms/compile/downLevel.js +21 -11
  43. package/coms/compile/downLevel_test.js +52 -14
  44. package/coms/compile/rescan.js +8 -2
  45. package/coms/compile/scanner2.js +53 -7
  46. package/coms/compile/translate.js +1 -1
  47. package/coms/compile/unstruct.js +9 -9
  48. package/coms/crypt/encode62.js +36 -6
  49. package/coms/crypt/encode62_test.js +8 -48
  50. package/coms/explorer/main.less +1 -5
  51. package/coms/frame/chat.js +2 -2
  52. package/coms/frame/left.html +5 -4
  53. package/coms/frame/left.js +1 -0
  54. package/coms/frame/left.less +5 -3
  55. package/coms/frame/payment.js +2 -2
  56. package/coms/pivot/acme2.js +7 -4
  57. package/coms/pivot/left-footer.xht +25 -0
  58. package/coms/pivot/pedit.js +3 -3
  59. package/coms/pivot/plist.js +2 -2
  60. package/coms/pivot/qrcode.xht +3 -0
  61. package/coms/zimoli/XMLHttpRequest.js +16 -13
  62. package/coms/zimoli/container.js +34 -34
  63. package/coms/zimoli/design.html +6 -13
  64. package/coms/zimoli/design.js +49 -13
  65. package/coms/zimoli/design.less +62 -25
  66. package/coms/zimoli/drag.js +8 -3
  67. package/coms/zimoli/encode62.js +40 -12
  68. package/coms/zimoli/lattice.js +0 -1
  69. package/coms/zimoli/list.js +0 -8
  70. package/coms/zimoli/menu.js +29 -5
  71. package/coms/zimoli/model.js +150 -195
  72. package/coms/zimoli/model.less +4 -8
  73. package/coms/zimoli/on.js +14 -12
  74. package/coms/zimoli/padding.less +1 -0
  75. package/coms/zimoli/progbar.xht +9 -8
  76. package/coms/zimoli/prompt.less +0 -3
  77. package/coms/zimoli/render.js +210 -125
  78. package/coms/zimoli/select.js +9 -4
  79. package/coms/zimoli/select.less +3 -14
  80. package/coms/zimoli/selectList.js +5 -1
  81. package/coms/zimoli/selectList.less +3 -0
  82. package/coms/zimoli/table.html +7 -7
  83. package/coms/zimoli/table.js +12 -9
  84. package/coms/zimoli/table.less +5 -0
  85. package/coms/zimoli/user.js +2 -2
  86. package/coms/zimoli/view.js +3 -4
  87. package/coms/zimoli/watch.js +3 -1
  88. package/coms/zimoli/zimoli.js +6 -2
  89. package/coms//350/214/250/350/217/260/tab.js +26 -2
  90. package/coms//350/214/250/350/217/260//346/240/207/347/255/276/345/214/226.js +1 -1
  91. package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +183 -20
  92. package/docs//345/267/245/345/205/267//345/233/275/351/231/205/345/214/226.xht +5 -0
  93. package/package.json +1 -1
  94. package/public/efront.js +1 -1
  95. package/readme-en.md +3 -5
  96. package/readme.md +3 -4
@@ -2,40 +2,7 @@
2
2
  /**
3
3
  * 支持任意类型的数据的编辑展示及过滤
4
4
  */
5
- var rebuildOptions = function () {
6
- var elem = this;
7
- var { $scope } = elem;
8
- if (!$scope) return;
9
- var { data, field } = $scope;
10
- if (!data || !field) return;
11
- var { options_from, options } = field;
12
- var new_options = seek(data, options_from);
13
- if (new_options !== options) {
14
- field.options = new_options;
15
- delete field.optionsMap;
16
- render.refresh();
17
- }
18
- };
19
- var copyOptionData = function () {
20
- var { $scope } = this;
21
- if (!$scope) return;
22
- var { data, field } = $scope;
23
- if (!data || !field) return;
24
- var { option_to, options } = field;
25
- if (!options) return;
26
- var value = data[field.key];
27
- var option = isObject(value) ? value : value in options ? options[value] : value;
28
- extend(data, seek(option, option_to));
29
- };
30
- var renderModel = function (field, data) {
31
- var ipt = this;
32
- ipt.setAttribute("ng-model", "data[field.key]");
33
- ipt.setAttribute("placeholder_", "field.holder");
34
- render(ipt, {
35
- field,
36
- data
37
- });
38
- };
5
+
39
6
  var unmark = function (select) {
40
7
  select.isediter = false;
41
8
  select.isreader = false;
@@ -135,9 +102,7 @@ var constructors = {
135
102
  color() {
136
103
  return colorpicker();
137
104
  },
138
- title() {
139
- },
140
- name() { },
105
+
141
106
  image({ field }) {
142
107
  var img = image();
143
108
  var { options } = field;
@@ -160,52 +125,37 @@ var constructors = {
160
125
  cast(elem, field);
161
126
  return elem;
162
127
  },
163
- select(_, t) {
164
- if (!t) {
165
- var elem = select();
166
- var { field, data } = _;
167
- elem.value = data[field.key];
168
- var o = field.options?.[0];
169
- elem.editable = field.editable;
170
- if (field.holder) _.innerHTML = `<span -if="isEmpty(data[field.key])" class="placeholder">${field.holder}</span>`;
171
- if (!isEmpty(o?.key)) {
172
- field.options.unshift({
173
- name: i18n`选择${field.name}`,
174
- key: ''
175
- })
176
- }
177
- render(_.children, { field, data, isEmpty });
178
- elem.innerHTML = `<option -repeat="(o,i) in field.options" ng-bind="o.name||o" _value="o.key!==undefined?o.key:o"></option>`;
179
- }
180
- else if (t === 'a') {
181
- var { field, data } = _;
182
- var opt = null;
183
- for (var cx = 0, options = field.options, dx = options.length; cx < dx; cx++) {
184
- var o = options[cx];
185
- if (o.key === data[field.key]) {
186
- opt = o;
187
- o.selected = true;
188
- break;
189
- }
190
- }
191
- var pad = selectList(field.options, !!field.multi, true);
192
- var e = document.createElement('select');
193
- e.innerHTML = `<option selected value="${opt ? opt.key : ''}">${opt ? opt.name : '请选择'}</option>`;
194
- e.value = opt ? opt.key : '';
195
- elem = select(e, pad);
128
+ select(_) {
129
+ var { field, data } = _;
130
+ var t = field.ref;
131
+ var elem = document.createElement('select');
132
+ elem.multiple = field.multi;
133
+ elem.editable = field.editable || t === 'a';
134
+ var o = field.options?.[0];
135
+ if (field.holder) _.innerHTML = `<span -if="isEmpty(data[field.key])" class="placeholder">${field.holder}</span>`;
136
+ if (!isEmpty(o?.key)) {
137
+ if (!field.required) field.options.unshift({
138
+ name: field.holder || i18n`选择${field.name}`,
139
+ key: ''
140
+ })
196
141
  }
142
+ render(_.children, { field, data, isEmpty });
143
+ elem.setAttribute('a-src', 'o in field.options')
144
+ elem.innerHTML = `<option disabled:=o.disabled -text="o.name" :value="o.key"></option>`;
145
+ render(elem, { select, data, field });
197
146
  return elem;
198
147
  },
199
- "repeat"(_, field_type) {
148
+ "repeat"(_) {
200
149
  var elem = input();
201
150
  elem.$renders = [function () {
202
151
  var { field, data } = this.$scope;
203
152
  var { status } = this;
153
+ var field_type = field.ref;
204
154
  var valid = this.value === data[field_type];
205
155
  if (!this.dirty) {
206
156
  status = 'clean';
207
157
  } else if (isEmpty(this.value)) {
208
- if (field.is_required) {
158
+ if (field.required) {
209
159
  status = 'required';
210
160
  } else {
211
161
  status = 'empty';
@@ -230,11 +180,13 @@ constructors.int
230
180
  = constructors.number;
231
181
  constructors.gen = constructors.generator;
232
182
  var readonly_types = {
233
- "date"({ field }, data) {
183
+ "date"() {
184
+ var { field, data } = this;
234
185
  var string = data[field.key];
235
186
  return filterTime(string, "y年M月d日");
236
187
  },
237
- "url"({ field }, data) {
188
+ "url"() {
189
+ var { field, data } = this;
238
190
  var href = data[field.key];
239
191
  if (href) {
240
192
  var e = anchor2(field.holder || href, href);
@@ -242,34 +194,34 @@ var readonly_types = {
242
194
  return e;
243
195
  }
244
196
  },
245
- "datetime"(elem) {
246
- var { data, field } = elem;
247
- elem.innerHTML = filterTime(data[field.key], "y年M月d日 h:mm");
197
+ "datetime"() {
198
+ var { field, data } = this;
199
+ return filterTime(data[field.key], "y年M月d日 h:mm");
248
200
  },
249
- "timestamp"(elem) {
250
- var { data, field } = elem;
251
- elem.innerHTML = filterTime(data[field.key]);
201
+ "timestamp"() {
202
+ var { field, data } = this;
203
+ return filterTime(data[field.key]);
252
204
  },
253
- "size"({ field }, data) {
205
+ "size"() {
206
+ var { field, data } = this;
254
207
  var f = data[field.key];
255
208
  return size(f);
256
209
  },
257
- html(a, data) {
258
- var t = document.createElement("span");
259
- t.innerHTML = seek(data, a.field.key);
260
- return t;
210
+ html() {
211
+ var { field, data } = this;
212
+ return seek(data, field.key);
261
213
  },
262
- text(e) {
263
- var { data, field } = e;
264
- e.innerHTML = data[field.key] ?? '';
214
+ text() {
215
+ var { field, data } = this;
216
+ return data[field.key] ?? '';
265
217
  },
266
- swap(e, data) {
267
- var { field } = e;
218
+ swap() {
219
+ var { field, data } = this;
268
220
  var v = data[field.key];
269
221
  if (field.options) {
270
222
  if (!field.optionsMap) field.optionsMap = createOptionsMap(field.options);
271
223
  var o = field.optionsMap[v];
272
- try { e.setAttribute(field.key, v); } catch { }
224
+ try { this.setAttribute(field.key, v); } catch { }
273
225
  if (isObject(o)) return `<s></s>` + o.name;
274
226
  if (isHandled(o)) return o;
275
227
  }
@@ -277,8 +229,83 @@ var readonly_types = {
277
229
  return v;
278
230
  },
279
231
  };
232
+ var setContent = function (value) {
233
+ if (this === value) return;
234
+ if (isNode(value) && this !== value || isArray(value)) {
235
+ remove(this.childNodes);
236
+ appendChild(this, value);
237
+ }
238
+ else if (isHandled(value)) {
239
+ this.innerHTML = value;
240
+ }
241
+ };
242
+ var Binder = render.Binder, Model = render.Model;
243
+ Object.keys(readonly_types).forEach(k => {
244
+ var getter = readonly_types[k];
245
+ readonly_types[k] = new Binder(getter, setContent);
246
+ });
247
+ var get = new Binder(function () {
248
+ var { field, data } = this;
249
+ if (isEmpty(field.key)) return;
250
+ var value = seek(data, field.key);
251
+ if (field.options) {
252
+ if (!field.optionsMap) {
253
+ var map = Object.create(null);
254
+ for (var o of field.options) {
255
+ var v = getValue(o);
256
+ map[v] = o;
257
+ }
258
+ field.optionsMap = map;
259
+ }
260
+ var map = field.optionsMap;
261
+ if (value in map) {
262
+ value = getName(map[value]);
263
+ }
264
+ }
265
+ return value;
266
+ }, setContent);
267
+
268
+ var ipt = function (element) {
269
+ var { field } = element;
270
+ var ipt = document.createElement('input');
271
+ ipt.setAttribute('type', field.type);
272
+ input(ipt);
273
+ return ipt;
274
+ };
275
+
276
+ function getScopeValue() {
277
+ return this.data[this.field.key];
278
+ }
279
+ function setScopeValue(v) {
280
+ this.data[this.field.key] = v;
281
+ }
282
+ function setBinder(elem, binder) {
283
+ if (binder === elem.$binder) return;
284
+ removeFromList(elem.$renders, elem.$binder);
285
+ remove(elem.childNodes);
286
+ if (binder instanceof Binder) {
287
+ binder.call(elem);
288
+ elem.$renders.push(binder);
289
+ }
290
+ else {
291
+ var ipt = binder(elem);
292
+ binder = null;
293
+ if (isHandled(ipt) && ipt !== elem) {
294
+ if (isNode(ipt)) {
295
+ var model = new Model(getScopeValue, setScopeValue, ipt);
296
+ model.hook(elem, ipt);
297
+ appendChild(elem, ipt);
298
+ }
299
+ else {
300
+ elem.innerHTML = ipt;
301
+ }
302
+ }
303
+ }
304
+ elem.$binder = binder;
305
+ }
280
306
  readonly_types.anchor = readonly_types.url;
281
307
  readonly_types.do = readonly_types.act = readonly_types.action = constructors.generator;
308
+ constructors.title = constructors.name = readonly_types.text;
282
309
  readonly_types.gen = readonly_types.generator = readonly_types.text;
283
310
  var createOptionsMap = function (options) {
284
311
  if (!isObject(options[0])) return options;
@@ -308,117 +335,45 @@ var markEditer = function (editers) {
308
335
  editers[k].isediter = true;
309
336
  }
310
337
  };
311
- var build = function () {
312
- var elem = this;
313
- var { data, readonly, field } = elem;
314
338
 
315
- if (!field || !data) return;
316
- var run = function () {
317
- var function_type = "function";
318
- if (data !== elem.data || field !== elem.field || readonly !== elem.readonly) return;
319
- var field_type = field.type || field.editor, field_editor = field.editor || field.type;
320
- if (field_editor instanceof Function && field_type === field_editor) {
321
- field_type = function_type;
322
- }
323
- if (!(field_editor instanceof Function)) {
324
- field_editor = null;
325
- }
326
- if (/\?/.test(field_type)) {
327
- var [field_type, field_ref] = field_type.split("?");
328
- }
329
- var type = elem.getAttribute('type');
330
- if (type !== field_type) {
331
- elem.setAttribute("type", field_type);
332
- }
333
- remove(elem.children);
334
- if (isString(field_type)) field_type = field_type.replace(/\:[\d+\.]+$/, '');
335
- if (readonly || field.readonly) {
336
- if (field_type === "function") {
337
- field_editor(elem);
338
- } else {
339
- var create = findReaderForElement(field_type, elem) || readonly_types[field_type];
340
- if (create) {
341
- var e = create(elem, data, field_ref);
342
- if (isNode(e)) {
343
- if (e !== elem) appendChild(elem, e);
344
- }
345
- else if (!isEmpty(e)) {
346
- elem.innerHTML = e;
347
- }
348
- return;
349
- }
350
- elem.innerHTML = '<span ng-bind=get()></span>';
351
- render(elem, {
352
- get() {
353
- if (isEmpty(field.key)) return;
354
- var value = seek(data, field.key);
355
- if (field.options) {
356
- if (!field.optionsMap) {
357
- var map = Object.create(null);
358
- for (var o of field.options) {
359
- var v = getValue(o);
360
- map[v] = o;
361
- }
362
- field.optionsMap = map;
363
- }
364
- var map = field.optionsMap;
365
- if (value in map) {
366
- value = getName(map[value]);
367
- }
368
- }
369
- return value;
370
- }
371
- });
372
- }
339
+ var run = function ({ changes }) {
340
+ var function_type = "function";
341
+ var elem = this;
342
+ var { data, field } = elem;
343
+ if (!data || !field) return;
344
+ var field_type = field.type || field.editor, field_editor = field.editor || field.type;
345
+ if (field_editor instanceof Function && field_type === field_editor) {
346
+ field_type = function_type;
347
+ }
348
+ if (!(field_editor instanceof Function)) {
349
+ field_editor = null;
350
+ }
351
+ if (/\?/.test(field_type)) {
352
+ var [field_type, field_ref] = field_type.split("?");
353
+ field.ref = field_ref;
354
+ }
355
+ var type = elem.getAttribute('type');
356
+ if (type !== field_type) {
357
+ elem.setAttribute("type", field_type);
358
+ }
359
+ if (isString(field_type)) field_type = field_type.replace(/\:[\d+\.]+$/, '');
360
+ var create = null;
361
+ if (elem.readonly || field.readonly) {
362
+ if (field_type === "function") {
363
+ create = field_editor;
373
364
  } else {
374
- var create = field_type === "function" ? field_editor : findEditerForElement(field_type, elem) || constructors[field_type];
375
- var ipt = create ? create(elem, field_ref) : field.key ? input(function () {
376
- var input = document.createElement('input');
377
- input.setAttribute('type', field.type);
378
- return input;
379
- }()) : null;
380
- if (ipt) {
381
- if (ipt !== elem) appendChild.insert(elem, ipt);
382
- if (!ipt.$scope) {
383
- renderModel.call(ipt, field, data);
384
- var saved_sataus;
385
- ipt.$renders.push(function () {
386
- var { valid, status } = this;
387
- if (elem.valid !== valid) elem.valid = valid;
388
- if (saved_sataus === status) return;
389
- saved_sataus = status;
390
- elem.setAttribute('status', saved_sataus);
391
- });
392
- } else {
393
- on("change")(ipt, function () {
394
- data[field.key] = getValue.call(this);
395
- });
396
- setValue.call(ipt, data[field.key]);
397
- }
398
- if ("option_to" in field) {
399
- on("change")(ipt, copyOptionData);
400
- }
401
- if ("options_from" in field) {
402
- ipt.$renders.push(rebuildOptions);
403
- }
404
- }
365
+ create = findReaderForElement(field_type, elem) || readonly_types[field_type];
366
+ if (!create) create = get;
405
367
  }
406
- };
407
- if (data.loading_promise || field.loading_promise) {
408
- Promise.all([
409
- data.loading_promise,
410
- field.loading_promise
411
- ]).then(run);
412
368
  } else {
413
- run();
369
+ create = field_type === "function" ? field_editor : findEditerForElement(field_type, elem) || constructors[field_type];
370
+ if (!create && field.key) create = ipt;
414
371
  }
372
+ setBinder(elem, create);
415
373
  };
374
+
416
375
  function main(elem) {
417
- on("changes")(elem, function ({ changes }) {
418
- if (changes.data || changes.field || changes.readonly) {
419
- build.call(this);
420
- }
421
- });
376
+ on('changes')(elem, run);
422
377
  return elem;
423
378
  }
424
379
  markEditer(constructors);
@@ -6,13 +6,6 @@
6
6
  &[type=select] {
7
7
  position: relative;
8
8
 
9
- >.select:hover,
10
- >.select:active {
11
- &+.placeholder {
12
- color: #fff9;
13
- }
14
- }
15
-
16
9
  .placeholder {
17
10
  color: #0009;
18
11
  padding-left: 6px;
@@ -24,9 +17,12 @@
24
17
  z-index: 1;
25
18
  pointer-events: none;
26
19
  display: block;
20
+ border: none;
21
+ outline: none;
22
+ background: none;
27
23
  }
28
24
 
29
- .select[empty] {
25
+ .placeholder+.select[empty] {
30
26
  color: transparent;
31
27
  }
32
28
 
package/coms/zimoli/on.js CHANGED
@@ -250,7 +250,7 @@ function checkKeyNeed(eventtypes, e) {
250
250
  }
251
251
  var pendingid = 0;
252
252
  function pending(h, event) {
253
- if (h instanceof Function) {
253
+ if (h.call instanceof Function) {
254
254
  h.pending = true;
255
255
  var res = h.call(this, event);
256
256
  if (res && isFunction(res.then) && this.setAttribute) {
@@ -306,7 +306,8 @@ var broadcast = function (k, hk, event) {
306
306
  // firefox 中键
307
307
  Object.defineProperty(event, 'which', { value: 2 });
308
308
  }
309
- for (var [eventtypes, handler, context] of handlers) {
309
+ for (var hand of handlers) {
310
+ var [eventtypes, handler, context] = hand;
310
311
  if (eventtypes.self && event.target !== element) continue;
311
312
  if (!checkKeyNeed(eventtypes, event)) continue;
312
313
  if (eventtypes.stop) event.stopPropagation();
@@ -320,7 +321,7 @@ var broadcast = function (k, hk, event) {
320
321
  } else {
321
322
  pending.call(context, handler, event);
322
323
  }
323
- if (eventtypes.once) remove.call(element, k, hk, eventtypes, handler);
324
+ if (eventtypes.once) remove.call(element, k, hk, hand);
324
325
  }
325
326
  };
326
327
 
@@ -341,8 +342,8 @@ var append = function (k, hk, listener2, firstmost) {
341
342
  var [eventtypes, handler, context] = listener2;
342
343
  var element = this;
343
344
  var handlers = element[hk];
344
- for (var [e, h, c] of handlers) {
345
- if (h === handler && shallowEqual(eventtypes, e, 2) && c === context) return;
345
+ for (var [e, h, c, d] of handlers) {
346
+ if (h === handler && c === context && shallowEqual(eventtypes, e, 2)) return d.dulp = true, d;
346
347
  }
347
348
  if (k === changes_key) {
348
349
  if (!element.$needchanges) element.$needchanges = 0;
@@ -350,6 +351,7 @@ var append = function (k, hk, listener2, firstmost) {
350
351
  }
351
352
  if (firstmost) handlers.unshift(listener2);
352
353
  else handlers.push(listener2);
354
+ return listener2[3] = remove.bind(element, k, hk, listener2);
353
355
  };
354
356
 
355
357
  var on = document.efronton = function (k) {
@@ -373,8 +375,7 @@ var on = document.efronton = function (k) {
373
375
  else target[on_event_path] = h;
374
376
  }
375
377
  var listener = [eventtypes, handler, context];
376
- append.call(target, k, hk, listener, firstmost);
377
- return remove.bind(target, k, hk, listener);
378
+ return append.call(target, k, hk, listener, firstmost);
378
379
  };
379
380
 
380
381
  else {
@@ -419,8 +420,7 @@ var on = document.efronton = function (k) {
419
420
 
420
421
  }
421
422
  var listener = [eventtypes, handler, context];
422
- append.call(target, k, handler_path, listener, firstmost);
423
- return remove.bind(target, k, handler_path, listener);
423
+ return append.call(target, k, handler_path, listener, firstmost);
424
424
  }, addhandler = function (context, handler, firstmost) {
425
425
  return _addhandler(context, context, handler, firstmost);
426
426
  };
@@ -556,9 +556,11 @@ var invoke = function (event, type, pointerType) {
556
556
  var autofire = function (key) {
557
557
  var h = on(key);
558
558
  handlersMap["on" + key] = function (target, handle) {
559
- var on = h(target, handle);
560
- if (isMounted(target)) handle.call(target);
561
- return on;
559
+ var off = h(target, handle);
560
+ if (!off.dulp && isMounted(target)) {
561
+ handle.call(target);
562
+ }
563
+ return off;
562
564
  };
563
565
  };
564
566
  autofire('mounted');
@@ -1,6 +1,7 @@
1
1
  & {
2
2
  box-sizing: border-box;
3
3
  display: inline-block;
4
+ vertical-align: top;
4
5
  position: relative;
5
6
  border: 6px solid transparent;
6
7
  }
@@ -2,23 +2,24 @@
2
2
  & {
3
3
  display: inline-block;
4
4
  min-width: 60px;
5
- height: 12px;
5
+ height: 14px;
6
6
  color: #3ae;
7
- border: 2px double;
7
+ border: 3px double;
8
8
  background: #f2f2f2;
9
9
  position: relative;
10
- border-radius: 2px;
10
+ border-radius: 4px;
11
11
  }
12
-
12
+
13
13
  &[danger] {
14
14
  color: #c24;
15
15
  }
16
-
16
+
17
17
  >div {
18
18
  position: relative;
19
- border: 4px solid;
20
- border-left: none;
21
- border-right: none;
19
+ border-top: 7px solid;
20
+ border-bottom: 1px solid;
21
+ border-left: 2px solid;
22
+ border-right: 2px solid;
22
23
  height: 100%;
23
24
  }
24
25
  </style>
@@ -34,9 +34,6 @@ textarea,
34
34
  min-height: 80px;
35
35
  }
36
36
 
37
- & {
38
- min-height: 130px;
39
- }
40
37
 
41
38
  input {
42
39
  width: 100%;