efront 4.4.14 → 4.5.3

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 (60) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +83 -5
  2. package/apps/pivot/api.yml +4 -0
  3. package/apps/pivot/cert/edit.js +1 -0
  4. package/apps/pivot/cert/list.js +9 -0
  5. package/apps/pivot/cert/main.xht +188 -0
  6. package/apps/pivot/cert/orders.xht +232 -0
  7. package/apps/pivot/cert/update.xht +7 -0
  8. package/apps/pivot/menu.yml +1 -0
  9. package/coms/basic/assert.js +40 -16
  10. package/coms/basic/cross_.js +22 -4
  11. package/coms/basic/renderTags.js +23 -0
  12. package/coms/basic/shallowClone.js +8 -0
  13. package/coms/basic/shallowEqual.js +13 -4
  14. package/coms/basic/valid.js +19 -4
  15. package/coms/compile/Javascript.js +25 -12
  16. package/coms/compile//347/264/240/351/246/250.js +2 -1
  17. package/coms/docs/codetext.xht +3 -3
  18. package/coms/frame/chat.js +1 -1
  19. package/coms/frame/edit.html +1 -0
  20. package/coms/frame/edit.js +3 -2
  21. package/coms/kugou/bindScroll.js +1 -1
  22. package/coms/kugou/krc.js +2 -2
  23. package/coms/layer/leftCenter.js +5 -5
  24. package/coms/pivot/acme2.js +290 -0
  25. package/coms/pivot/pedit.js +13 -5
  26. package/coms/pivot/plist.js +12 -5
  27. package/coms/reptile/colored_console.js +5 -17
  28. package/coms/zimoli/appendChild.js +3 -2
  29. package/coms/zimoli/autofocus.js +2 -2
  30. package/coms/zimoli/button.less +5 -3
  31. package/coms/zimoli/checker.js +34 -15
  32. package/coms/zimoli/checker.less +2 -3
  33. package/coms/zimoli/container.js +26 -15
  34. package/coms/zimoli/data.js +124 -169
  35. package/coms/zimoli/field.js +3 -3
  36. package/coms/zimoli/field.less +8 -2
  37. package/coms/zimoli/filterTime.js +39 -8
  38. package/coms/zimoli/fromBase64.js +2 -0
  39. package/coms/zimoli/grid.js +2 -2
  40. package/coms/zimoli/isMounted.js +3 -3
  41. package/coms/zimoli/list.js +5 -5
  42. package/coms/zimoli/maps.js +1 -1
  43. package/coms/zimoli/menuList.js +1 -1
  44. package/coms/zimoli/model.js +61 -8
  45. package/coms/zimoli/on.js +4 -4
  46. package/coms/zimoli/remove.js +3 -3
  47. package/coms/zimoli/render.js +25 -33
  48. package/coms/zimoli/scrollbar.js +54 -19
  49. package/coms/zimoli/scrollbar.less +14 -2
  50. package/coms/zimoli/scrollbar_test.less +1 -0
  51. package/coms/zimoli/select.js +3 -3
  52. package/coms/zimoli/table.js +1 -1
  53. package/coms/zimoli/toBase64.js +16 -6
  54. package/coms/zimoli/view.js +24 -14
  55. package/coms/zimoli/view.less +6 -4
  56. package/coms/zimoli/watch.js +1 -1
  57. package/docs/loader.js +1 -1
  58. package/docs//347/273/204/344/273/266.xht +0 -1
  59. package/package.json +1 -1
  60. package/public/efront.js +1 -1
