feat: add `placement` for `Drawer` (#4958)
							parent
							
								
									dedba18553
								
							
						
					
					
						commit
						73502677ff
					
				|  | @ -88,6 +88,7 @@ const [Drawer, drawerApi] = useVbenDrawer({ | ||||||
| | closeOnPressEscape | esc 关闭弹窗 | `boolean` | `true` | | | closeOnPressEscape | esc 关闭弹窗 | `boolean` | `true` | | ||||||
| | confirmText | 确认按钮文本 | `string\|slot` | `确认` | | | confirmText | 确认按钮文本 | `string\|slot` | `确认` | | ||||||
| | cancelText | 取消按钮文本 | `string\|slot` | `取消` | | | cancelText | 取消按钮文本 | `string\|slot` | `取消` | | ||||||
|  | | placement | 抽屉弹出位置 | `'left'\|'right'\|'top'\|'bottom'` | `right` | | ||||||
| | showCancelButton | 显示取消按钮 | `boolean` | `true` | | | showCancelButton | 显示取消按钮 | `boolean` | `true` | | ||||||
| | showConfirmButton | 显示确认按钮文本 | `boolean` | `true` | | | showConfirmButton | 显示确认按钮文本 | `boolean` | `true` | | ||||||
| | class | modal的class,宽度通过这个配置 | `string` | - | | | class | modal的class,宽度通过这个配置 | `string` | - | | ||||||
|  |  | ||||||
|  | @ -41,6 +41,7 @@ export class DrawerApi { | ||||||
|       loading: false, |       loading: false, | ||||||
|       modal: true, |       modal: true, | ||||||
|       openAutoFocus: false, |       openAutoFocus: false, | ||||||
|  |       placement: 'right', | ||||||
|       showCancelButton: true, |       showCancelButton: true, | ||||||
|       showConfirmButton: true, |       showConfirmButton: true, | ||||||
|       title: '', |       title: '', | ||||||
|  |  | ||||||
|  | @ -4,6 +4,8 @@ import type { DrawerApi } from './drawer-api'; | ||||||
| 
 | 
 | ||||||
| import type { Component, Ref } from 'vue'; | import type { Component, Ref } from 'vue'; | ||||||
| 
 | 
 | ||||||
|  | export type DrawerPlacement = 'bottom' | 'left' | 'right' | 'top'; | ||||||
|  | 
 | ||||||
| export interface DrawerProps { | export interface DrawerProps { | ||||||
|   /** |   /** | ||||||
|    * 取消按钮文字 |    * 取消按钮文字 | ||||||
|  | @ -72,6 +74,12 @@ export interface DrawerProps { | ||||||
|    * 是否自动聚焦 |    * 是否自动聚焦 | ||||||
|    */ |    */ | ||||||
|   openAutoFocus?: boolean; |   openAutoFocus?: boolean; | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 抽屉位置 | ||||||
|  |    * @default right | ||||||
|  |    */ | ||||||
|  |   placement?: DrawerPlacement; | ||||||
|   /** |   /** | ||||||
|    * 是否显示取消按钮 |    * 是否显示取消按钮 | ||||||
|    * @default true |    * @default true | ||||||
|  |  | ||||||
|  | @ -62,6 +62,7 @@ const { | ||||||
|   loading: showLoading, |   loading: showLoading, | ||||||
|   modal, |   modal, | ||||||
|   openAutoFocus, |   openAutoFocus, | ||||||
|  |   placement, | ||||||
|   showCancelButton, |   showCancelButton, | ||||||
|   showConfirmButton, |   showConfirmButton, | ||||||
|   title, |   title, | ||||||
|  | @ -119,11 +120,13 @@ function handleFocusOutside(e: Event) { | ||||||
|     <SheetContent |     <SheetContent | ||||||
|       :class=" |       :class=" | ||||||
|         cn('flex w-[520px] flex-col', drawerClass, { |         cn('flex w-[520px] flex-col', drawerClass, { | ||||||
|           '!w-full': isMobile, |           '!w-full': isMobile || placement === 'bottom' || placement === 'top', | ||||||
|  |           'max-h-[100vh]': placement === 'bottom' || placement === 'top', | ||||||
|         }) |         }) | ||||||
|       " |       " | ||||||
|       :modal="modal" |       :modal="modal" | ||||||
|       :open="state?.isOpen" |       :open="state?.isOpen" | ||||||
|  |       :side="placement" | ||||||
|       @close-auto-focus="handleFocusOutside" |       @close-auto-focus="handleFocusOutside" | ||||||
|       @escape-key-down="escapeKeyDown" |       @escape-key-down="escapeKeyDown" | ||||||
|       @focus-outside="handleFocusOutside" |       @focus-outside="handleFocusOutside" | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
| import { Page, useVbenDrawer } from '@vben/common-ui'; | import { type DrawerPlacement, Page, useVbenDrawer } from '@vben/common-ui'; | ||||||
| 
 | 
 | ||||||
| import { Button, Card } from 'ant-design-vue'; | import { Button, Card } from 'ant-design-vue'; | ||||||
| 
 | 
 | ||||||
|  | @ -13,6 +13,7 @@ import SharedDataDemo from './shared-data-demo.vue'; | ||||||
| const [BaseDrawer, baseDrawerApi] = useVbenDrawer({ | const [BaseDrawer, baseDrawerApi] = useVbenDrawer({ | ||||||
|   // 连接抽离的组件 |   // 连接抽离的组件 | ||||||
|   connectedComponent: BaseDemo, |   connectedComponent: BaseDemo, | ||||||
|  |   // placement: 'left', | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| const [AutoHeightDrawer, autoHeightDrawerApi] = useVbenDrawer({ | const [AutoHeightDrawer, autoHeightDrawerApi] = useVbenDrawer({ | ||||||
|  | @ -31,7 +32,8 @@ const [FormDrawer, formDrawerApi] = useVbenDrawer({ | ||||||
|   connectedComponent: FormDrawerDemo, |   connectedComponent: FormDrawerDemo, | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| function openBaseDrawer() { | function openBaseDrawer(placement: DrawerPlacement = 'right') { | ||||||
|  |   baseDrawerApi.setState({ placement }); | ||||||
|   baseDrawerApi.open(); |   baseDrawerApi.open(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -81,7 +83,16 @@ function openFormDrawer() { | ||||||
| 
 | 
 | ||||||
|     <Card class="mb-4" title="基本使用"> |     <Card class="mb-4" title="基本使用"> | ||||||
|       <p class="mb-3">一个基础的抽屉示例</p> |       <p class="mb-3">一个基础的抽屉示例</p> | ||||||
|       <Button type="primary" @click="openBaseDrawer">打开抽屉</Button> |       <Button type="primary" @click="openBaseDrawer('right')">右侧打开</Button> | ||||||
|  |       <Button class="ml-2" type="primary" @click="openBaseDrawer('bottom')"> | ||||||
|  |         底部打开 | ||||||
|  |       </Button> | ||||||
|  |       <Button class="ml-2" type="primary" @click="openBaseDrawer('left')"> | ||||||
|  |         左侧打开 | ||||||
|  |       </Button> | ||||||
|  |       <Button class="ml-2" type="primary" @click="openBaseDrawer('top')"> | ||||||
|  |         顶部打开 | ||||||
|  |       </Button> | ||||||
|     </Card> |     </Card> | ||||||
| 
 | 
 | ||||||
|     <Card class="mb-4" title="内容高度自适应滚动"> |     <Card class="mb-4" title="内容高度自适应滚动"> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Netfan
						Netfan