317 lines
8.5 KiB
Plaintext
317 lines
8.5 KiB
Plaintext
type SuccessCallback<T> = (res : T | null) => void | null
|
||
type FailCallback = (err : any | null) => void | null
|
||
type CompleteCallback = () => void | null
|
||
|
||
export type MixinDatacomPaginationType = {
|
||
current : number,
|
||
size : number,
|
||
count : number
|
||
}
|
||
|
||
export type MixinDatacomGetOptions = {
|
||
collection ?: UTSJSONObject,
|
||
field ?: string,
|
||
orderBy ?: string,
|
||
where ?: any,
|
||
pageData ?: string,
|
||
pageCurrent ?: number,
|
||
pageSize ?: number,
|
||
getCount ?: boolean,
|
||
getTree ?: any,
|
||
getTreePath ?: UTSJSONObject,
|
||
startWith ?: string,
|
||
limitLevel ?: number,
|
||
groupBy ?: string,
|
||
groupField ?: string,
|
||
distinct ?: boolean,
|
||
pageIndistinct ?: boolean,
|
||
foreignKey ?: string,
|
||
loadtime ?: string,
|
||
manual ?: boolean
|
||
}
|
||
|
||
export type MixinDatacomEasyGetOptions = {
|
||
success ?: SuccessCallback<UniCloudDBGetResult>,
|
||
fail ?: FailCallback,
|
||
complete ?: CompleteCallback,
|
||
}
|
||
|
||
export const mixinDatacom = defineMixin({
|
||
slots: Object as SlotsType<{
|
||
default : {
|
||
data : Array<UTSJSONObject>,
|
||
loading : boolean,
|
||
hasMore : boolean,
|
||
pagination : MixinDatacomPaginationType,
|
||
error : UniCloudError | null
|
||
}
|
||
}>,
|
||
props: {
|
||
localdata: {
|
||
type: Array as PropType<Array<UTSJSONObject>>,
|
||
default: [] as Array<UTSJSONObject>
|
||
},
|
||
collection: {
|
||
type: Object,
|
||
default: ''
|
||
},
|
||
field: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
orderby: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
where: {
|
||
type: Object,
|
||
default: ''
|
||
},
|
||
pageData: {
|
||
type: String,
|
||
default: 'add'
|
||
},
|
||
pageCurrent: {
|
||
type: Number,
|
||
default: 1
|
||
},
|
||
pageSize: {
|
||
type: Number,
|
||
default: 20
|
||
},
|
||
getcount: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
gettree: {
|
||
type: Object,
|
||
default: ''
|
||
},
|
||
gettreepath: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
startwith: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
limitlevel: {
|
||
type: Number,
|
||
default: 10
|
||
},
|
||
groupby: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
groupField: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
distinct: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
pageIndistinct: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
foreignKey: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
loadtime: {
|
||
type: String,
|
||
default: 'auto'
|
||
},
|
||
manual: {
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
mixinDatacomResData: [] as Array<UTSJSONObject>, // 请求返回的数据,调用 loadData 后会更新
|
||
mixinDatacomLoading: false, // 网络请求状态
|
||
mixinDatacomHasMore: false, // 是否有更多数据
|
||
mixinDatacomPage: {
|
||
current: 1,
|
||
size: 20,
|
||
count: 0,
|
||
} as MixinDatacomPaginationType, // 分页信息,详情见 created 生命周期
|
||
mixinDatacomError: null as UniCloudError | null, // 请求出错时的错误消息
|
||
}
|
||
},
|
||
created() {
|
||
this.mixinDatacomPage.current = this.pageCurrent
|
||
this.mixinDatacomPage.size = this.pageSize
|
||
|
||
const PROPS_NAME = ['', '', 'collection', 'field', 'getcount', 'orderby', 'where', 'groupby', 'groupField', 'distinct']
|
||
|
||
this.$watch(
|
||
() : any => [
|
||
this.pageCurrent,
|
||
this.pageSize,
|
||
this.collection,
|
||
this.field,
|
||
this.getcount,
|
||
this.orderby,
|
||
this.where,
|
||
this.groupby,
|
||
this.groupField,
|
||
this.distinct
|
||
],
|
||
(newValue : Array<any>, oldValue : Array<any>) => {
|
||
this.mixinDatacomPage.size = this.pageSize
|
||
if (newValue[0] !== oldValue[0]) {
|
||
this.mixinDatacomPage.current = this.pageCurrent
|
||
}
|
||
|
||
let needReset = false
|
||
let changed : Array<string> = []
|
||
for (let i = 2; i < newValue.length; i++) {
|
||
if (newValue[i] !== oldValue[i]) {
|
||
needReset = true
|
||
changed.push(PROPS_NAME[i])
|
||
}
|
||
}
|
||
|
||
this.onMixinDatacomPropsChange(needReset, changed)
|
||
}
|
||
)
|
||
},
|
||
methods: {
|
||
// props发生变化时被调用,在组件中覆盖此方法
|
||
// 非 pageCurrent,pageSize 改变时 needReset=true,需要重置数据
|
||
// changed,发生变化的属性名,类型为Array,例如 ['collection', 'action']
|
||
onMixinDatacomPropsChange(_ : boolean, changed : Array<string>) {
|
||
},
|
||
mixinDatacomEasyGet(options ?: MixinDatacomEasyGetOptions) {
|
||
if (this.mixinDatacomLoading) {
|
||
return
|
||
}
|
||
|
||
this.mixinDatacomLoading = true
|
||
this.mixinDatacomError = null
|
||
|
||
this.mixinDatacomGet(null).then((res : UniCloudDBGetResult) => {
|
||
const data = res.data
|
||
const count = res.count
|
||
|
||
if (this.getcount && count != null) {
|
||
this.mixinDatacomPage.count = count
|
||
}
|
||
|
||
this.mixinDatacomHasMore = !((count != null) ? (this.mixinDatacomPage.current * this.mixinDatacomPage.size >= count) : (data.length < this.pageSize))
|
||
this.mixinDatacomResData = data
|
||
|
||
options?.success?.(res)
|
||
}).catch((err : any | null) => {
|
||
this.mixinDatacomError = err as UniCloudError
|
||
options?.fail?.(err)
|
||
}).then(() => {
|
||
this.mixinDatacomLoading = false
|
||
options?.complete?.()
|
||
}, () => {
|
||
this.mixinDatacomLoading = false
|
||
options?.complete?.()
|
||
})
|
||
},
|
||
mixinDatacomGet(options: MixinDatacomGetOptions | null) : Promise<UniCloudDBGetResult> {
|
||
let db = uniCloud.databaseForJQL()
|
||
|
||
let collection = Array.isArray(this.collection) ? db.collection(...(this.collection as Array<any>)) : db.collection(this.collection)
|
||
|
||
let filter : UniCloudDBFilter | null = null
|
||
if (this.foreignKey.length > 0) {
|
||
filter = collection.foreignKey(this.foreignKey)
|
||
}
|
||
|
||
const where : any = options?.where ?? this.where
|
||
if (typeof where == 'string') {
|
||
const whereString = where as string
|
||
if (whereString.length > 0) {
|
||
filter = (filter != null) ? filter.where(where) : collection.where(where)
|
||
}
|
||
} else {
|
||
filter = (filter != null) ? filter.where(where) : collection.where(where)
|
||
}
|
||
|
||
let query : UniCloudDBQuery | null = null
|
||
if (this.field.length > 0) {
|
||
query = (filter != null) ? filter.field(this.field) : collection.field(this.field)
|
||
}
|
||
if (this.groupby.length > 0) {
|
||
if (query != null) {
|
||
query = query.groupBy(this.groupby)
|
||
} else if (filter != null) {
|
||
query = filter.groupBy(this.groupby)
|
||
}
|
||
}
|
||
if (this.groupField.length > 0) {
|
||
if (query != null) {
|
||
query = query.groupField(this.groupField)
|
||
} else if (filter != null) {
|
||
query = filter.groupField(this.groupField)
|
||
}
|
||
}
|
||
if (this.distinct == true) {
|
||
if (query != null) {
|
||
query = query.distinct(this.field)
|
||
} else if (filter != null) {
|
||
query = filter.distinct(this.field)
|
||
}
|
||
}
|
||
if (this.orderby.length > 0) {
|
||
if (query != null) {
|
||
query = query.orderBy(this.orderby)
|
||
} else if (filter != null) {
|
||
query = filter.orderBy(this.orderby)
|
||
}
|
||
}
|
||
|
||
const size = this.mixinDatacomPage.size
|
||
const current = this.mixinDatacomPage.current
|
||
if (query != null) {
|
||
query = query.skip(size * (current - 1)).limit(size)
|
||
} else if (filter != null) {
|
||
query = filter.skip(size * (current - 1)).limit(size)
|
||
} else {
|
||
query = collection.skip(size * (current - 1)).limit(size)
|
||
}
|
||
|
||
const getOptions = {} as UTSJSONObject
|
||
const treeOptions = {
|
||
limitLevel: this.limitlevel,
|
||
startWith: this.startwith
|
||
}
|
||
const getCount : boolean = options?.getCount ?? this.getcount
|
||
if (this.getcount == true) {
|
||
getOptions['getCount'] = getCount
|
||
}
|
||
|
||
const getTree : any = options?.getTree ?? this.gettree
|
||
if (typeof getTree == 'string') {
|
||
const getTreeString = getTree as string
|
||
if (getTreeString.length > 0) {
|
||
getOptions['getTree'] = treeOptions
|
||
}
|
||
} else if (typeof getTree == 'object') {
|
||
getOptions['getTree'] = treeOptions
|
||
} else {
|
||
getOptions['getTree'] = getTree
|
||
}
|
||
|
||
const getTreePath = options?.getTreePath ?? this.gettreepath
|
||
if (typeof getTreePath == 'string') {
|
||
const getTreePathString = getTreePath as string
|
||
if (getTreePathString.length > 0) {
|
||
getOptions['getTreePath'] = getTreePath
|
||
}
|
||
} else {
|
||
getOptions['getTreePath'] = getTreePath
|
||
}
|
||
|
||
return query.get(getOptions)
|
||
}
|
||
}
|
||
}) |