@ithinkdt/core
Version:
iThinkDT Core
135 lines (116 loc) • 4.1 kB
JavaScript
import { ref, computed, unref } from 'vue'
import { useI18n } from '@ithinkdt/common'
import { $dialog, $msg } from '../feedback'
import { useFormModal } from './use-modal-form'
export function useCurd({
curd,
form,
cols = 24,
defaultSpan = form?.defaultSpan || 24,
defaultViewSpan = computed(() => unref(cols) / 2),
model = form?.model,
formRef = form?.ref,
items = form?.items || form || [],
title,
width = 488,
viewWidth = 864,
tips,
...options
}) {
const { t } = useI18n()
const curdType = ref('view')
if (form) {
console.warn(`[use-curd]: 'form' is deprecated`)
}
form = {
defaultSpan: computed(() => (curdType.value === 'view' ? unref(defaultViewSpan) : unref(defaultSpan))),
model,
formRef,
items,
}
if (typeof form.items === 'function') {
const items = form.items
form.items = (param) => items({ ...param, type: curdType })
}
const _title = ref('')
const getTitle = typeof title === 'function' ? title : () => title
const { submiting, open } = useFormModal({
title: _title,
...form,
width: computed(() => (curdType.value === 'view' && viewWidth ? unref(viewWidth) : unref(width))),
cols,
save: async (model) => {
const res = await ((curdType.value === 'add' ? curd.create : curd.update) || curd.save)(model)
$msg.success(tips?.(curdType.value, model) || t('page.result.saveSuccess'))
return res
},
...options,
})
function del(idOrModel, multiple) {
return new Promise((_resolve, _reject) => {
let tip = tips?.(multiple ? 'dels' : 'del', idOrModel) ?? {}
if (typeof tip === 'string') {
tip = {
success: tip,
}
}
$dialog({
type: 'error',
title: tip.title ?? (multiple ? t('page.curd.deletes') : t('page.curd.delete')),
content: tip.content ?? (multiple ? t('page.curd.deletesContent') : t('page.curd.deleteContent')),
closable: false,
okType: 'danger',
okText: t('page.action.delete'),
cancelText: t('page.dialog.cancel'),
onOk() {
const p = curd.delete(idOrModel).then(() => {
$msg.success(tip.success ?? (multiple ? t('page.result.deletes') : t('page.result.delete')))
_resolve()
})
p.catch((error) => {
_reject(error)
})
return p
},
onCancel() {
_reject({
__alert_ignore: true,
})
},
onClose() {
_reject({
__alert_ignore: true,
})
},
})
})
}
return {
submiting,
add(init) {
curdType.value = 'add'
_title.value = unref(getTitle(curdType.value, init, '添加')) || '添加'
return open(init)
},
edit(idOrModel) {
curdType.value = 'edit'
_title.value = '编辑'
const p = Promise.resolve(idOrModel.id ? idOrModel : curd.get(idOrModel))
p.then((m) => {
_title.value = unref(getTitle(curdType.value, m, _title.value)) || '编辑'
})
return open(p)
},
view(idOrModel) {
curdType.value = 'view'
_title.value = '详情'
const p = Promise.resolve(idOrModel.id ? idOrModel : curd.get(idOrModel))
p.then((m) => {
_title.value = unref(getTitle(curdType.value, m, _title.value)) || '详情'
})
return open(p, true)
},
del: (idOrModel) => del(idOrModel),
dels: (idsOrModels) => del(idsOrModels, true),
}
}