78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			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
 |