555 lines
14 KiB
JavaScript
555 lines
14 KiB
JavaScript
"use strict";
|
|
const common_vendor = require("./common/vendor.js");
|
|
const isArray = Array.isArray;
|
|
const { t } = common_vendor.initVueI18n(common_vendor.messages);
|
|
const events = {
|
|
load: "load",
|
|
error: "error"
|
|
};
|
|
const pageMode = {
|
|
add: "add",
|
|
replace: "replace"
|
|
};
|
|
const loadMode = {
|
|
auto: "auto",
|
|
onready: "onready",
|
|
manual: "manual"
|
|
};
|
|
const attrs = [
|
|
"pageCurrent",
|
|
"pageSize",
|
|
"collection",
|
|
"action",
|
|
"field",
|
|
"getcount",
|
|
"orderby",
|
|
"where",
|
|
"groupby",
|
|
"groupField",
|
|
"distinct"
|
|
];
|
|
const _sfc_main = {
|
|
name: "UniClouddb",
|
|
setup(props) {
|
|
const dataListRef = props.ssrKey ? props.getone ? common_vendor.shallowSsrRef(void 0, props.ssrKey) : common_vendor.ssrRef([], props.ssrKey) : props.getone ? common_vendor.shallowSsrRef(void 0, "Bu7PARd7N+D+EACeQqWQrA==") : common_vendor.ssrRef([], "FKB/WBK3EMqW2Pb/FX47xw==");
|
|
const instance = common_vendor.getCurrentInstance();
|
|
common_vendor.onMounted(() => {
|
|
if ((!dataListRef.value || dataListRef.value.length === 0) && !props.manual && props.loadtime === loadMode.auto) {
|
|
instance.proxy.loadData();
|
|
}
|
|
});
|
|
return { dataList: dataListRef };
|
|
},
|
|
// 服务端serverPrefetch生命周期,用于服务端加载数据,等将来全端支持Suspense时,可以采用 Suspense + async setup 来实现一版
|
|
async serverPrefetch() {
|
|
if (!this.manual && this.loadtime === loadMode.auto) {
|
|
return this.loadData();
|
|
}
|
|
},
|
|
props: {
|
|
options: {
|
|
type: [Object, Array],
|
|
default() {
|
|
return {};
|
|
}
|
|
},
|
|
spaceInfo: {
|
|
type: Object,
|
|
default() {
|
|
return {};
|
|
}
|
|
},
|
|
collection: {
|
|
type: [String, Array],
|
|
default: ""
|
|
},
|
|
action: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
field: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
orderby: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
where: {
|
|
type: [String, Object],
|
|
default: ""
|
|
},
|
|
pageData: {
|
|
type: String,
|
|
default: "add"
|
|
},
|
|
pageCurrent: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
pageSize: {
|
|
type: Number,
|
|
default: 20
|
|
},
|
|
getcount: {
|
|
type: [Boolean, String],
|
|
default: false
|
|
},
|
|
getone: {
|
|
type: [Boolean, String],
|
|
default: false
|
|
},
|
|
gettree: {
|
|
type: [Boolean, String, Object],
|
|
default: false
|
|
},
|
|
gettreepath: {
|
|
type: [Boolean, String],
|
|
default: false
|
|
},
|
|
startwith: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
limitlevel: {
|
|
type: Number,
|
|
default: 10
|
|
},
|
|
groupby: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
groupField: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
distinct: {
|
|
type: [Boolean, String],
|
|
default: false
|
|
},
|
|
pageIndistinct: {
|
|
type: [Boolean, String],
|
|
default: false
|
|
},
|
|
foreignKey: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
loadtime: {
|
|
type: String,
|
|
default: "auto"
|
|
},
|
|
manual: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
ssrKey: {
|
|
type: [String, Number],
|
|
default: ""
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
loading: false,
|
|
hasMore: false,
|
|
paginationInternal: {},
|
|
errorMessage: ""
|
|
};
|
|
},
|
|
computed: {
|
|
collectionArgs() {
|
|
return isArray(this.collection) ? this.collection : [this.collection];
|
|
},
|
|
isLookup() {
|
|
return isArray(this.collection) && this.collection.length > 1 || typeof this.collection === "string" && this.collection.indexOf(",") > -1;
|
|
},
|
|
mainCollection() {
|
|
if (typeof this.collection === "string") {
|
|
return this.collection.split(",")[0];
|
|
}
|
|
const mainQuery = JSON.parse(JSON.stringify(this.collection[0]));
|
|
return mainQuery.$db[0].$param[0];
|
|
}
|
|
},
|
|
created() {
|
|
this._isEnded = false;
|
|
this.paginationInternal = {
|
|
current: this.pageCurrent,
|
|
size: this.pageSize,
|
|
count: 0
|
|
};
|
|
this.$watch(() => {
|
|
var al = [];
|
|
attrs.forEach((key) => {
|
|
al.push(this[key]);
|
|
});
|
|
return al;
|
|
}, (newValue, oldValue) => {
|
|
this.paginationInternal.size = this.pageSize;
|
|
if (newValue[0] !== oldValue[0]) {
|
|
this.paginationInternal.current = this.pageCurrent;
|
|
}
|
|
if (this.loadtime === loadMode.manual) {
|
|
return;
|
|
}
|
|
let needReset = false;
|
|
for (let i = 2; i < newValue.length; i++) {
|
|
if (newValue[i] !== oldValue[i]) {
|
|
needReset = true;
|
|
break;
|
|
}
|
|
}
|
|
if (needReset) {
|
|
this.clear();
|
|
this.reset();
|
|
}
|
|
this._execLoadData();
|
|
});
|
|
},
|
|
methods: {
|
|
loadData(args1, args2) {
|
|
let callback = null;
|
|
let clear = false;
|
|
if (typeof args1 === "object") {
|
|
if (args1.clear) {
|
|
if (this.pageData === pageMode.replace) {
|
|
this.clear();
|
|
} else {
|
|
clear = args1.clear;
|
|
}
|
|
this.reset();
|
|
}
|
|
if (args1.current !== void 0) {
|
|
this.paginationInternal.current = args1.current;
|
|
}
|
|
if (typeof args2 === "function") {
|
|
callback = args2;
|
|
}
|
|
} else if (typeof args1 === "function") {
|
|
callback = args1;
|
|
}
|
|
return this._execLoadData(callback, clear);
|
|
},
|
|
loadMore() {
|
|
if (this._isEnded || this.loading) {
|
|
return;
|
|
}
|
|
if (this.pageData === pageMode.add) {
|
|
this.paginationInternal.current++;
|
|
}
|
|
this._execLoadData();
|
|
},
|
|
refresh() {
|
|
this.clear();
|
|
this._execLoadData();
|
|
},
|
|
clear() {
|
|
this._isEnded = false;
|
|
this.dataList = [];
|
|
},
|
|
reset() {
|
|
this.paginationInternal.current = 1;
|
|
},
|
|
add(value, {
|
|
action,
|
|
showToast = true,
|
|
toastTitle,
|
|
success,
|
|
fail,
|
|
complete,
|
|
needConfirm = true,
|
|
needLoading = true,
|
|
loadingTitle = ""
|
|
} = {}) {
|
|
if (needLoading) {
|
|
common_vendor.index.showLoading({
|
|
title: loadingTitle
|
|
});
|
|
}
|
|
let db = common_vendor.er.database(this.spaceInfo);
|
|
if (action) {
|
|
db = db.action(action);
|
|
}
|
|
db.collection(this.mainCollection).add(value).then((res) => {
|
|
success && success(res);
|
|
if (showToast) {
|
|
common_vendor.index.showToast({
|
|
title: toastTitle || t("uniCloud.component.add.success")
|
|
});
|
|
}
|
|
}).catch((err) => {
|
|
fail && fail(err);
|
|
if (needConfirm) {
|
|
common_vendor.index.showModal({
|
|
content: err.message,
|
|
showCancel: false
|
|
});
|
|
}
|
|
}).finally(() => {
|
|
if (needLoading) {
|
|
common_vendor.index.hideLoading();
|
|
}
|
|
complete && complete();
|
|
});
|
|
},
|
|
remove(id, {
|
|
action,
|
|
success,
|
|
fail,
|
|
complete,
|
|
confirmTitle,
|
|
confirmContent,
|
|
needConfirm = true,
|
|
needLoading = true,
|
|
loadingTitle = ""
|
|
} = {}) {
|
|
if (!id || !id.length) {
|
|
return;
|
|
}
|
|
if (!needConfirm) {
|
|
this._execRemove(id, action, success, fail, complete, needConfirm, needLoading, loadingTitle);
|
|
return;
|
|
}
|
|
common_vendor.index.showModal({
|
|
title: confirmTitle || t("uniCloud.component.remove.showModal.title"),
|
|
content: confirmContent || t("uniCloud.component.remove.showModal.content"),
|
|
showCancel: true,
|
|
success: (res) => {
|
|
if (!res.confirm) {
|
|
return;
|
|
}
|
|
this._execRemove(id, action, success, fail, complete, needConfirm, needLoading, loadingTitle);
|
|
}
|
|
});
|
|
},
|
|
update(id, value, {
|
|
action,
|
|
showToast = true,
|
|
toastTitle,
|
|
success,
|
|
fail,
|
|
complete,
|
|
needConfirm = true,
|
|
needLoading = true,
|
|
loadingTitle = ""
|
|
} = {}) {
|
|
if (needLoading) {
|
|
common_vendor.index.showLoading({
|
|
title: loadingTitle
|
|
});
|
|
}
|
|
let db = common_vendor.er.database(this.spaceInfo);
|
|
if (action) {
|
|
db = db.action(action);
|
|
}
|
|
return db.collection(this.mainCollection).doc(id).update(value).then((res) => {
|
|
success && success(res);
|
|
if (showToast) {
|
|
common_vendor.index.showToast({
|
|
title: toastTitle || t("uniCloud.component.update.success")
|
|
});
|
|
}
|
|
}).catch((err) => {
|
|
fail && fail(err);
|
|
if (needConfirm) {
|
|
common_vendor.index.showModal({
|
|
content: err.message,
|
|
showCancel: false
|
|
});
|
|
}
|
|
}).finally(() => {
|
|
if (needLoading) {
|
|
common_vendor.index.hideLoading();
|
|
}
|
|
complete && complete();
|
|
});
|
|
},
|
|
getTemp(isTemp = true) {
|
|
let db = common_vendor.er.database(this.spaceInfo);
|
|
if (this.action) {
|
|
db = db.action(this.action);
|
|
}
|
|
db = db.collection(...this.collectionArgs);
|
|
if (this.foreignKey) {
|
|
db = db.foreignKey(this.foreignKey);
|
|
}
|
|
if (!(!this.where || !Object.keys(this.where).length)) {
|
|
db = db.where(this.where);
|
|
}
|
|
if (this.field) {
|
|
db = db.field(this.field);
|
|
}
|
|
if (this.groupby) {
|
|
db = db.groupBy(this.groupby);
|
|
}
|
|
if (this.groupField) {
|
|
db = db.groupField(this.groupField);
|
|
}
|
|
if (this.distinct === true) {
|
|
db = db.distinct();
|
|
}
|
|
if (this.orderby) {
|
|
db = db.orderBy(this.orderby);
|
|
}
|
|
const {
|
|
current,
|
|
size
|
|
} = this.paginationInternal;
|
|
const getOptions = {};
|
|
if (this.getcount) {
|
|
getOptions.getCount = this.getcount;
|
|
}
|
|
const treeOptions = {
|
|
limitLevel: this.limitlevel,
|
|
startWith: this.startwith
|
|
};
|
|
if (this.gettree) {
|
|
getOptions.getTree = treeOptions;
|
|
}
|
|
if (this.gettreepath) {
|
|
getOptions.getTreePath = treeOptions;
|
|
}
|
|
db = db.skip(size * (current - 1)).limit(size);
|
|
if (isTemp) {
|
|
db = db.getTemp(getOptions);
|
|
db.udb = this;
|
|
} else {
|
|
db = db.get(getOptions);
|
|
}
|
|
return db;
|
|
},
|
|
setResult(result) {
|
|
if (result.code === 0) {
|
|
this._execLoadDataSuccess(result);
|
|
} else {
|
|
this._execLoadDataFail(new Error(result.message));
|
|
}
|
|
},
|
|
_execLoadData(callback, clear) {
|
|
if (this.loading) {
|
|
return;
|
|
}
|
|
this.loading = true;
|
|
this.errorMessage = "";
|
|
return this._getExec().then((res) => {
|
|
this.loading = false;
|
|
this._execLoadDataSuccess(res.result, callback, clear);
|
|
}).catch((err) => {
|
|
this.loading = false;
|
|
this._execLoadDataFail(err, callback);
|
|
});
|
|
},
|
|
_execLoadDataSuccess(result, callback, clear) {
|
|
const {
|
|
data,
|
|
count
|
|
} = result;
|
|
this._isEnded = count !== void 0 ? this.paginationInternal.current * this.paginationInternal.size >= count : data.length < this.pageSize;
|
|
this.hasMore = !this._isEnded;
|
|
const data2 = this.getone ? data.length ? data[0] : void 0 : data;
|
|
if (this.getcount) {
|
|
this.paginationInternal.count = count;
|
|
}
|
|
callback && callback(data2, this._isEnded, this.paginationInternal);
|
|
this._dispatchEvent(events.load, data2);
|
|
if (this.getone || this.pageData === pageMode.replace) {
|
|
this.dataList = data2;
|
|
} else {
|
|
if (clear) {
|
|
this.dataList = data2;
|
|
} else {
|
|
this.dataList.push(...data2);
|
|
}
|
|
}
|
|
},
|
|
_execLoadDataFail(err, callback) {
|
|
this.errorMessage = err;
|
|
callback && callback();
|
|
this.$emit(events.error, err);
|
|
{
|
|
console.error(err);
|
|
}
|
|
},
|
|
_getExec() {
|
|
return this.getTemp(false);
|
|
},
|
|
_execRemove(id, action, success, fail, complete, needConfirm, needLoading, loadingTitle) {
|
|
if (!this.collection || !id) {
|
|
return;
|
|
}
|
|
const ids = isArray(id) ? id : [id];
|
|
if (!ids.length) {
|
|
return;
|
|
}
|
|
if (needLoading) {
|
|
common_vendor.index.showLoading({
|
|
mask: true,
|
|
title: loadingTitle
|
|
});
|
|
}
|
|
const db = common_vendor.er.database(this.spaceInfo);
|
|
const dbCmd = db.command;
|
|
let exec = db;
|
|
if (action) {
|
|
exec = exec.action(action);
|
|
}
|
|
exec.collection(this.mainCollection).where({
|
|
_id: dbCmd.in(ids)
|
|
}).remove().then((res) => {
|
|
success && success(res.result);
|
|
if (this.pageData === pageMode.replace) {
|
|
this.refresh();
|
|
} else {
|
|
this.removeData(ids);
|
|
}
|
|
}).catch((err) => {
|
|
fail && fail(err);
|
|
if (needConfirm) {
|
|
common_vendor.index.showModal({
|
|
content: err.message,
|
|
showCancel: false
|
|
});
|
|
}
|
|
}).finally(() => {
|
|
if (needLoading) {
|
|
common_vendor.index.hideLoading();
|
|
}
|
|
complete && complete();
|
|
});
|
|
},
|
|
removeData(ids) {
|
|
const il = ids.slice(0);
|
|
const dl = this.dataList;
|
|
for (let i = dl.length - 1; i >= 0; i--) {
|
|
const index = il.indexOf(dl[i]._id);
|
|
if (index >= 0) {
|
|
dl.splice(i, 1);
|
|
il.splice(index, 1);
|
|
}
|
|
}
|
|
},
|
|
_dispatchEvent(type, data) {
|
|
if (this._changeDataFunction) {
|
|
this._changeDataFunction(data, this._isEnded, this.paginationInternal);
|
|
} else {
|
|
this.$emit(type, data, this._isEnded, this.paginationInternal);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
return {
|
|
a: common_vendor.r("d", {
|
|
options: $props.options,
|
|
data: $setup.dataList,
|
|
pagination: $data.paginationInternal,
|
|
loading: $data.loading,
|
|
hasMore: $data.hasMore,
|
|
error: $data.errorMessage
|
|
})
|
|
};
|
|
}
|
|
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
|
|
exports.Component = Component;
|
|
//# sourceMappingURL=../.sourcemap/mp-weixin/unicloud-db.js.map
|