Skip to content

Commit a221d2b

Browse files
authored
fix: form item overflow fixed and layout improved (#5572)
* fix: form item overflow fixed and layout improved * fix: basic form demo update * feat: form label support render * fix: form docs update
1 parent ccd99eb commit a221d2b

File tree

6 files changed

+80
-56
lines changed

6 files changed

+80
-56
lines changed

docs/src/components/common-ui/vben-form.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -445,9 +445,9 @@ export interface FormSchema<
445445
/** 字段名,也作为自定义插槽的名称 */
446446
fieldName: string;
447447
/** 帮助信息 */
448-
help?: string;
449-
/** 表单项 */
450-
label?: string;
448+
help?: CustomRenderType;
449+
/** 表单的标签(如果是一个string,会用于默认必选规则的消息提示) */
450+
label?: CustomRenderType;
451451
/** 自定义组件内部渲染 */
452452
renderComponentContent?: RenderComponentContentType;
453453
/** 字段规则 */

docs/src/guide/essentials/settings.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,4 +538,6 @@ interface Preferences {
538538

539539
- `overridesPreferences`方法只需要覆盖项目中的一部分配置,不需要的配置不用覆盖,会自动使用默认配置。
540540
- 任何配置项都可以覆盖,只需要在`overridesPreferences`方法内覆盖即可,不要修改默认配置文件。
541-
- 更改配置后请清空缓存,否则可能不生效。:::
541+
- 更改配置后请清空缓存,否则可能不生效。
542+
543+
:::

packages/@core/ui-kit/form-ui/src/form-render/form-field.vue

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ const fieldProps = computed(() => {
193193
const rules = fieldRules.value;
194194
return {
195195
keepValue: true,
196-
label,
196+
label: isString(label) ? label : '',
197197
...(rules ? { rules } : {}),
198198
...(formFieldProps as Record<string, any>),
199199
};
@@ -285,7 +285,7 @@ function autofocus() {
285285
'pb-6': !compact,
286286
'pb-2': compact,
287287
}"
288-
class="flex"
288+
class="relative flex"
289289
v-bind="$attrs"
290290
>
291291
<FormLabel
@@ -305,55 +305,59 @@ function autofocus() {
305305
:style="labelStyle"
306306
>
307307
<template v-if="label">
308-
<span>{{ label }}</span>
308+
<VbenRenderContent :content="label" />
309309
<span v-if="colon" class="ml-[2px]">:</span>
310310
</template>
311311
</FormLabel>
312-
<div :class="cn('relative flex w-full items-center', wrapperClass)">
313-
<FormControl :class="cn(controlClass)">
314-
<slot
315-
v-bind="{
316-
...slotProps,
317-
...createComponentProps(slotProps),
318-
disabled: shouldDisabled,
319-
isInValid,
320-
}"
321-
>
322-
<component
323-
:is="FieldComponent"
324-
ref="fieldComponentRef"
325-
:class="{
326-
'border-destructive focus:border-destructive hover:border-destructive/80 focus:shadow-[0_0_0_2px_rgba(255,38,5,0.06)]':
312+
<div class="w-full overflow-hidden">
313+
<div :class="cn('relative flex w-full items-center', wrapperClass)">
314+
<div class="flex-auto overflow-hidden">
315+
<FormControl :class="cn(controlClass)">
316+
<slot
317+
v-bind="{
318+
...slotProps,
319+
...createComponentProps(slotProps),
320+
disabled: shouldDisabled,
327321
isInValid,
328-
}"
329-
v-bind="createComponentProps(slotProps)"
330-
:disabled="shouldDisabled"
331-
>
332-
<template
333-
v-for="name in renderContentKey"
334-
:key="name"
335-
#[name]="renderSlotProps"
322+
}"
336323
>
337-
<VbenRenderContent
338-
:content="customContentRender[name]"
339-
v-bind="{ ...renderSlotProps, formContext: slotProps }"
340-
/>
341-
</template>
342-
<!-- <slot></slot> -->
343-
</component>
344-
</slot>
345-
</FormControl>
346-
<!-- 自定义后缀 -->
347-
<div v-if="suffix" class="ml-1">
348-
<VbenRenderContent :content="suffix" />
324+
<component
325+
:is="FieldComponent"
326+
ref="fieldComponentRef"
327+
:class="{
328+
'border-destructive focus:border-destructive hover:border-destructive/80 focus:shadow-[0_0_0_2px_rgba(255,38,5,0.06)]':
329+
isInValid,
330+
}"
331+
v-bind="createComponentProps(slotProps)"
332+
:disabled="shouldDisabled"
333+
>
334+
<template
335+
v-for="name in renderContentKey"
336+
:key="name"
337+
#[name]="renderSlotProps"
338+
>
339+
<VbenRenderContent
340+
:content="customContentRender[name]"
341+
v-bind="{ ...renderSlotProps, formContext: slotProps }"
342+
/>
343+
</template>
344+
<!-- <slot></slot> -->
345+
</component>
346+
</slot>
347+
</FormControl>
348+
</div>
349+
350+
<!-- 自定义后缀 -->
351+
<div v-if="suffix" class="ml-1">
352+
<VbenRenderContent :content="suffix" />
353+
</div>
354+
<FormDescription v-if="description" class="ml-1">
355+
<VbenRenderContent :content="description" />
356+
</FormDescription>
349357
</div>
350358

351-
<FormDescription v-if="description">
352-
<VbenRenderContent :content="description" />
353-
</FormDescription>
354-
355359
<Transition name="slide-up">
356-
<FormMessage class="absolute -bottom-[22px]" />
360+
<FormMessage class="absolute bottom-1" />
357361
</Transition>
358362
</div>
359363
</FormItem>

packages/@core/ui-kit/form-ui/src/form-render/form-label.vue

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
<script setup lang="ts">
2-
import { FormLabel, VbenHelpTooltip } from '@vben-core/shadcn-ui';
2+
import type { CustomRenderType } from '../types';
3+
4+
import {
5+
FormLabel,
6+
VbenHelpTooltip,
7+
VbenRenderContent,
8+
} from '@vben-core/shadcn-ui';
39
import { cn } from '@vben-core/shared/utils';
410
511
interface Props {
612
class?: string;
7-
help?: string;
13+
help?: CustomRenderType;
814
required?: boolean;
915
}
1016
@@ -16,7 +22,7 @@ const props = defineProps<Props>();
1622
<span v-if="required" class="text-destructive mr-[2px]">*</span>
1723
<slot></slot>
1824
<VbenHelpTooltip v-if="help" trigger-class="size-3.5 ml-1">
19-
{{ help }}
25+
<VbenRenderContent :content="help" />
2026
</VbenHelpTooltip>
2127
</FormLabel>
2228
</template>

packages/@core/ui-kit/form-ui/src/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,13 @@ export interface FormSchema<
244244
/** 依赖 */
245245
dependencies?: FormItemDependencies;
246246
/** 描述 */
247-
description?: string;
247+
description?: CustomRenderType;
248248
/** 字段名 */
249249
fieldName: string;
250250
/** 帮助信息 */
251-
help?: string;
251+
help?: CustomRenderType;
252252
/** 表单项 */
253-
label?: string;
253+
label?: CustomRenderType;
254254
// 自定义组件内部渲染
255255
renderComponentContent?: RenderComponentContentType;
256256
/** 字段规则 */

playground/src/views/examples/form/basic.vue

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,18 @@ import { h, ref } from 'vue';
44
import { Page } from '@vben/common-ui';
55
66
import { useDebounceFn } from '@vueuse/core';
7-
import { Button, Card, message, Spin, TabPane, Tabs } from 'ant-design-vue';
7+
import {
8+
Button,
9+
Card,
10+
message,
11+
Spin,
12+
TabPane,
13+
Tabs,
14+
Tag,
15+
} from 'ant-design-vue';
816
import dayjs from 'dayjs';
917
10-
import { useVbenForm } from '#/adapter/form';
18+
import { useVbenForm, z } from '#/adapter/form';
1119
import { getAllMenusApi } from '#/api';
1220
1321
import DocButton from '../doc-button.vue';
@@ -111,6 +119,7 @@ const [BaseForm, baseFormApi] = useVbenForm({
111119
notFoundContent: fetching.value ? h(Spin) : undefined,
112120
};
113121
},
122+
rules: 'selectRequired',
114123
},
115124
{
116125
component: 'ApiTreeSelect',
@@ -151,6 +160,7 @@ const [BaseForm, baseFormApi] = useVbenForm({
151160
label: '图标',
152161
},
153162
{
163+
colon: false,
154164
component: 'Select',
155165
componentProps: {
156166
allowClear: true,
@@ -169,7 +179,7 @@ const [BaseForm, baseFormApi] = useVbenForm({
169179
showSearch: true,
170180
},
171181
fieldName: 'options',
172-
label: '下拉选',
182+
label: () => h(Tag, { color: 'warning' }, () => '😎自定义:'),
173183
},
174184
{
175185
component: 'RadioGroup',
@@ -225,6 +235,7 @@ const [BaseForm, baseFormApi] = useVbenForm({
225235
default: () => ['我已阅读并同意'],
226236
};
227237
},
238+
rules: z.any().refine((v) => v, { message: '为什么不同意?勾上它!' }),
228239
},
229240
{
230241
component: 'Mentions',
@@ -255,6 +266,7 @@ const [BaseForm, baseFormApi] = useVbenForm({
255266
class: 'w-auto',
256267
},
257268
fieldName: 'switch',
269+
help: () => ['这是一个帮助信息', '第二行'].map((v) => h('p', () => v)),
258270
label: '开关',
259271
},
260272
{

0 commit comments

Comments
 (0)