fix: fix known issues with the form (#4696)

* fix: fix known issues with the form

* chore: typo

* chore: typo
pull/48/MERGE
Vben 2024-10-20 22:34:11 +08:00 committed by GitHub
parent 93b48ef244
commit d262b7b6c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 54 additions and 84 deletions

View File

@ -16,7 +16,7 @@ categories:
- title: '🐞 Bug Fixes' - title: '🐞 Bug Fixes'
labels: labels:
- 'bug' - 'bug'
- title: '📈 Performance' - title: '📈 Performance & Enhancement'
labels: labels:
- 'perf' - 'perf'
- 'enhancement' - 'enhancement'

View File

@ -46,7 +46,7 @@ const formSchema = computed((): VbenFormSchema[] => {
rules(values) { rules(values) {
const { password } = values; const { password } = values;
return z return z
.string() .string({ required_error: $t('authentication.passwordTip') })
.min(1, { message: $t('authentication.passwordTip') }) .min(1, { message: $t('authentication.passwordTip') })
.refine((value) => value === password, { .refine((value) => value === password, {
message: $t('authentication.confirmPasswordTip'), message: $t('authentication.confirmPasswordTip'),
@ -56,7 +56,6 @@ const formSchema = computed((): VbenFormSchema[] => {
}, },
fieldName: 'confirmPassword', fieldName: 'confirmPassword',
label: $t('authentication.confirmPassword'), label: $t('authentication.confirmPassword'),
rules: z.string().min(1, { message: $t('authentication.passwordTip') }),
}, },
{ {
component: 'VbenCheckbox', component: 'VbenCheckbox',
@ -68,15 +67,10 @@ const formSchema = computed((): VbenFormSchema[] => {
h( h(
'a', 'a',
{ {
class: class: 'vben-link ml-1 ',
'cursor-pointer text-primary ml-1 hover:text-primary-hover',
href: '', href: '',
}, },
[ `${$t('authentication.privacyPolicy')} & ${$t('authentication.terms')}`,
$t('authentication.privacyPolicy'),
'&',
$t('authentication.terms'),
],
), ),
]), ]),
}), }),

View File

@ -46,7 +46,7 @@ const formSchema = computed((): VbenFormSchema[] => {
rules(values) { rules(values) {
const { password } = values; const { password } = values;
return z return z
.string() .string({ required_error: $t('authentication.passwordTip') })
.min(1, { message: $t('authentication.passwordTip') }) .min(1, { message: $t('authentication.passwordTip') })
.refine((value) => value === password, { .refine((value) => value === password, {
message: $t('authentication.confirmPasswordTip'), message: $t('authentication.confirmPasswordTip'),
@ -56,7 +56,6 @@ const formSchema = computed((): VbenFormSchema[] => {
}, },
fieldName: 'confirmPassword', fieldName: 'confirmPassword',
label: $t('authentication.confirmPassword'), label: $t('authentication.confirmPassword'),
rules: z.string().min(1, { message: $t('authentication.passwordTip') }),
}, },
{ {
component: 'VbenCheckbox', component: 'VbenCheckbox',
@ -68,15 +67,10 @@ const formSchema = computed((): VbenFormSchema[] => {
h( h(
'a', 'a',
{ {
class: class: 'vben-link ml-1 ',
'cursor-pointer text-primary ml-1 hover:text-primary-hover',
href: '', href: '',
}, },
[ `${$t('authentication.privacyPolicy')} & ${$t('authentication.terms')}`,
$t('authentication.privacyPolicy'),
'&',
$t('authentication.terms'),
],
), ),
]), ]),
}), }),

View File

@ -46,7 +46,7 @@ const formSchema = computed((): VbenFormSchema[] => {
rules(values) { rules(values) {
const { password } = values; const { password } = values;
return z return z
.string() .string({ required_error: $t('authentication.passwordTip') })
.min(1, { message: $t('authentication.passwordTip') }) .min(1, { message: $t('authentication.passwordTip') })
.refine((value) => value === password, { .refine((value) => value === password, {
message: $t('authentication.confirmPasswordTip'), message: $t('authentication.confirmPasswordTip'),
@ -56,7 +56,6 @@ const formSchema = computed((): VbenFormSchema[] => {
}, },
fieldName: 'confirmPassword', fieldName: 'confirmPassword',
label: $t('authentication.confirmPassword'), label: $t('authentication.confirmPassword'),
rules: z.string().min(1, { message: $t('authentication.passwordTip') }),
}, },
{ {
component: 'VbenCheckbox', component: 'VbenCheckbox',
@ -68,15 +67,10 @@ const formSchema = computed((): VbenFormSchema[] => {
h( h(
'a', 'a',
{ {
class: class: 'vben-link ml-1',
'cursor-pointer text-primary ml-1 hover:text-primary-hover',
href: '', href: '',
}, },
[ `${$t('authentication.privacyPolicy')} & ${$t('authentication.terms')}`,
$t('authentication.privacyPolicy'),
'&',
$t('authentication.terms'),
],
), ),
]), ]),
}), }),

View File

@ -142,6 +142,10 @@
@apply outline-primary left-0 top-0 h-full w-full p-1 opacity-100; @apply outline-primary left-0 top-0 h-full w-full p-1 opacity-100;
} }
.vben-link {
@apply text-primary hover:text-primary-hover active:text-primary-active cursor-pointer;
}
.card-box { .card-box {
@apply bg-card text-card-foreground border-border rounded-xl border; @apply bg-card text-card-foreground border-border rounded-xl border;
} }

View File

@ -22,6 +22,7 @@ export function useExpandable(props: FormRenderProps) {
for (let index = 1; index <= rows; index++) { for (let index = 1; index <= rows; index++) {
maxItem += mapping?.[index] ?? 0; maxItem += mapping?.[index] ?? 0;
} }
// 保持一行
return maxItem - 1 || 1; return maxItem - 1 || 1;
}); });
@ -35,6 +36,7 @@ export function useExpandable(props: FormRenderProps) {
if (val) { if (val) {
await nextTick(); await nextTick();
rowMapping.value = {}; rowMapping.value = {};
isCalculated.value = false;
await calculateRowMapping(); await calculateRowMapping();
} }
}, },

View File

@ -279,7 +279,7 @@ function autofocus() {
'flex leading-6', 'flex leading-6',
{ {
'mr-2 flex-shrink-0 justify-end': !isVertical, 'mr-2 flex-shrink-0 justify-end': !isVertical,
'flex-row': isVertical, 'mb-1 flex-row': isVertical,
}, },
labelClass, labelClass,
) )

