efront 4.36.2 → 4.36.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 +24 -0
- package/apps/pivot/menu.yml +1 -0
- package/apps/pivot/todo/edit.xht +38 -0
- package/apps/pivot/todo/list.xht +136 -0
- package/apps/pivot/token/list.js +1 -0
- package/coms/basic/$split.js +4 -5
- package/coms/basic/Table.js +1 -1
- package/coms/basic/cross_.js +2 -0
- package/coms/basic/data.js +280 -266
- package/coms/basic/enrich.js +2 -1
- package/coms/basic/i18n.js +6 -2
- package/coms/basic/math.js +177 -60
- package/coms/basic/math.md +26 -12
- package/coms/basic/str2array.js +1 -1
- package/coms/basic_/Promise.js +1 -1
- package/coms/compile/Html.js +1 -0
- package/coms/compile/Html_test.js +9 -1
- package/coms/compile/Program.js +1 -1
- package/coms/compile/common.js +1 -0
- package/coms/compile/polyfill.js +23 -6
- package/coms/compile//347/256/227/345/274/217.js +17 -1
- package/coms/docs/helps.js +1 -1
- package/coms/frame/top.html +1 -1
- package/coms/pivot/DB.js +51 -0
- package/coms/pivot/todo.xht +69 -0
- package/coms/reptile/cross.js +8 -9
- package/coms/reptile/window.js +0 -1
- package/coms/zimoli/autodragchildren.js +20 -12
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/public//346/226/207/344/273/266/347/263/273/347/273/237//344/270/273/351/241/265.jsp +2 -2
package/coms/basic/data.js
CHANGED
|
@@ -525,164 +525,161 @@ var prepareURL = function (url, params) {
|
|
|
525
525
|
}
|
|
526
526
|
return [uri, rest, baseuri, search];
|
|
527
527
|
};
|
|
528
|
-
var
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
528
|
+
var prepare = function (method, url, params) {
|
|
529
|
+
var spliterIndex = /[\:\|\/\~\!\?\#\.\[]/.exec(method), search;
|
|
530
|
+
if (spliterIndex) spliterIndex = spliterIndex.index;
|
|
531
|
+
else spliterIndex = method.length;
|
|
532
|
+
var coinmethod = method.slice(0, spliterIndex).toLowerCase();
|
|
533
|
+
var realmethod = coinmethod.replace(/\W[\s\S]*$/g, '');
|
|
534
|
+
var [uri, rest, baseuri, search] = prepareURL(url, params);
|
|
535
|
+
if (params && rest.length) rest.forEach(r => delete params[r]);
|
|
536
|
+
var selector = method.slice(spliterIndex);
|
|
537
|
+
if (!/^(?:[\.\#\[]|\:(?:nth|first|last)\-child)/.test(selector)) selector = selector.slice(1);
|
|
538
|
+
return { method: realmethod, coinmethod, selector, search, baseuri, uri, params };
|
|
539
|
+
};
|
|
540
|
+
var loadIgnoreConfig = function (method, url, params1, api) {
|
|
541
|
+
var headers = api && api.headers;
|
|
542
|
+
var { method: realmethod, uri, baseuri, coinmethod, search, selector, params } = prepare(method, url, params1);
|
|
543
|
+
var id = realmethod + " " + baseuri;
|
|
544
|
+
var promise = cachedLoadingPromise[id];
|
|
545
|
+
var temp = JSON.stringify(params);
|
|
546
|
+
var currentTime = +new Date;
|
|
547
|
+
var loading = promise && promise.loading;
|
|
548
|
+
if (!promise || currentTime - promise.time > 60 || temp !== promise.params || promise.search !== search || promise.uri !== uri) {
|
|
549
|
+
var promise = new Promise(function (ok, oh) {
|
|
550
|
+
if (headers) {
|
|
551
|
+
headers = seekFromSource(headers, api.base);
|
|
545
552
|
}
|
|
553
|
+
loading = cross(realmethod, uri, headers).send(params).done(e => {
|
|
554
|
+
ok(e.response || e.responseText);
|
|
555
|
+
}).error(xhr => {
|
|
556
|
+
try {
|
|
557
|
+
var e = getErrorMessage(parseData(xhr.response || xhr.responseText || xhr.statusText || xhr.status));
|
|
558
|
+
oh({ status: loading.status, api, params: params1, error: e, toString: getErrorMessage })
|
|
559
|
+
} catch (error) {
|
|
560
|
+
oh(error);
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
promise.uri = uri;
|
|
565
|
+
promise.loading = loading;
|
|
566
|
+
promise.search = search;
|
|
567
|
+
promise.params = temp;
|
|
568
|
+
promise.time = currentTime;
|
|
569
|
+
cachedLoadingPromise[id] = promise;
|
|
570
|
+
}
|
|
571
|
+
var p = promise.then(function (response) {
|
|
572
|
+
if (/\*$/.test(coinmethod)) return response;
|
|
573
|
+
var type = loading.getResponseHeader?.("content-type");
|
|
574
|
+
var data = response;
|
|
575
|
+
if (/text\/plain|json|[xyt]ml/i.test(type)) {
|
|
576
|
+
data = parseData(data);
|
|
546
577
|
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
if (this.validApi(api, params)) {
|
|
554
|
-
params = this.repare(api, params);
|
|
555
|
-
return this.loadIgnoreConfig(api.method, url, params, api);
|
|
578
|
+
var checked = error_check(data);
|
|
579
|
+
var apiMap = api && api.root;
|
|
580
|
+
var trans = api ? api.transpile : getTranspile(url);
|
|
581
|
+
if (/^\^/.test(selector) && loading.getResponseHeader) {
|
|
582
|
+
data = loading.getResponseHeader(selector.replace(/^\^/, ''));
|
|
583
|
+
selector = '';
|
|
556
584
|
}
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
var { required, autotrim, prepared } = api;
|
|
561
|
-
if (!required.length && !prepared.length && !autotrim) return params;
|
|
562
|
-
var params1 = {};
|
|
563
|
-
required.forEach(k => {
|
|
564
|
-
var v = seekResponse(params, required[k] || k);
|
|
565
|
-
params1[k] = v;
|
|
566
|
-
});
|
|
567
|
-
prepared.forEach(k => {
|
|
568
|
-
var v = params[k];
|
|
569
|
-
if (isEmpty(v)) {
|
|
570
|
-
v = prepared[k];
|
|
571
|
-
}
|
|
572
|
-
params1[k] = v;
|
|
573
|
-
});
|
|
574
|
-
if (!autotrim) {
|
|
575
|
-
for (var k in params) {
|
|
576
|
-
if (!(k in params1)) {
|
|
577
|
-
params1[k] = params[k];
|
|
578
|
-
}
|
|
579
|
-
}
|
|
585
|
+
data = transpile(seekResponse(data, selector), trans, apiMap);
|
|
586
|
+
if (isDefined(checked)) {
|
|
587
|
+
return checked;
|
|
580
588
|
}
|
|
581
|
-
return
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
if (!required[k]) return false;
|
|
591
|
-
var v = seekResponse(params, required[k]);
|
|
592
|
-
if (isEmpty(v)) return true;
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
if (lacks.length) {
|
|
596
|
-
|
|
597
|
-
console.log(i18n`跳过了缺少参数的请求:${api.id} ${api.name} ${api.url}\r\n缺少参数:${lacks.join(', ')}`);
|
|
598
|
-
return false;
|
|
599
|
-
}
|
|
589
|
+
return data;
|
|
590
|
+
});
|
|
591
|
+
p.loading = promise.loading;
|
|
592
|
+
return p;
|
|
593
|
+
};
|
|
594
|
+
var getConfigPromise = function () {
|
|
595
|
+
if (!configPormise) {
|
|
596
|
+
if (!_configfileurl) {
|
|
597
|
+
throw new Error(i18n`没有指定配置文件的路径,请使用data.loadConfig加载配置`);
|
|
600
598
|
}
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
var
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
return { method: realmethod, coinmethod, selector, search, baseuri, uri, params };
|
|
617
|
-
},
|
|
618
|
-
loadIgnoreConfig(method, url, params1, api) {
|
|
619
|
-
var headers = api && api.headers;
|
|
620
|
-
var { method: realmethod, uri, baseuri, coinmethod, search, selector, params } = this.prepare(method, url, params1);
|
|
621
|
-
var id = realmethod + " " + baseuri;
|
|
622
|
-
var promise = cachedLoadingPromise[id];
|
|
623
|
-
var temp = JSON.stringify(params);
|
|
624
|
-
var currentTime = +new Date;
|
|
625
|
-
var loading = promise && promise.loading;
|
|
626
|
-
if (!promise || currentTime - promise.time > 60 || temp !== promise.params || promise.search !== search || promise.uri !== uri) {
|
|
627
|
-
var promise = new Promise(function (ok, oh) {
|
|
628
|
-
if (headers) {
|
|
629
|
-
headers = seekFromSource(headers, api.base);
|
|
630
|
-
}
|
|
631
|
-
loading = cross(realmethod, uri, headers).send(params).done(e => {
|
|
632
|
-
ok(e.response || e.responseText);
|
|
633
|
-
}).error(xhr => {
|
|
634
|
-
try {
|
|
635
|
-
var e = getErrorMessage(parseData(xhr.response || xhr.responseText || xhr.statusText || xhr.status));
|
|
636
|
-
oh({ status: loading.status, api, params: params1, error: e, toString: getErrorMessage })
|
|
637
|
-
} catch (error) {
|
|
638
|
-
oh(error);
|
|
639
|
-
}
|
|
640
|
-
});
|
|
599
|
+
var p = loadIgnoreConfig('get', _configfileurl);
|
|
600
|
+
p.loading.abort = function () { };
|
|
601
|
+
configPormise = p.then(createApiMap);
|
|
602
|
+
}
|
|
603
|
+
return configPormise;
|
|
604
|
+
};
|
|
605
|
+
var validApi = function (api, params) {
|
|
606
|
+
if (api.required) {
|
|
607
|
+
var required = api.required;
|
|
608
|
+
var lacks = required;
|
|
609
|
+
if (params) {
|
|
610
|
+
lacks = lacks.filter(k => {
|
|
611
|
+
if (!required[k]) return false;
|
|
612
|
+
var v = seekResponse(params, required[k]);
|
|
613
|
+
if (isEmpty(v)) return true;
|
|
641
614
|
});
|
|
642
|
-
promise.uri = uri;
|
|
643
|
-
promise.loading = loading;
|
|
644
|
-
promise.search = search;
|
|
645
|
-
promise.params = temp;
|
|
646
|
-
promise.time = currentTime;
|
|
647
|
-
cachedLoadingPromise[id] = promise;
|
|
648
615
|
}
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
616
|
+
if (lacks.length) {
|
|
617
|
+
|
|
618
|
+
console.log(i18n`跳过了缺少参数的请求:${api.id} ${api.name} ${api.url}\r\n缺少参数:${lacks.join(', ')}`);
|
|
619
|
+
return false;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
return true;
|
|
623
|
+
};
|
|
624
|
+
|
|
625
|
+
var pack = function (serviceId, params) {
|
|
626
|
+
if (/\?/.test(serviceId)) {
|
|
627
|
+
params = extend({}, getParamsFromUrl(serviceId), params);
|
|
628
|
+
serviceId = serviceId.replace(/\?[\s\S]*$/, '');
|
|
629
|
+
}
|
|
630
|
+
if (/\:/.test(serviceId)) {
|
|
631
|
+
var params1 = extend({}, params);
|
|
632
|
+
var temp = getParamsFromUrl(serviceId, ":");
|
|
633
|
+
for (var k in temp) {
|
|
634
|
+
var v = temp[k];
|
|
635
|
+
if (v in params) {
|
|
636
|
+
params1[k] = params[v];
|
|
662
637
|
}
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
return checked;
|
|
638
|
+
if (!(v in temp)) {
|
|
639
|
+
delete params1[v];
|
|
666
640
|
}
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
return params;
|
|
644
|
+
};
|
|
645
|
+
var repare = function (api, params) {
|
|
646
|
+
var { required, autotrim, prepared } = api;
|
|
647
|
+
if (!required.length && !prepared.length && !autotrim) return params;
|
|
648
|
+
var params1 = {};
|
|
649
|
+
required.forEach(k => {
|
|
650
|
+
var v = seekResponse(params, required[k] || k);
|
|
651
|
+
params1[k] = v;
|
|
652
|
+
});
|
|
653
|
+
prepared.forEach(k => {
|
|
654
|
+
var v = params[k];
|
|
655
|
+
if (isEmpty(v)) {
|
|
656
|
+
v = prepared[k];
|
|
657
|
+
}
|
|
658
|
+
params1[k] = v;
|
|
659
|
+
});
|
|
660
|
+
if (!autotrim) {
|
|
661
|
+
for (var k in params) {
|
|
662
|
+
if (!(k in params1)) {
|
|
663
|
+
params1[k] = params[k];
|
|
677
664
|
}
|
|
678
|
-
var p = this.loadIgnoreConfig('get', _configfileurl);
|
|
679
|
-
p.loading.abort = function () { };
|
|
680
|
-
configPormise = p.then(createApiMap);
|
|
681
665
|
}
|
|
682
|
-
|
|
683
|
-
|
|
666
|
+
}
|
|
667
|
+
return params1;
|
|
668
|
+
};
|
|
684
669
|
|
|
670
|
+
var fromApi = function (api, params) {
|
|
671
|
+
let url = api.url;
|
|
672
|
+
var base = api.base;
|
|
673
|
+
if (base) url = base + api.path;
|
|
674
|
+
if (validApi(api, params)) {
|
|
675
|
+
params = repare(api, params);
|
|
676
|
+
return loadIgnoreConfig(api.method, url, params, api);
|
|
677
|
+
}
|
|
678
|
+
return Promise.reject(ABORTED);
|
|
685
679
|
};
|
|
680
|
+
var getApiFromConfig = function (serviceId) {
|
|
681
|
+
return getApi(serviceId, getConfigPromise());
|
|
682
|
+
}
|
|
686
683
|
var instanceId = 0;
|
|
687
684
|
var getInstanceId = function () {
|
|
688
685
|
if (instanceId++ === instanceId) {
|
|
@@ -761,28 +758,116 @@ var oncatch = function (e) {
|
|
|
761
758
|
var cross = () => { throw new Error('请使用data.setEnvs(cross,on,onmounted)进行初始化,然后再使用data') };
|
|
762
759
|
var on = () => { throw new Error("请使用data.setEnvs(cross,on,onmounted)") };
|
|
763
760
|
var onmounted = () => { throw new Error("请使用data.setEnvs(cross,on,onmounted)") };
|
|
761
|
+
var rebuildInstance = function (instance, data, old = instance) {
|
|
762
|
+
if (instance === data) return;
|
|
763
|
+
if (!isObject(instance)) throw new Error(i18n`只支持object类型的数据!`);
|
|
764
|
+
if (!isObject(data)) data = { data }, data.toString = data.valueOf = toDataString;
|
|
765
|
+
if (instance instanceof Array) instance.splice(0, instance.length);
|
|
766
|
+
var sample = new LoadingArray;
|
|
767
|
+
Object.keys(old).forEach(function (k) {
|
|
768
|
+
if (instance[k] === old[k] && !(k in sample)) {
|
|
769
|
+
delete instance[k];
|
|
770
|
+
}
|
|
771
|
+
});
|
|
772
|
+
extend(instance, data);
|
|
773
|
+
};
|
|
774
|
+
/**
|
|
775
|
+
* 返回一个延长生命周期的内存对象
|
|
776
|
+
* @param instanceId 数据唯一标识
|
|
777
|
+
* @param onlyFromLocalStorage 是否只从localStorage加载
|
|
778
|
+
*/
|
|
779
|
+
var getInstance = function (instanceId, onlyFromLocalStorage = false) {
|
|
780
|
+
if (!instanceDataMap[instanceId]) {
|
|
781
|
+
var data = getItem(instanceId, onlyFromLocalStorage);
|
|
782
|
+
var instance = new LoadingArray;
|
|
783
|
+
rebuildInstance(instance, data);
|
|
784
|
+
instance.is_loading = false;
|
|
785
|
+
instance.is_loaded = true;
|
|
786
|
+
instanceDataMap[instanceId] = instance;
|
|
787
|
+
}
|
|
788
|
+
return instanceDataMap[instanceId];
|
|
789
|
+
};
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* 设置一个延长生命周期的数据对象
|
|
793
|
+
* @param {*} instanceId 数据唯一标识
|
|
794
|
+
* @param {*} data 数据本体
|
|
795
|
+
* @param {boolean|number} [rememberWithStorage=0] 是否存储到localStorage,默认为否,只存储到sessionStorage
|
|
796
|
+
*/
|
|
797
|
+
var setInstance = function (instanceId, data, rememberWithStorage = 0) {
|
|
798
|
+
const instance = getInstance(instanceId);
|
|
799
|
+
if (isObject(instance)) {
|
|
800
|
+
rebuildInstance(instance, data);
|
|
801
|
+
} else {
|
|
802
|
+
instanceDataMap[instanceId] = data;
|
|
803
|
+
}
|
|
804
|
+
instance.rw_storage = rememberWithStorage;
|
|
805
|
+
setItem(instanceId, data, rememberWithStorage);
|
|
806
|
+
fireListener(instanceId, data);
|
|
807
|
+
return instanceDataMap[instanceId];
|
|
808
|
+
};
|
|
809
|
+
|
|
810
|
+
var removeInstance = function (instanceId) {
|
|
811
|
+
delete instanceDataMap[instanceId];
|
|
812
|
+
const storageId = userPrefix + instanceId + pagePathName;
|
|
813
|
+
localStorage.removeItem(storageId);
|
|
814
|
+
sessionStorage.removeItem(storageId);
|
|
815
|
+
};
|
|
816
|
+
|
|
817
|
+
var responseLoading = function (response) {
|
|
818
|
+
if (isObject(response)) {
|
|
819
|
+
response.is_loaded = false;
|
|
820
|
+
response.is_loading = true;
|
|
821
|
+
response.then = LoadingArray_then;
|
|
822
|
+
response.abort = LoadingArray_abort;
|
|
823
|
+
}
|
|
824
|
+
};
|
|
825
|
+
|
|
826
|
+
var responseLoaded = function (response) {
|
|
827
|
+
if (isObject(response)) {
|
|
828
|
+
response.is_loaded = true;
|
|
829
|
+
response.is_loading = false;
|
|
830
|
+
if (response.then === LoadingArray_then) delete response.then;
|
|
831
|
+
if (response.abort === LoadingArray_abort) delete response.abort;
|
|
832
|
+
}
|
|
833
|
+
};
|
|
834
|
+
|
|
835
|
+
var createResponse = function (p, parse) {
|
|
836
|
+
var id = !p.id || parse instanceof Function ? getInstanceId() : 0;
|
|
837
|
+
if (id) removeInstance(id);
|
|
838
|
+
var pid = p.id;
|
|
839
|
+
var response = getInstance(id || pid);
|
|
840
|
+
if (!isObject(response)) response = new LoadingArray;
|
|
841
|
+
responseLoading(response);
|
|
842
|
+
response.loading = p.loading;
|
|
843
|
+
response.loading_promise = p;
|
|
844
|
+
p = p.then((data) => {
|
|
845
|
+
response.loading = null;
|
|
846
|
+
if (parse instanceof Function) data = parse(data);
|
|
847
|
+
if (id) {
|
|
848
|
+
setInstance(id, data, false);
|
|
849
|
+
removeInstance(id);
|
|
850
|
+
} else {
|
|
851
|
+
setInstance(pid, data);
|
|
852
|
+
}
|
|
853
|
+
responseLoaded(response);
|
|
854
|
+
return data;
|
|
855
|
+
}, (e) => {
|
|
856
|
+
responseCrash(e, response);
|
|
857
|
+
})
|
|
858
|
+
if (parse) response.loading_promise = p;
|
|
859
|
+
return response;
|
|
860
|
+
};
|
|
861
|
+
|
|
862
|
+
|
|
764
863
|
var data = {
|
|
765
864
|
prepareURL,
|
|
766
865
|
decodeStructure,
|
|
767
866
|
getUrlParamsForApi,
|
|
768
867
|
encodeStructure,
|
|
769
|
-
responseLoaded
|
|
770
|
-
if (isObject(response)) {
|
|
771
|
-
response.is_loaded = true;
|
|
772
|
-
response.is_loading = false;
|
|
773
|
-
if (response.then === LoadingArray_then) delete response.then;
|
|
774
|
-
if (response.abort === LoadingArray_abort) delete response.abort;
|
|
775
|
-
}
|
|
776
|
-
},
|
|
868
|
+
responseLoaded,
|
|
777
869
|
responseCrash,
|
|
778
|
-
|
|
779
|
-
if (isObject(response)) {
|
|
780
|
-
response.is_loaded = false;
|
|
781
|
-
response.is_loading = true;
|
|
782
|
-
response.then = LoadingArray_then;
|
|
783
|
-
response.abort = LoadingArray_abort;
|
|
784
|
-
}
|
|
785
|
-
},
|
|
870
|
+
createResponse,
|
|
786
871
|
setEnvs(cross1, on1, onmounted1) {
|
|
787
872
|
delete data.setEnvs;
|
|
788
873
|
cross = cross1;
|
|
@@ -804,10 +889,10 @@ var data = {
|
|
|
804
889
|
_configfileurl = defaultConfigFile;
|
|
805
890
|
configPormise = null;
|
|
806
891
|
}
|
|
807
|
-
return
|
|
892
|
+
return getConfigPromise();
|
|
808
893
|
},
|
|
809
894
|
getApi(a) {
|
|
810
|
-
return
|
|
895
|
+
return getApiFromConfig(a);
|
|
811
896
|
},
|
|
812
897
|
setConfig(data) {
|
|
813
898
|
data = this.parseConfig(data);
|
|
@@ -821,7 +906,7 @@ var data = {
|
|
|
821
906
|
extend(c, data);
|
|
822
907
|
},
|
|
823
908
|
getConfig() {
|
|
824
|
-
return
|
|
909
|
+
return getConfigPromise();
|
|
825
910
|
},
|
|
826
911
|
parseConfig(o) {
|
|
827
912
|
if (o instanceof Promise) {
|
|
@@ -833,7 +918,7 @@ var data = {
|
|
|
833
918
|
}
|
|
834
919
|
},
|
|
835
920
|
fromAll(refs, params, parse) {
|
|
836
|
-
return
|
|
921
|
+
return createResponse(Promise.all(refs.map(r => this.from(r, params, parse).loading_promise.catch(e => []))).then(datas => {
|
|
837
922
|
datas = datas.filter(a => !!a);
|
|
838
923
|
if (!datas.length) throw new Error(i18n`无可用的数据源`);
|
|
839
924
|
return datas.concat.apply([], datas);
|
|
@@ -872,7 +957,7 @@ var data = {
|
|
|
872
957
|
enrich(config = configPormise) {
|
|
873
958
|
if (!config) return;
|
|
874
959
|
if (isString(config)) {
|
|
875
|
-
config =
|
|
960
|
+
config = loadIgnoreConfig('get', config).then(createApiMap);
|
|
876
961
|
} else if (!(config instanceof Promise)) {
|
|
877
962
|
if (!isObject(config)) return;
|
|
878
963
|
config = Promise.resolve(config).then(createApiMap);
|
|
@@ -895,7 +980,7 @@ var data = {
|
|
|
895
980
|
if (!ids.length) return ok(res);
|
|
896
981
|
var id = ids.pop();
|
|
897
982
|
var a = data[id];
|
|
898
|
-
|
|
983
|
+
fromApi(a, res).then(run);
|
|
899
984
|
};
|
|
900
985
|
run(params);
|
|
901
986
|
});
|
|
@@ -904,56 +989,34 @@ var data = {
|
|
|
904
989
|
});
|
|
905
990
|
},
|
|
906
991
|
fromApi(api, params, parse) {
|
|
907
|
-
var p =
|
|
908
|
-
return
|
|
992
|
+
var p = fromApi(api, params);
|
|
993
|
+
return createResponse(p, parse);
|
|
909
994
|
},
|
|
910
995
|
postURL(url, data, parse) {
|
|
911
|
-
var p =
|
|
912
|
-
return
|
|
996
|
+
var p = loadIgnoreConfig("post", url, data);
|
|
997
|
+
return createResponse(p, parse);
|
|
913
998
|
},
|
|
914
999
|
fromURL(url, parse) {
|
|
915
|
-
var p =
|
|
916
|
-
return
|
|
1000
|
+
var p = loadIgnoreConfig('get', url);
|
|
1001
|
+
return createResponse(p, parse);
|
|
917
1002
|
},
|
|
918
|
-
|
|
919
|
-
var
|
|
920
|
-
|
|
921
|
-
var pid = p.id;
|
|
922
|
-
var response = this.getInstance(id || pid);
|
|
923
|
-
if (!isObject(response)) response = new LoadingArray;
|
|
924
|
-
this.responseLoading(response);
|
|
925
|
-
response.loading = p.loading;
|
|
926
|
-
response.loading_promise = p;
|
|
927
|
-
p = p.then((data) => {
|
|
928
|
-
response.loading = null;
|
|
929
|
-
if (parse instanceof Function) data = parse(data);
|
|
930
|
-
if (id) {
|
|
931
|
-
this.setInstance(id, data, false);
|
|
932
|
-
this.removeInstance(id);
|
|
933
|
-
} else {
|
|
934
|
-
this.setInstance(pid, data);
|
|
935
|
-
}
|
|
936
|
-
this.responseLoaded(response);
|
|
937
|
-
return data;
|
|
938
|
-
}, (e) => {
|
|
939
|
-
this.responseCrash(e, response);
|
|
940
|
-
})
|
|
941
|
-
if (parse) response.loading_promise = p;
|
|
942
|
-
return response;
|
|
1003
|
+
cross(method, url, data, api, parse) {
|
|
1004
|
+
var p = loadIgnoreConfig(method, url, data, api);
|
|
1005
|
+
return createResponse(p, parse);
|
|
943
1006
|
},
|
|
944
1007
|
asyncInstance(sid, params, parse) {
|
|
945
1008
|
// 不同参数的请求互不影响
|
|
946
1009
|
if (typeof sid !== "string") throw new Error(i18n`serviceId 只能是字符串`);
|
|
947
|
-
var p0 =
|
|
1010
|
+
var p0 = getApiFromConfig(sid);
|
|
948
1011
|
var p = p0.then((api) => {
|
|
949
|
-
params =
|
|
950
|
-
var p =
|
|
1012
|
+
params = pack(sid, params);
|
|
1013
|
+
var p = fromApi(api, params);
|
|
951
1014
|
p.loading = response.loading = p.loading;
|
|
952
1015
|
return p;
|
|
953
1016
|
}, oncatch);
|
|
954
1017
|
p.loading = p0;
|
|
955
1018
|
if (isEmpty(params)) p.id = sid;
|
|
956
|
-
var response =
|
|
1019
|
+
var response = createResponse(p, parse);
|
|
957
1020
|
return response;
|
|
958
1021
|
},
|
|
959
1022
|
|
|
@@ -977,14 +1040,14 @@ var data = {
|
|
|
977
1040
|
}
|
|
978
1041
|
});
|
|
979
1042
|
var id = "." + sid;
|
|
980
|
-
var instance =
|
|
1043
|
+
var instance = getInstance(id);
|
|
981
1044
|
var loading_promise = instance && instance.loading_promise;
|
|
982
1045
|
var p = Promise.resolve().then(function () {
|
|
983
1046
|
if (loading_promise) return wait(timeout);
|
|
984
1047
|
return wait(60);
|
|
985
1048
|
}).then(function () {
|
|
986
1049
|
if (p !== instance.loading_promise) throw OUTDATE;
|
|
987
|
-
return
|
|
1050
|
+
return getApiFromConfig(sid);
|
|
988
1051
|
}).then((api) => {
|
|
989
1052
|
if (p !== instance.loading_promise) throw OUTDATE;
|
|
990
1053
|
if ("params" in instance && shallowEqual(instance.params, params1)) throw ABORTED;
|
|
@@ -992,7 +1055,7 @@ var data = {
|
|
|
992
1055
|
if (instance.loading) {
|
|
993
1056
|
instance.loading.abort();
|
|
994
1057
|
}
|
|
995
|
-
var r =
|
|
1058
|
+
var r = fromApi(api, params1);
|
|
996
1059
|
instance.loading = r.loading;
|
|
997
1060
|
return r;
|
|
998
1061
|
}).then((data) => {
|
|
@@ -1001,7 +1064,7 @@ var data = {
|
|
|
1001
1064
|
return data;
|
|
1002
1065
|
}, oncatch);
|
|
1003
1066
|
p.id = id;
|
|
1004
|
-
var instance =
|
|
1067
|
+
var instance = createResponse(p);
|
|
1005
1068
|
p.catch(function () { }).then(() => {
|
|
1006
1069
|
return wait(timeout);
|
|
1007
1070
|
}).then(() => {
|
|
@@ -1009,33 +1072,13 @@ var data = {
|
|
|
1009
1072
|
});
|
|
1010
1073
|
return instance;
|
|
1011
1074
|
},
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
* @param instanceId 数据唯一标识
|
|
1015
|
-
* @param onlyFromLocalStorage 是否只从localStorage加载
|
|
1016
|
-
*/
|
|
1017
|
-
getInstance(instanceId, onlyFromLocalStorage = false) {
|
|
1018
|
-
if (!instanceDataMap[instanceId]) {
|
|
1019
|
-
var data = getItem(instanceId, onlyFromLocalStorage);
|
|
1020
|
-
var instance = new LoadingArray;
|
|
1021
|
-
this.rebuildInstance(instance, data);
|
|
1022
|
-
instance.is_loading = false;
|
|
1023
|
-
instance.is_loaded = true;
|
|
1024
|
-
instanceDataMap[instanceId] = instance;
|
|
1025
|
-
}
|
|
1026
|
-
return instanceDataMap[instanceId];
|
|
1027
|
-
},
|
|
1028
|
-
removeInstance(instanceId) {
|
|
1029
|
-
delete instanceDataMap[instanceId];
|
|
1030
|
-
const storageId = userPrefix + instanceId + pagePathName;
|
|
1031
|
-
localStorage.removeItem(storageId);
|
|
1032
|
-
sessionStorage.removeItem(storageId);
|
|
1033
|
-
},
|
|
1075
|
+
getInstance,
|
|
1076
|
+
removeInstance,
|
|
1034
1077
|
/** 设置所有网络请求拉取时的参数数附加据源 */
|
|
1035
1078
|
setSource(sourceid, value) {
|
|
1036
1079
|
var rememberWithStorage;
|
|
1037
1080
|
if (isObject(sourceid)) {
|
|
1038
|
-
|
|
1081
|
+
rebuildInstance(dataSourceMap, sourceid);
|
|
1039
1082
|
rememberWithStorage = value;
|
|
1040
1083
|
} else {
|
|
1041
1084
|
dataSourceMap[sourceid] = value;
|
|
@@ -1052,36 +1095,19 @@ var data = {
|
|
|
1052
1095
|
localStorage.removeItem(sourceDataId);
|
|
1053
1096
|
sessionStorage.removeItem(sourceDataId);
|
|
1054
1097
|
},
|
|
1055
|
-
|
|
1056
|
-
* 设置一个延长生命周期的数据对象
|
|
1057
|
-
* @param {*} instanceId 数据唯一标识
|
|
1058
|
-
* @param {*} data 数据本体
|
|
1059
|
-
* @param {boolean|number} [rememberWithStorage=0] 是否存储到localStorage,默认为否,只存储到sessionStorage
|
|
1060
|
-
*/
|
|
1061
|
-
setInstance(instanceId, data, rememberWithStorage = 0) {
|
|
1062
|
-
const instance = this.getInstance(instanceId);
|
|
1063
|
-
if (isObject(instance)) {
|
|
1064
|
-
this.rebuildInstance(instance, data);
|
|
1065
|
-
} else {
|
|
1066
|
-
instanceDataMap[instanceId] = data;
|
|
1067
|
-
}
|
|
1068
|
-
instance.rw_storage = rememberWithStorage;
|
|
1069
|
-
setItem(instanceId, data, rememberWithStorage);
|
|
1070
|
-
fireListener(instanceId, data);
|
|
1071
|
-
return instanceDataMap[instanceId];
|
|
1072
|
-
},
|
|
1098
|
+
setInstance,
|
|
1073
1099
|
// rememberWithStorage =null 生产环境不存储,开发环境存到sessionStorage
|
|
1074
1100
|
wetInstance(instanceId, data, rememberWithStorage = null) {
|
|
1075
1101
|
instanceHasDulpData = false;
|
|
1076
|
-
var res =
|
|
1102
|
+
var res = setInstance(instanceId, data, rememberWithStorage);
|
|
1077
1103
|
instanceHasDulpData = true;
|
|
1078
1104
|
return res;
|
|
1079
1105
|
},
|
|
1080
1106
|
patchInstance(instanceId, data, rememberWithStorage) {
|
|
1081
|
-
var instance =
|
|
1107
|
+
var instance = getInstance(instanceId);
|
|
1082
1108
|
if (rememberWithStorage === undefined) rememberWithStorage = instance.rw_storage;
|
|
1083
1109
|
extend(instance, data);
|
|
1084
|
-
return
|
|
1110
|
+
return setInstance(instanceId, instance, rememberWithStorage);
|
|
1085
1111
|
},
|
|
1086
1112
|
/**
|
|
1087
1113
|
* 仅初始化,不覆盖
|
|
@@ -1089,10 +1115,10 @@ var data = {
|
|
|
1089
1115
|
initInstance(instanceId, data, rememberWithStorage = 0) {
|
|
1090
1116
|
var item = getItem(instanceId);
|
|
1091
1117
|
if (!isEmpty(item)) return;
|
|
1092
|
-
return
|
|
1118
|
+
return setInstance(instanceId, data, rememberWithStorage);
|
|
1093
1119
|
},
|
|
1094
1120
|
switchInstance(instanceId, key, rememberWithStorage = 0) {
|
|
1095
|
-
var instance =
|
|
1121
|
+
var instance = getInstance(instanceId);
|
|
1096
1122
|
if (key === true || key === false || isEmpty(key)) {
|
|
1097
1123
|
rememberWithStorage = key;
|
|
1098
1124
|
key = null;
|
|
@@ -1110,7 +1136,7 @@ var data = {
|
|
|
1110
1136
|
} else {
|
|
1111
1137
|
instance[key] = value;
|
|
1112
1138
|
}
|
|
1113
|
-
return
|
|
1139
|
+
return setInstance(instanceId, instance, rememberWithStorage);
|
|
1114
1140
|
},
|
|
1115
1141
|
/**
|
|
1116
1142
|
* bindInstance(instanceId, callback);
|
|
@@ -1139,19 +1165,7 @@ var data = {
|
|
|
1139
1165
|
unbindInstance() {
|
|
1140
1166
|
bubApply(unbindInstance, arguments);
|
|
1141
1167
|
},
|
|
1142
|
-
rebuildInstance
|
|
1143
|
-
if (instance === data) return;
|
|
1144
|
-
if (!isObject(instance)) throw new Error(i18n`只支持object类型的数据!`);
|
|
1145
|
-
if (!isObject(data)) data = { data }, data.toString = data.valueOf = toDataString;
|
|
1146
|
-
if (instance instanceof Array) instance.splice(0, instance.length);
|
|
1147
|
-
var sample = new LoadingArray;
|
|
1148
|
-
Object.keys(old).forEach(function (k) {
|
|
1149
|
-
if (instance[k] === old[k] && !(k in sample)) {
|
|
1150
|
-
delete instance[k];
|
|
1151
|
-
}
|
|
1152
|
-
});
|
|
1153
|
-
extend(instance, data);
|
|
1154
|
-
}
|
|
1168
|
+
rebuildInstance,
|
|
1155
1169
|
};
|
|
1156
1170
|
var instanceHasDulpData = true;
|
|
1157
1171
|
function setItem(instanceId, data, rememberWithStorage) {
|