UNPKG

@ithinkdt/core

Version:

iThinkDT Core

135 lines (116 loc) 4.1 kB
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), } }