View File

@ -12,7 +12,7 @@ const props = defineProps<Props>();
</script> </script>
<template> <template>
<FormLabel :class="cn('mb-1 flex items-center', props.class)"> <FormLabel :class="cn('flex items-center', props.class)">
<span v-if="required" class="text-destructive mr-[2px]">*</span> <span v-if="required" class="text-destructive mr-[2px]">*</span>
<slot></slot> <slot></slot>
<VbenHelpTooltip v-if="help" trigger-class="size-3.5 ml-1"> <VbenHelpTooltip v-if="help" trigger-class="size-3.5 ml-1">

View File

@ -12,12 +12,7 @@ const collapsed = defineModel({ default: false });
<template> <template>
<div <div
:class=" :class="cn('vben-link inline-flex items-center', props.class)"
cn(
'text-primary hover:text-primary-hover inline-flex cursor-pointer items-center',
props.class,
)
"
@click="collapsed = !collapsed" @click="collapsed = !collapsed"
> >
<slot :is-expanded="collapsed"> <slot :is-expanded="collapsed">

View File

@ -44,7 +44,7 @@ declare global {
const renderLink = (href: string, text: string) => const renderLink = (href: string, text: string) =>
h( h(
'a', 'a',
{ href, target: '_blank', class: 'text-primary hover:text-primary-hover' }, { href, target: '_blank', class: 'vben-link' },
{ default: () => text }, { default: () => text },
); );
@ -114,11 +114,7 @@ const devDependenciesItems = Object.keys(devDependencies).map((key) => ({
<Page :title="title"> <Page :title="title">
<template #description> <template #description>
<p class="text-foreground mt-3 text-sm leading-6"> <p class="text-foreground mt-3 text-sm leading-6">
<a <a :href="VBEN_GITHUB_URL" class="vben-link" target="_blank">
:href="VBEN_GITHUB_URL"
class="text-primary hover:text-primary-hover"
target="_blank"
>
{{ name }} {{ name }}
</a> </a>
{{ description }} {{ description }}

View File

@ -120,7 +120,7 @@ onMounted(() => {
<span <span
v-if="showForgetPassword" v-if="showForgetPassword"
class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal" class="vben-link text-sm font-normal"
@click="handleGo(forgetPasswordPath)" @click="handleGo(forgetPasswordPath)"
> >
{{ $t('authentication.forgetPassword') }} {{ $t('authentication.forgetPassword') }}
@ -169,7 +169,7 @@ onMounted(() => {
<div v-if="showRegister" class="mt-3 text-center text-sm"> <div v-if="showRegister" class="mt-3 text-center text-sm">
{{ $t('authentication.accountTip') }} {{ $t('authentication.accountTip') }}
<span <span
class="text-primary hover:text-primary-hover active:text-primary-active cursor-pointer text-sm font-normal" class="vben-link text-sm font-normal"
@click="handleGo(registerPath)" @click="handleGo(registerPath)"
> >
{{ $t('authentication.createAccount') }} {{ $t('authentication.createAccount') }}

View File

@ -107,10 +107,7 @@ function goToLogin() {
</VbenButton> </VbenButton>
<div class="mt-4 text-center text-sm"> <div class="mt-4 text-center text-sm">
{{ $t('authentication.alreadyHaveAccount') }} {{ $t('authentication.alreadyHaveAccount') }}
<span <span class="vben-link text-sm font-normal" @click="goToLogin()">
class="text-primary hover:text-primary-hover cursor-pointer text-sm font-normal"
@click="goToLogin()"
>
{{ $t('authentication.goToLogin') }} {{ $t('authentication.goToLogin') }}
</span> </span>
</div> </div>

View File

@ -15,33 +15,6 @@ const routes: RouteRecordRaw[] = [
name: 'Examples', name: 'Examples',
path: '/examples', path: '/examples',
children: [ children: [
{
name: 'ModalExample',
path: '/examples/modal',
component: () => import('#/views/examples/modal/index.vue'),
meta: {
icon: 'system-uicons:window-content',
title: $t('examples.modal.title'),
},
},
{
name: 'DrawerExample',
path: '/examples/drawer',
component: () => import('#/views/examples/drawer/index.vue'),
meta: {
icon: 'iconoir:drawer',
title: $t('examples.drawer.title'),
},
},
{
name: 'EllipsisExample',
path: '/examples/ellipsis',
component: () => import('#/views/examples/ellipsis/index.vue'),
meta: {
icon: 'ion:ellipsis-horizontal',
title: $t('examples.ellipsis.title'),
},
},
{ {
name: 'FormExample', name: 'FormExample',
path: '/examples/form', path: '/examples/form',
@ -228,6 +201,33 @@ const routes: RouteRecordRaw[] = [
}, },
], ],
}, },
{
name: 'ModalExample',
path: '/examples/modal',
component: () => import('#/views/examples/modal/index.vue'),
meta: {
icon: 'system-uicons:window-content',
title: $t('examples.modal.title'),
},
},
{
name: 'DrawerExample',
path: '/examples/drawer',
component: () => import('#/views/examples/drawer/index.vue'),
meta: {
icon: 'iconoir:drawer',
title: $t('examples.drawer.title'),
},
},
{
name: 'EllipsisExample',
path: '/examples/ellipsis',
component: () => import('#/views/examples/ellipsis/index.vue'),
meta: {
icon: 'ion:ellipsis-horizontal',
title: $t('examples.ellipsis.title'),
},
},
], ],
}, },
]; ];

View File

@ -46,7 +46,7 @@ const formSchema = computed((): VbenFormSchema[] => {
rules(values) { rules(values) {
const { password } = values; const { password } = values;
return z return z
.string() .string({ required_error: $t('authentication.passwordTip') })
.min(1, { message: $t('authentication.passwordTip') }) .min(1, { message: $t('authentication.passwordTip') })
.refine((value) => value === password, { .refine((value) => value === password, {
message: $t('authentication.confirmPasswordTip'), message: $t('authentication.confirmPasswordTip'),
@ -56,7 +56,6 @@ const formSchema = computed((): VbenFormSchema[] => {
}, },
fieldName: 'confirmPassword', fieldName: 'confirmPassword',
label: $t('authentication.confirmPassword'), label: $t('authentication.confirmPassword'),
rules: z.string().min(1, { message: $t('authentication.passwordTip') }),
}, },
{ {
component: 'VbenCheckbox', component: 'VbenCheckbox',
@ -68,15 +67,10 @@ const formSchema = computed((): VbenFormSchema[] => {
h( h(
'a', 'a',
{ {
class: class: 'vben-link ml-1 ',
'cursor-pointer text-primary ml-1 hover:text-primary-hover',
href: '', href: '',
}, },
[ `${$t('authentication.privacyPolicy')} & ${$t('authentication.terms')}`,
$t('authentication.privacyPolicy'),
'&',
$t('authentication.terms'),
],
), ),
]), ]),
}), }),