django-vue3-admin-web/node_modules/vxe-pc-ui/packages/drawer/index.ts
2025-10-20 21:21:14 +08:00

78 lines
2.3 KiB
TypeScript

import { App } from 'vue'
import { VxeUI } from '@vxe-ui/core'
import XEUtils from 'xe-utils'
import VxeDrawerComponent, { allActiveDrawers } from './src/drawer'
import { dynamicApp, dynamicStore, checkDynamic } from '../dynamics'
import { VxeDrawerPropTypes, DrawerEventTypes, VxeDrawerDefines } from '../../types'
function handleDrawer (options: VxeDrawerDefines.DrawerOptions): Promise<DrawerEventTypes> {
// 使用动态组件渲染动态弹框
checkDynamic()
return new Promise(resolve => {
if (options && options.id && allActiveDrawers.some(comp => comp.props.id === options.id)) {
resolve('exist')
} else {
const _onHide = options.onHide
const drawerOpts = Object.assign(options, {
key: XEUtils.uniqueId(),
modelValue: true,
onHide (params) {
const drawerList = dynamicStore.drawers
if (_onHide) {
_onHide(params)
}
dynamicStore.drawers = drawerList.filter(item => item.key !== drawerOpts.key)
resolve(params.type)
}
} as VxeDrawerDefines.DrawerOptions)
dynamicStore.drawers.push(drawerOpts)
}
})
}
function getDrawer (id: VxeDrawerPropTypes.ID) {
return XEUtils.find(allActiveDrawers, $drawer => $drawer.props.id === id)
}
/**
* 全局关闭动态的活动窗口(只能用于关闭动态的创建的活动窗口)
* 如果传 id 则关闭指定的窗口
* 如果不传则关闭所有窗口
*/
function closeDrawer (id?: VxeDrawerPropTypes.ID) {
const drawers = id ? [getDrawer(id)] : allActiveDrawers
const restPromises: any[] = []
drawers.forEach($drawer => {
if ($drawer) {
restPromises.push($drawer.close())
}
})
return Promise.all(restPromises)
}
function openDrawer (options: VxeDrawerDefines.DrawerOptions) {
return handleDrawer(Object.assign({}, options))
}
export const DrawerController = {
get: getDrawer,
close: closeDrawer,
open: openDrawer
}
export const VxeDrawer = Object.assign(VxeDrawerComponent, {
install: function (app: App) {
app.component(VxeDrawerComponent.name as string, VxeDrawerComponent)
}
})
VxeUI.drawer = DrawerController
dynamicApp.use(VxeDrawer)
VxeUI.component(VxeDrawerComponent)
export const Drawer = VxeDrawer
export default VxeDrawer