feat: add `placement` for `Drawer` (#4958)

pull/53/MERGE
Netfan 2024-11-27 11:29:25 +08:00 committed by GitHub
parent dedba18553
commit 73502677ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 28 additions and 4 deletions

View File

@ -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` | - |

View File

@ -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: '',

View File

@ -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

View File

@ -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"

View File

@ -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="内容高度自适应滚动">