@@ -98,7 +98,7 @@ var seekFromSource = function (obj, base) {
98
98
  function getErrorMessage(error = this) {
99
99
  if (!isObject(error)) return String(error);
100
100
  if (error instanceof Error) return String(error);
101
- var words = "reason,message,desc,descption,msg,err,error,data".split(',');
101
+ var words = "reason,message,desc,descption,msg,err,error,detail,data".split(',');
102
102
  while (words.length) {
103
103
  var a = words.shift();
104
104
  if (error[a]) {
@@ -176,29 +176,30 @@ function getParamsFromUrl(url, s = "?") {
176
176
  function getUrlParamsForApi(api, url) {
177
177
  var r = /([\s\S]*?)/.source;
178
178
  var cap = [];
179
- var base = api.url.replace(/[\?\#][\s\S]*$/, '')
179
+ var reg = api.url.replace(/[\?\#][\s\S]*$/, '')
180
180
  .replace(/[\.\*\+\-\[\]\{\}\(\)\\\/\!<\>\^]/g, '\\$&')
181
- .replace(/\:\w+/, function (a) {
181
+ .replace(/\:\w+/g, function (a) {
182
182
  cap.push(a.slice(1));
183
183
  return r;
184
184
  });
185
- if (api.base) base = api.base + base;
186
- if (/\/$/.test(base)) base += "?";
185
+ if (/\/$/.test(reg)) reg += "?";
187
186
  var params = {};
188
- url = url.replace(/[\?#]*$/g, function (match) {
187
+ url = url.replace(/[\?#][\s\S]*$/g, function (match) {
189
188
  match.split(/[&#\?]+/).forEach(function (s) {
190
189
  if (!s) return;
191
190
  var [k, v] = s.split("=");
192
191
  params[k] = v;
193
192
  });
194
193
  return '';
195
- }).replace(new RegExp(`^${base}$`, 'ig'), function () {
194
+ });
195
+ if (api.base === url.slice(0, api.base.length)) url = url.slice(api.base.length), reg = new RegExp(`^${reg}$`);
196
+ else reg = new RegExp(reg + '$');
197
+ url.replace(reg, function () {
196
198
  var args = arguments;
197
199
  cap.forEach(function (a, cx) {
198
200
  params[a] = args[cx + 1];
199
201
  });
200
202
  });
201
- params = serialize(params);
202
203
  return params;
203
204
  }
204
205
 
@@ -256,7 +257,7 @@ function seekResponse(data, seeker, apiMap = {}) {
256
257
  data = JSON.parse(data);
257
258
  }
258
259
  if (next) {
259
- data = (pick || next.id) + "?" + getUrlParamsForApi(next, data);
260
+ data = (pick || next.id) + "?" + serialize(getUrlParamsForApi(next, data));
260
261
  if (getNextValue) {
261
262
  data = getParamsFromUrl(data);
262
263
  if (pick) data = data[pick];
@@ -300,9 +301,9 @@ function parseConfig(api) {
300
301
  });
301
302
  return '';
302
303
  });
303
- url.replace(/[\?\#][\s\S]*$/, '').replace(/([\:\\]\:|\:\w+)/g, function (p) {
304
+ url.replace(/[\#][\s\S]*$/, '').replace(/([\:\\]\:|\:\w+)/g, function (p) {
304
305
  p = p.slice(1);
305
- if (!required[p] && p !== ':') {
306
+ if (p !== ':' && required.indexOf(p) < 0) {
306
307
  required.push(p);
307
308
  }
308
309
  });
@@ -468,7 +469,43 @@ function LoadingArray_then(ok, oh) {
468
469
  function LoadingArray_abort(ok, oh) {
469
470
  if (this.loading) this.loading.abort();
470
471
  }
471
-
472
+ var getApi = function (serviceId, promised_map) {
473
+ return promised_map.then((apiMap) => {
474
+ serviceId = serviceId.replace(/[\?\:][\s\S]*$/, "");
475
+ const api = apiMap[serviceId];
476
+ if (!api) throw new Error(i18n`没有找到对应的接口 id ${serviceId}.`);
477
+ return extend({}, api, { root: apiMap });
478
+ });
479
+ };
480
+ var prepareURL = function (url, params) {
481
+ var rest = [];
482
+ var search;
483
+ var uri = url.replace(/#[\s\S]*$/, "").replace(/[\\\:]\:|\:[a-z\_][\w]*/gi, function (d) {
484
+ d = d.slice(1);
485
+ if (d === ":") return d;
486
+ rest.push(d);
487
+ return seekResponse(params, d) || '';
488
+ });
489
+ if (isObject(params)) params = extend(params instanceof Array ? [] : {}, params);
490
+ if (/\?/.test(uri)) search = uri.replace(/^[\s\S]*?\?/, "");
491
+ var baseuri = uri.replace(/\?[\s\S]*$/, "");
492
+ var hasOwnProperty = {}.hasOwnProperty;
493
+ if (search) {
494
+ var searchParams = parseKV(search);
495
+ if (params) for (var k in searchParams) {
496
+ if (hasOwnProperty.call(searchParams, k) && hasOwnProperty.call(params, k)) {
497
+ searchParams[k] = params[k];
498
+ rest.push(k);
499
+ }
500
+ }
501
+ search = serialize(searchParams);
502
+ if (search) uri = baseuri + "?" + search;
503
+ else uri = baseuri;
504
+ } else {
505
+ uri = baseuri;
506
+ }
507
+ return [uri, rest, baseuri, search];
508
+ };
472
509
  var privates = {
473
510
  pack(serviceId, params) {
474
511
  if (/\?/.test(serviceId)) {
@@ -498,7 +535,7 @@ var privates = {
498
535
  params = this.repare(api, params);
499
536
  return this.loadIgnoreConfig(api.method, url, params, api);
500
537
  }
501
- return Promise.resolve();
538
+ return Promise.reject(ABORTED);
502
539
  },
503
540
  repare(api, params) {
504
541
  var { required, autotrim, prepared } = api;
@@ -545,12 +582,7 @@ var privates = {
545
582
  return true;
546
583
  },
547
584
  getApi(serviceId) {
548
- return this.getConfigPromise().then((apiMap) => {
549
- serviceId = serviceId.replace(/[\?\:][\s\S]*$/, "");
550
- const api = apiMap[serviceId];
551
- if (!api) throw new Error(i18n`没有找到对应的接口 id ${serviceId}.`);
552
- return extend({}, api, { root: apiMap });
553
- });
585
+ return getApi(serviceId, this.getConfigPromise());
554
586
  },
555
587
  prepare(method, url, params) {
556
588
  var spliterIndex = /[\:\|\/\~\!\?]/.exec(method), search;
@@ -558,33 +590,8 @@ var privates = {
558
590
  else spliterIndex = method.length;
559
591
  var coinmethod = method.slice(0, spliterIndex).toLowerCase();
560
592
  var realmethod = coinmethod.replace(/\W+$/g, '');
561
- var rest = [];
562
- var uri = url.replace(/#[\s\S]*$/, "").replace(/[\\\:]\:|\:[a-z\_][\w]*/gi, function (d) {
563
- d = d.slice(1);
564
- if (d === ":") return d;
565
- rest.push(d);
566
- return seekResponse(params, d) || '';
567
- });
568
- if (isObject(params)) params = extend(params instanceof Array ? [] : {}, params);
569
- if (/\?/.test(uri)) search = uri.replace(/^[\s\S]*?\?/, "");
570
- var baseuri = uri.replace(/\?[\s\S]*$/, "");
571
- var hasOwnProperty = {}.hasOwnProperty;
572
- if (search) {
573
- var searchParams = parseKV(search);
574
- if (params) for (var k in searchParams) {
575
- if (hasOwnProperty.call(searchParams, k) && hasOwnProperty.call(params, k)) {
576
- searchParams[k] = params[k];
577
- rest.push(k);
578
- }
579
- }
580
- search = serialize(searchParams);
581
- if (search) uri = baseuri + "?" + search;
582
- else uri = baseuri;
583
- } else {
584
- uri = baseuri;
585
- }
586
-
587
- rest.forEach(k => delete params[k]);
593
+ var [uri, rest, baseuri, search] = prepareURL(url, params);
594
+ if (params && rest.length) rest.forEach(r => delete params[r]);
588
595
  return { method: realmethod, coinmethod, selector: method.slice(spliterIndex + 1), search, baseuri, uri, params };
589
596
  },
590
597
  loadIgnoreConfig(method, url, params1, api) {
@@ -595,7 +602,7 @@ var privates = {
595
602
  var temp = JSON.stringify(params);
596
603
  var currentTime = +new Date;
597
604
  var loading = promise && promise.loading;
598
- if (!promise || currentTime - promise.time > 60 || temp !== promise.params || promise.search !== search) {
605
+ if (!promise || currentTime - promise.time > 60 || temp !== promise.params || promise.search !== search || promise.uri !== uri) {
599
606
  var promise = new Promise(function (ok, oh) {
600
607
  if (headers) {
601
608
  headers = seekFromSource(headers, api.base);
@@ -605,12 +612,13 @@ var privates = {
605
612
  }).error(xhr => {
606
613
  try {
607
614
  var e = getErrorMessage(parseData(xhr.response || xhr.responseText || xhr.statusText || xhr.status));
608
- oh({ status: xhr.status, api, params: params1, error: e, toString: getErrorMessage })
615
+ oh({ status: loading.status, api, params: params1, error: e, toString: getErrorMessage })
609
616
  } catch (error) {
610
617
  oh(error);
611
618
  }
612
619
  });
613
620
  });
621
+ promise.uri = uri;
614
622
  promise.loading = loading;
615
623
  promise.search = search;
616
624
  promise.params = temp;
@@ -619,7 +627,11 @@ var privates = {
619
627
  }
620
628
  var p = promise.then(function (response) {
621
629
  if (/\*$/.test(coinmethod)) return response;
622
- var data = parseData(response);
630
+ var type = loading.getResponseHeader?.("content-type");
631
+ var data = response;
632
+ if (/text\/plain|json|[xyt]ml/i.test(type)) {
633
+ data = parseData(data);
634
+ }
623
635
  var checked = error_check(data);
624
636
  var apiMap = api && api.root;
625
637
  var trans = api ? api.transpile : getTranspile(url);
@@ -672,6 +684,7 @@ var loadInstance = function (storage, id) {
672
684
  };
673
685
 
674
686
  function responseCrash(e, data) {
687
+ if (e === ABORTED || e === OUTDATE) return;
675
688
  data.is_errored = true;
676
689
  data.is_loading = false;
677
690
  data.error_message = getErrorMessage(e);
@@ -681,6 +694,10 @@ function responseCrash(e, data) {
681
694
  } else {
682
695
  data.error = e;
683
696
  }
697
+ if (isObject(e)) {
698
+ if (e.reported) return;
699
+ e.reported = true;
700
+ }
684
701
  error_report(e, e.status < 500 ? 'warn' : 'error');
685
702
  }
686
703
  var toDataString = function () { return isEmpty(this.data) ? '' : this.data };
@@ -724,8 +741,14 @@ var unbindInstance = function (instanceId, callback) {
724
741
  };
725
742
  var OUTDATE = new Error(i18n`请求被覆盖`);
726
743
  var ABORTED = new Error(i18n`请求已取消`);
744
+ var oncatch = function (e) {
745
+ if (e === OUTDATE || e === ABORTED) return;
746
+ throw e;
747
+ };
727
748
  var data = {
749
+ prepareURL,
728
750
  decodeStructure,
751
+ getUrlParamsForApi,
729
752
  encodeStructure,
730
753
  abortAll: cross.abortAll,
731
754
  responseLoaded(response) {
@@ -812,12 +835,15 @@ var data = {
812
835
  config = Promise.resolve(config).then(createApiMap);
813
836
  }
814
837
  return enrich({
815
- from(id, params) {
816
- return config.then(function (data) {
817
- var a = data[id];
818
- return privates.fromApi(a, params);
838
+ from(id, params, parse) {
839
+ return config.then(function (map) {
840
+ var a = map[id];
841
+ return data.fromApi(a, params, parse);
819
842
  });
820
843
  },
844
+ getApi(id) {
845
+ return getApi(id, config);
846
+ },
821
847
  queue(ids, params, cb) {
822
848
  ids = ids.slice(0);
823
849
  config.then(function (res) {
@@ -835,86 +861,57 @@ var data = {
835
861
  });
836
862
  },
837
863
  fromApi(api, params, parse) {
838
- var id = parse instanceof Function ? getInstanceId() : 0;
839
864
  var p = privates.fromApi(api, params);
840
- if (id) this.removeInstance(id);
841
- var url = api.url;
842
- var response = this.getInstance(id || url);
843
- if (!isObject(response)) response = new LoadingArray;
844
- this.responseLoading(response);
845
- response.loading = p.loading;
846
- p = response.loading_promise = p.then((data) => {
847
- response.loading = null;
848
- if (id) {
849
- data = parse(data);
850
- this.setInstance(id, data, false);
851
- this.removeInstance(id);
852
- } else {
853
- this.setInstance(url, data);
854
- }
855
- this.responseLoaded(response);
856
- return data;
857
- });
858
- p.catch((e) => {
859
- this.responseCrash(e, response);
860
- });
861
- return response;
862
-
865
+ p.id = api.id;
866
+ return this.createResponse(p, parse);
867
+ },
868
+ postURL(url, data, parse) {
869
+ var p = privates.loadIgnoreConfig("post", url, data);
870
+ p.id = "post " + url;
871
+ return this.createResponse(p, parse);
863
872
  },
864
873
  fromURL(url, parse) {
865
- var id = parse instanceof Function ? getInstanceId() : 0;
866
874
  var p = privates.loadIgnoreConfig('get', url);
875
+ p.id = "get " + url;
876
+ return this.createResponse(p, parse);
877
+ },
878
+ createResponse(p, parse) {
879
+ var id = parse instanceof Function ? getInstanceId() : 0;
867
880
  if (id) this.removeInstance(id);
868
- var response = this.getInstance(id || url);
881
+ var pid = p.id;
882
+ var response = this.getInstance(id || pid);
869
883
  if (!isObject(response)) response = new LoadingArray;
870
884
  this.responseLoading(response);
871
885
  response.loading = p.loading;
872
- p = response.loading_promise = p.then((data) => {
886
+ response.loading_promise = p;
887
+ p = p.then((data) => {
873
888
  response.loading = null;
874
889
  if (id) {
875
890
  data = parse(data);
876
891
  this.setInstance(id, data, false);
877
892
  this.removeInstance(id);
878
893
  } else {
879
- this.setInstance(url, data);
894
+ this.setInstance(pid, data);
880
895
  }
881
896
  this.responseLoaded(response);
882
897
  return data;
883
- });
884
- p.catch((e) => {
898
+ }, (e) => {
885
899
  this.responseCrash(e, response);
886
- });
887
-
900
+ })
901
+ if (parse) response.loading_promise = p;
888
902
  return response;
889
903
  },
890
904
  asyncInstance(sid, params, parse) {
891
905
  // 不同参数的请求互不影响
892
906
  if (typeof sid !== "string") throw new Error(i18n`serviceId 只能是字符串`);
893
- var id = parse instanceof Function || params ? getInstanceId() : 0;
894
- if (id) this.removeInstance(id);
895
- var response = this.getInstance(id || sid);
896
- if (!isObject(response)) response = new LoadingArray;
897
- this.responseLoading(response);
898
- var p = response.loading_promise = privates.getApi(sid).then((api) => {
907
+ var p = privates.getApi(sid).then((api) => {
899
908
  params = privates.pack(sid, params);
900
909
  var p = privates.fromApi(api, params);
901
- response.loading = p.loading;
910
+ p.loading = response.loading = p.loading;
902
911
  return p;
903
- }).then((data) => {
904
- response.loading = null;
905
- if (id) {
906
- data = parse instanceof Function ? parse(data) : data;
907
- this.setInstance(id, data, false);
908
- this.removeInstance(id);
909
- } else {
910
- this.setInstance(sid, data);
911
- }
912
- this.responseLoaded(response);
913
- return data;
914
- });
915
- p.catch((e) => {
916
- this.responseCrash(e, response);
917
- });
912
+ }, oncatch);
913
+ p.id = sid;
914
+ var response = this.createResponse(p, parse);
918
915
  return response;
919
916
  },
920
917
 
@@ -939,77 +936,35 @@ var data = {
939
936
  });
940
937
  var id = "." + sid;
941
938
  var instance = this.getInstance(id);
942
- if (!isObject(instance)) instance = new LoadingArray;
943
-
944
- var promise1 = instance.loading_promise;
945
- if (promise1) {
946
- var params = promise1.params;
947
- if (shallowEqual(params1, params)) {
948
- return instance;
949
- }
950
- }
951
- this.responseLoading(instance);
952
- promise1 = instance.loading_promise = new Promise(function (ok) {
953
- if (!instance.loading) {
954
- instance.loading = false;
955
- }
956
- setTimeout(ok, timeout);
939
+ var loading_promise = instance && instance.loading_promise;
940
+ var p = Promise.resolve().then(function () {
941
+ if (loading_promise) return wait(timeout);
942
+ return wait(60);
957
943
  }).then(function () {
958
- if (promise1 !== instance.loading_promise) throw OUTDATE;
944
+ if (p !== instance.loading_promise) throw OUTDATE;
959
945
  return privates.getApi(sid);
960
946
  }).then((api) => {
961
- if (promise1 !== instance.loading_promise) throw OUTDATE;
947
+ if (p !== instance.loading_promise) throw OUTDATE;
948
+ if ("params" in instance && shallowEqual(instance.params, params1)) throw ABORTED;
949
+ instance.params = params1;
962
950
  if (instance.loading) {
963
951
  instance.loading.abort();
964
952
  }
965
- var params2 = privates.pack(sid, params1);
966
- if (!privates.validApi(api, params2)) throw ABORTED;
967
- let url = api.url;
968
- var base = api.base;
969
- if (base) url = base + api.path;
970
- var { method, uri, params, selector } = privates.prepare(api.method, url, params2);
971
- var promise = new Promise(function (ok, oh) {
972
- var headers = api.headers;
973
- if (headers) {
974
- headers = seekFromSource(headers, api.base);
975
- }
976
- instance.loading = cross(method, uri, headers).send(params).done(xhr => {
977
- if (instance.loading !== xhr) return oh(ABORTED);
978
- instance.loading = null;
979
- ok(xhr.responseText || xhr.response);
980
- }).error(xhr => {
981
- if (instance.loading !== xhr) return oh(ABORTED);
982
- instance.loading = null;
983
- try {
984
- var e = getErrorMessage(parseData(xhr.response || xhr.responseText || xhr.statusText || xhr.status));
985
- oh({ status: xhr.status, error: e, api, params: params2, toString: getErrorMessage })
986
- } catch (error) {
987
- oh(error);
988
- }
989
- });
990
- }).then(function (response) {
991
- return transpile(seekResponse(parseData(response), selector), api.transpile, api.root);
992
- });
993
- return promise;
953
+ var r = privates.fromApi(api, params1);
954
+ instance.loading = r.loading;
955
+ return r;
994
956
  }).then((data) => {
995
- if (instance.loading_promise !== promise1) throw ABORTED;
996
- if (id) {
997
- data = parse instanceof Function ? parse(data) : data;
998
- this.setInstance(id, data, false);
999
- } else {
1000
- this.setInstance(sid, data);
1001
- }
1002
- this.responseLoaded(instance);
957
+ if (instance.loading_promise !== p) throw ABORTED;
958
+ if (isFunction(parse)) data = parse(data);
1003
959
  return data;
1004
- }).catch(function (e) {
1005
- if (e === OUTDATE || e === ABORTED) return;
1006
- throw e;
960
+ }, oncatch);
961
+ p.id = id;
962
+ var instance = this.createResponse(p);
963
+ p.catch(function () { }).then(() => {
964
+ return wait(timeout);
965
+ }).then(() => {
966
+ if (instance.loading_promise === p) delete instance.loading_promise;
1007
967
  });
1008
- promise1.params = params;
1009
- promise1.catch((e) => {
1010
- this.responseCrash(e, instance);
1011
- });
1012
-
1013
968
  return instance;
1014
969
  },
1015
970
  /**
@@ -1,8 +1,7 @@
1
1
  function main(elem) {
2
2
  elem = optionbar.apply(null, arguments);
3
3
  var scope = {};
4
- care(elem, function (p) {
5
- if (elem.childNodes.length) return;
4
+ if (!elem.childNodes.length) care(elem, function (p) {
6
5
  var [f, data] = p;
7
6
  elem.innerHTML = field;
8
7
  render(elem, scope = {
@@ -10,13 +9,14 @@ function main(elem) {
10
9
  data,
11
10
  error: null,
12
11
  field: f,
12
+ container,
13
13
  readonly: !!this.readonly
14
14
  });
15
15
  elem.oldValue = data[f.key];
16
16
  elem.setAttribute("field", f.key);
17
17
  }, false);
18
18
  elem.setAttribute("field", '');
19
- elem.renders = [function () {
19
+ elem.$renders = [function () {
20
20
  if (!(this.src instanceof Array)) return;
21
21
  var [f, data] = this.src;
22
22
  if (!f || !data) return;
@@ -2,6 +2,11 @@
2
2
  height: auto;
3
3
  box-shadow: none !important;
4
4
 
5
+ >model:first-child {
6
+ padding: 6px 10px;
7
+ display: block;
8
+ }
9
+
5
10
  >.head {
6
11
  vertical-align: top;
7
12
 
@@ -47,7 +52,8 @@
47
52
  border-color: #f32;
48
53
  outline: 1px solid #f32;
49
54
  }
50
- .error{
51
- color:#c32;
55
+
56
+ .error {
57
+ color: #c32;
52
58
  }
53
59
  }
@@ -38,6 +38,7 @@ function format(formater) {
38
38
  });
39
39
  }
40
40
  function filterTime(time, format) {
41
+ if (!isHandled(time)) return '';
41
42
  if (isFinite(time)) time = +time;
42
43
  var value = new Date(time);
43
44
  if (!+value) {
@@ -50,37 +51,67 @@ function filterTime(time, format) {
50
51
  format = format.charAt(0);
51
52
  }
52
53
  var splited = getSplitedDate(value);
54
+ var now = new Date;
53
55
  var [year, month, date, hour, minute, second, milli, day] = splited;
54
- var [year1, month1, date1, hour1, minute1] = getSplitedDate(new Date);
56
+ var [year1, month1, date1, hour1, minute1, second1, milli1, day1] = getSplitedDate(now);
55
57
  var today = new Date(year1, month1 - 1, date1);
56
58
  var thatday = new Date(year, month - 1, date);
57
59
  var delta = (today - thatday) / 24 / 3600000;
58
- var time = `${hour}:${fixLength(minute)}`;
59
- if (delta < 6 && delta > 2) {
60
- return `星期` + days[day] + hour + "点";
60
+ if (minute === 0) var time = hour + "点";
61
+ else if (minute === 30) time = hour + "点半";
62
+ else time = `${hour}:${fixLength(minute)}`;
63
+ if (delta < 7 && delta > 2) {
64
+ if (day >= day1) {
65
+ return `上星期` + days[day] + time;
66
+ }
67
+ return `星期` + days[day] + time;
68
+ }
69
+ else if (delta > -7 && delta < -2) {
70
+ if (day <= day1) {
71
+ return `下星期` + days[day] + time;
72
+ }
73
+ return `星期` + days[day] + time;
61
74
  }
62
75
  switch (delta) {
63
76
  case 0:
64
77
  if (minute === minute1 && hour === hour1) {
65
- return `刚刚`;
78
+ if (second <= second1) return `刚刚`;
79
+ return `${second - second1}秒后`;
80
+ }
81
+ else if (value > now) {
82
+ if (hour === hour1) {
83
+ return `${minute - minute1}分钟后`;
84
+ }
85
+ return `还有${hour - hour1}小时${minute - minute1}分钟`;
66
86
  }
67
87
  return time;
88
+ case -1:
89
+ return "明天" + time;
68
90
  case 1:
69
- return '昨天' + hour + "点"
91
+ return '昨天' + time;
70
92
  case 2:
71
- return '前天' + hour + "点"
93
+ return '前天' + time;
94
+ case -2:
95
+ return "后天" + time;
72
96
  default:
73
97
  switch (year1 - year) {
74
98
  case 0:
99
+ if (value > now) {
100
+ return `今年${month}${format || '月'}${date}${format ? '' : '日'} ${time}`;
101
+ }
75
102
  return `${month}${format || '月'}${date}${format ? '' : '日'} `;
76
103
  case 1:
77
104
  if (month1 < month) {
78
105
  return `${month}${format || '月'}${date}${format ? '' : '日'} `;
79
106
  }
80
107
  return "去年" + month + "月";
108
+ case -1:
109
+ return "明年" + month + "月" + date + "日";
81
110
  case 2:
82
111
  return "前年" + month + "月";
112
+ case -2:
113
+ return "后年" + month + "月" + date + "日";
83
114
  }
84
- return `${year}${format || '年'}`;
115
+ return `${year}${format || '年'}${month}${format || "月"}`;
85
116
  }
86
117
  }
@@ -5,6 +5,8 @@ var decodeMap = function () {
5
5
  for (var cx = 0, dx = encoding.length; cx < dx; cx++) {
6
6
  map[encoding[cx]] = cx;
7
7
  }
8
+ map["-"] = map["+"];
9
+ map["_"] = map["/"];
8
10
  return map;
9
11
  }();
10
12
  function fromBase64(input) {
@@ -290,7 +290,7 @@ function grid(breakpoints) {
290
290
  }
291
291
  extend(grid, grid_prototype);
292
292
  if (!breakpoints) {
293
- if (grid.clientHeight || grid.isMounted) {
293
+ if (grid.clientHeight || grid.$mounted) {
294
294
  createPointsWithChildren.call(grid);
295
295
  } else {
296
296
  on("append")(grid, createPointsWithChildren);
@@ -454,7 +454,7 @@ var grid_prototype = {
454
454
  run(this.breakpoints);
455
455
  },
456
456
  reshape() {
457
- if (this.isMounted || this.offsetWidth || this.offsetHeight) {
457
+ if (this.$mounted || this.offsetWidth || this.offsetHeight) {
458
458
  this._reshape();
459
459
  } else {
460
460
  once("append")(this, this._reshape);
@@ -1,9 +1,9 @@
1
1
  function isMounted(parent) {
2
- if ("isMounted" in parent) return parent.isMounted;
2
+ if ("$mounted" in parent) return parent.$mounted;
3
3
  var temp = parent;
4
4
  while (temp && temp !== document.documentElement) {
5
- if ("isMounted" in temp) {
6
- return parent.isMounted = temp.isMounted;
5
+ if ("$mounted" in temp) {
6
+ return parent.$mounted = temp.$mounted;
7
7
  }
8
8
  temp = temp.parentNode;
9
9
  }
@@ -9,10 +9,10 @@ function ylist(container, generator, $Y) {
9
9
  list.autoFix = true;
10
10
  var saved_itemIndex = 0;
11
11
  addClass(list, 'list-' + $Y.toLowerCase());
12
- if (!list.renders) {
13
- list.renders = [];
12
+ if (!list.$renders) {
13
+ list.$renders = [];
14
14
  }
15
- list.renders.push(function () {
15
+ list.$renders.push(function () {
16
16
  var a = saved_itemIndex;
17
17
  saved_itemIndex = void 0;
18
18
  if (a !== void 0) scrollTo(a);
@@ -463,9 +463,9 @@ function ylist(container, generator, $Y) {
463
463
  * @param {Element|null} focused
464
464
  * @param {boolean} animate
465
465
  */
466
- list.setFocus = function (focused, animate) {
466
+ list.setFocus = function (focused, animate = true) {
467
467
  if (isElement(focused) && (focused.hasAttribute("disabled") || focused.hasAttribute("line"))) return;
468
- if (isFinite(focused)) {
468
+ if (focused === (focused | 0)) {
469
469
  var index = focused;
470
470
  focused = list.getIndexedElement(index);
471
471
  if (!focused) {