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.
- package/#/345/233/275/351/231/205/345/214/226.yml +83 -5
- package/apps/pivot/api.yml +4 -0
- package/apps/pivot/cert/edit.js +1 -0
- package/apps/pivot/cert/list.js +9 -0
- package/apps/pivot/cert/main.xht +188 -0
- package/apps/pivot/cert/orders.xht +232 -0
- package/apps/pivot/cert/update.xht +7 -0
- package/apps/pivot/menu.yml +1 -0
- package/coms/basic/assert.js +40 -16
- package/coms/basic/cross_.js +22 -4
- package/coms/basic/renderTags.js +23 -0
- package/coms/basic/shallowClone.js +8 -0
- package/coms/basic/shallowEqual.js +13 -4
- package/coms/basic/valid.js +19 -4
- package/coms/compile/Javascript.js +25 -12
- package/coms/compile//347/264/240/351/246/250.js +2 -1
- package/coms/docs/codetext.xht +3 -3
- package/coms/frame/chat.js +1 -1
- package/coms/frame/edit.html +1 -0
- package/coms/frame/edit.js +3 -2
- package/coms/kugou/bindScroll.js +1 -1
- package/coms/kugou/krc.js +2 -2
- package/coms/layer/leftCenter.js +5 -5
- package/coms/pivot/acme2.js +290 -0
- package/coms/pivot/pedit.js +13 -5
- package/coms/pivot/plist.js +12 -5
- package/coms/reptile/colored_console.js +5 -17
- package/coms/zimoli/appendChild.js +3 -2
- package/coms/zimoli/autofocus.js +2 -2
- package/coms/zimoli/button.less +5 -3
- package/coms/zimoli/checker.js +34 -15
- package/coms/zimoli/checker.less +2 -3
- package/coms/zimoli/container.js +26 -15
- package/coms/zimoli/data.js +124 -169
- package/coms/zimoli/field.js +3 -3
- package/coms/zimoli/field.less +8 -2
- package/coms/zimoli/filterTime.js +39 -8
- package/coms/zimoli/fromBase64.js +2 -0
- package/coms/zimoli/grid.js +2 -2
- package/coms/zimoli/isMounted.js +3 -3
- package/coms/zimoli/list.js +5 -5
- package/coms/zimoli/maps.js +1 -1
- package/coms/zimoli/menuList.js +1 -1
- package/coms/zimoli/model.js +61 -8
- package/coms/zimoli/on.js +4 -4
- package/coms/zimoli/remove.js +3 -3
- package/coms/zimoli/render.js +25 -33
- package/coms/zimoli/scrollbar.js +54 -19
- package/coms/zimoli/scrollbar.less +14 -2
- package/coms/zimoli/scrollbar_test.less +1 -0
- package/coms/zimoli/select.js +3 -3
- package/coms/zimoli/table.js +1 -1
- package/coms/zimoli/toBase64.js +16 -6
- package/coms/zimoli/view.js +24 -14
- package/coms/zimoli/view.less +6 -4
- package/coms/zimoli/watch.js +1 -1
- package/docs/loader.js +1 -1
- package/docs//347/273/204/344/273/266.xht +0 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/coms/zimoli/data.js
CHANGED
|
@@ -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
|
|
179
|
+
var reg = api.url.replace(/[\?\#][\s\S]*$/, '')
|
|
180
180
|
.replace(/[\.\*\+\-\[\]\{\}\(\)\\\/\!<\>\^]/g, '\\$&')
|
|
181
|
-
.replace(/\:\w
|
|
181
|
+
.replace(/\:\w+/g, function (a) {
|
|
182
182
|
cap.push(a.slice(1));
|
|
183
183
|
return r;
|
|
184
184
|
});
|
|
185
|
-
if (
|
|
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
|
-
})
|
|
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(/[
|
|
304
|
+
url.replace(/[\#][\s\S]*$/, '').replace(/([\:\\]\:|\:\w+)/g, function (p) {
|
|
304
305
|
p = p.slice(1);
|
|
305
|
-
if (
|
|
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.
|
|
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()
|
|
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
|
-
|
|
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:
|
|
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
|
|
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 (
|
|
817
|
-
var a =
|
|
818
|
-
return
|
|
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
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
-
})
|
|
904
|
-
|
|
905
|
-
|
|
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
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
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 (
|
|
944
|
+
if (p !== instance.loading_promise) throw OUTDATE;
|
|
959
945
|
return privates.getApi(sid);
|
|
960
946
|
}).then((api) => {
|
|
961
|
-
if (
|
|
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
|
|
966
|
-
|
|
967
|
-
|
|
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 !==
|
|
996
|
-
if (
|
|
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
|
-
}
|
|
1005
|
-
|
|
1006
|
-
|
|
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
|
/**
|
package/coms/zimoli/field.js
CHANGED
|
@@ -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
|
|
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;
|
package/coms/zimoli/field.less
CHANGED
|
@@ -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
|
-
|
|
51
|
-
|
|
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(
|
|
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 =
|
|
59
|
-
if (
|
|
60
|
-
|
|
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 '昨天' +
|
|
91
|
+
return '昨天' + time;
|
|
70
92
|
case 2:
|
|
71
|
-
return '前天' +
|
|
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
|
}
|
package/coms/zimoli/grid.js
CHANGED
|
@@ -290,7 +290,7 @@ function grid(breakpoints) {
|
|
|
290
290
|
}
|
|
291
291
|
extend(grid, grid_prototype);
|
|
292
292
|
if (!breakpoints) {
|
|
293
|
-
if (grid.clientHeight || grid
|
|
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
|
|
457
|
+
if (this.$mounted || this.offsetWidth || this.offsetHeight) {
|
|
458
458
|
this._reshape();
|
|
459
459
|
} else {
|
|
460
460
|
once("append")(this, this._reshape);
|
package/coms/zimoli/isMounted.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
function isMounted(parent) {
|
|
2
|
-
if ("
|
|
2
|
+
if ("$mounted" in parent) return parent.$mounted;
|
|
3
3
|
var temp = parent;
|
|
4
4
|
while (temp && temp !== document.documentElement) {
|
|
5
|
-
if ("
|
|
6
|
-
return parent
|
|
5
|
+
if ("$mounted" in temp) {
|
|
6
|
+
return parent.$mounted = temp.$mounted;
|
|
7
7
|
}
|
|
8
8
|
temp = temp.parentNode;
|
|
9
9
|
}
|
package/coms/zimoli/list.js
CHANGED
|
@@ -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
|
|
13
|
-
list
|
|
12
|
+
if (!list.$renders) {
|
|
13
|
+
list.$renders = [];
|
|
14
14
|
}
|
|
15
|
-
list
|
|
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 (
|
|
468
|
+
if (focused === (focused | 0)) {
|
|
469
469
|
var index = focused;
|
|
470
470
|
focused = list.getIndexedElement(index);
|
|
471
471
|
if (!focused) {
|