import { defineComponent, ref, computed } from 'vue' import { ElDialog, ElButton } from 'element-plus' import CipFormValidate from '@cip/components/cip-form-validate' import { componentScheme } from './component.scheme' import { generateProps, generateEmits } from '../helper/component-util' import { getUsingConfig } from '@cip/utils/util' import './dialog.less' const sizeConfig = { mini: '374px', small: '568px', default: '860px', large: '1144px' } export default defineComponent({ name: 'CipDialog', props: generateProps(componentScheme), emits: generateEmits(componentScheme), setup (props, { slots, emit }) { const formValidateRef = ref() const waiting = ref(false) // 默认使用props.onConfirm当入参为函数时使用函数 const confirm = async (cb) => { // 防止cb为e导致的错误 if (typeof cb !== 'function') cb = props.onConfirm try { waiting.value = true await formValidateRef.value.validate() const res = await new Promise((resolve, reject) => { if (typeof cb === 'function') { cb(resolve, reject) } else { reject(new TypeError('onConfirm is not a function')) } }) updateVisible(false) return res ?? true } finally { waiting.value = false } } const cancel = () => { updateVisible(false) emit('cancel') } const openHandler = () => { formValidateRef.value?.clear() } const closeHandler = () => { emit('close') } const updateVisible = (val) => { emit('update:modelValue', val) } const width = computed(() => { return getUsingConfig(props.width, sizeConfig[props.size], sizeConfig.default) }) return () => ( closeHandler()} onOpen={() => openHandler()} fullscreen={props.fullscreen} > {{ header: () => <>
{ slots.mainTitle?.() || props.title }
{slots.subTitle?.() || props.subTitle}
, default: () => {slots.default?.()} , footer: props.showOnly && !slots.footer ? undefined : () => { if (!props.showOnly) { const defaultFooter =
{ !waiting.value && props.showCancel && cancel()} size={props.buttonSize}> {props.cancelText} } confirm()} size={props.buttonSize} type={'primary'} loading={waiting.value} > {props.confirmText}
const footerSlot = slots.footer?.({ confirm, loading: waiting.value, cancel }) return slots.footer ? footerSlot : defaultFooter } else { return slots.footer?.() } } }}
) } })