Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf: formApi added validateAndSubmitForm & filedMapToTime renamed fieldMappingTime #4842

Merged
merged 3 commits into from
Nov 9, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/src/components/common-ui/vben-form.md
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ useVbenForm 返回的第二个参数,是一个对象,包含了一些表单
| 方法名 | 描述 | 类型 |
| --- | --- | --- |
| submitForm | 提交表单 | `(e:Event)=>Promise<Record<string,any>>` |
| submitAndValidateForm | 提交并校验表单 | `(e:Event)=>Promise<Record<string,any>>` |
| resetForm | 重置表单 | `()=>Promise<void>` |
| setValues | 设置表单值, 默认会过滤不在schema中定义的field, 可通过filterFields形参关闭过滤 | `(fields: Record<string, any>, filterFields?: boolean, shouldValidate?: boolean) => Promise<void>` |
| getValues | 获取表单值 | `(fields:Record<string, any>,shouldValidate: boolean = false)=>Promise<void>` |
Expand Down Expand Up @@ -309,6 +310,7 @@ useVbenForm 返回的第二个参数,是一个对象,包含了一些表单
| collapsed | 是否折叠,在`是否展开,在showCollapseButton=true`时生效 | `boolean` | `false` |
| collapseTriggerResize | 折叠时,触发`resize`事件 | `boolean` | `false` |
| collapsedRows | 折叠时保持的行数 | `number` | `1` |
| fieldMappingTime | 用于将表单内时间区域的应设成 2 个字段 | `[string, [string, string], string?][]` | - |
| commonConfig | 表单项的通用配置,每个配置都会传递到每个表单项,表单项可覆盖 | `FormCommonConfig` | - |
| schema | 表单项的每一项配置 | `FormSchema` | - |
| submitOnEnter | 按下回车健时提交表单 | `boolean` | false |
Expand Down
1 change: 1 addition & 0 deletions packages/@core/base/shared/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
"@types/lodash.get": "catalog:",
"@vue/shared": "catalog:",
"clsx": "catalog:",
"dayjs": "^1.11.13",
"defu": "catalog:",
"lodash.clonedeep": "catalog:",
"lodash.get": "catalog:",
Expand Down
9 changes: 9 additions & 0 deletions packages/@core/base/shared/src/utils/date.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import dayjs from 'dayjs';

export function formatDate(time: number | string, format = 'YYYY-MM-DD') {
return dayjs(time).format(format);
}
anncwb marked this conversation as resolved.
Show resolved Hide resolved

export function formatDateTime(time: number | string) {
return formatDate(time, 'YYYY-MM-DD HH:mm:ss');
}
1 change: 1 addition & 0 deletions packages/@core/base/shared/src/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export * from './cn';
export * from './date';
export * from './diff';
export * from './dom';
export * from './inference';
Expand Down
49 changes: 13 additions & 36 deletions packages/@core/ui-kit/form-ui/src/components/form-actions.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ import { computed, toRaw, unref, watch } from 'vue';

import { useSimpleLocale } from '@vben-core/composables';
import { VbenExpandableArrow } from '@vben-core/shadcn-ui';
import { cn, isFunction, triggerWindowResize } from '@vben-core/shared/utils';
import {
cn,
formatDate,
isFunction,
triggerWindowResize,
} from '@vben-core/shared/utils';

import { COMPONENT_MAP } from '../config';
import { injectFormProps } from '../use-form-context';
Expand Down Expand Up @@ -64,8 +69,8 @@ async function handleReset(e: Event) {

const values = toRaw(form.values);
// 清理时间字段
props.fieldMapToTime &&
props.fieldMapToTime.forEach(([_, [startTimeKey, endTimeKey]]) => {
props.fieldMappingTime &&
props.fieldMappingTime.forEach(([_, [startTimeKey, endTimeKey]]) => {
delete values[startTimeKey];
delete values[endTimeKey];
});
Expand All @@ -78,15 +83,13 @@ async function handleReset(e: Event) {
}

function handleRangeTimeValue(values: Record<string, any>) {
const fieldMapToTime = unref(rootProps).fieldMapToTime;
const fieldMappingTime = unref(rootProps).fieldMappingTime;

if (!fieldMapToTime) return values;

if (!Array.isArray(fieldMapToTime)) {
if (!fieldMappingTime || !Array.isArray(fieldMappingTime)) {
return values;
}

fieldMapToTime.forEach(
fieldMappingTime.forEach(
([field, [startTimeKey, endTimeKey], format = 'YYYY-MM-DD']) => {
if (!values[field]) {
delete values[field];
Expand All @@ -99,10 +102,10 @@ function handleRangeTimeValue(values: Record<string, any>) {
: [format, format];

values[startTimeKey] = startTime
? formatTime(startTime, startTimeFormat)
? formatDate(startTime, startTimeFormat)
: undefined;
values[endTimeKey] = endTime
? formatTime(endTime, endTimeFormat)
? formatDate(endTime, endTimeFormat)
: undefined;

delete values[field];
Expand All @@ -112,32 +115,6 @@ function handleRangeTimeValue(values: Record<string, any>) {
return values;
}

function formatTime(time: string, format: string): number | string {
const date = new Date(time);
const timestamp = (date: Date) => Math.floor(date.getTime() / 1000);

if (format === 'timestamp') return timestamp(date);
if (format === 'timestampStartDay')
return timestamp(
new Date(date.getFullYear(), date.getMonth(), date.getDate()),
);

const padZero = (num: number) => num.toString().padStart(2, '0');
const replacements: Record<string, string> = {
DD: padZero(date.getDate()),
HH: padZero(date.getHours()),
MM: padZero(date.getMonth() + 1),
mm: padZero(date.getMinutes()),
ss: padZero(date.getSeconds()),
YYYY: date.getFullYear().toString(),
};

return format.replaceAll(
/YYYY|MM|DD|HH|mm|ss/g,
(match) => replacements[match] || match,
);
}

watch(
() => collapsed.value,
() => {
Expand Down
9 changes: 9 additions & 0 deletions packages/@core/ui-kit/form-ui/src/form-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,15 @@ export class FormApi {
form.setValues(filteredFields, shouldValidate);
}

async submitAndValidateForm() {
const form = await this.getForm();
const { valid } = await form.validate();
if (!valid) {
return;
}
return await this.submitForm();
}

async submitForm(e?: Event) {
e?.preventDefault();
e?.stopPropagation();
Expand Down
10 changes: 5 additions & 5 deletions packages/@core/ui-kit/form-ui/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ export type HandleResetFn = (
values: Record<string, any>,
) => Promise<void> | void;

export type FieldMapToTime = [
export type FieldMappingTime = [
string,
[string, string],
([string, string] | string)?,
Expand Down Expand Up @@ -272,10 +272,6 @@ export interface FormRenderProps<
* 组件集合
*/
componentMap: Record<BaseFormComponentType, Component>;
/**
* 表单字段映射成时间格式
*/
fieldMapToTime?: FieldMapToTime;
/**
* 表单实例
*/
Expand Down Expand Up @@ -315,6 +311,10 @@ export interface VbenFormProps<
* 表单操作区域class
*/
actionWrapperClass?: ClassType;
/**
* 表单字段映射成时间格式
*/
fieldMappingTime?: FieldMappingTime;
/**
* 表单重置回调
*/
Expand Down
8 changes: 3 additions & 5 deletions packages/effects/plugins/src/vxe-table/extends.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ import type { VxeGridProps, VxeUIExport } from 'vxe-table';

import type { VxeGridApi } from './api';

import { isFunction } from '@vben/utils';

import dayjs from 'dayjs';
import { formatDate, formatDateTime, isFunction } from '@vben/utils';

export function extendProxyOptions(
api: VxeGridApi,
Expand Down Expand Up @@ -54,13 +52,13 @@ function extendProxyOption(
export function extendsDefaultFormatter(vxeUI: VxeUIExport) {
vxeUI.formats.add('formatDate', {
tableCellFormatMethod({ cellValue }) {
return dayjs(cellValue).format('YYYY-MM-DD');
return formatDate(cellValue);
},
});

vxeUI.formats.add('formatDateTime', {
tableCellFormatMethod({ cellValue }) {
return dayjs(cellValue).format('YYYY-MM-DD HH:mm:ss');
return formatDateTime(cellValue);
},
});
}
3 changes: 2 additions & 1 deletion playground/src/views/examples/form/basic.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ const [BaseForm, baseFormApi] = useVbenForm({
class: 'w-full',
},
},

fieldMappingTime: [['rangePicker', ['startTime', 'endTime'], 'YYYY-MM-DD']],
// 提交函数
handleSubmit: onSubmit,

// 垂直布局,label和input在不同行,值为vertical
// 水平布局,label和input在同一行
layout: 'horizontal',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
},
onConfirm: async () => {
await formApi.submitForm();
modalApi.close();
await formApi.submitAndValidateForm();
// modalApi.close();
anncwb marked this conversation as resolved.
Show resolved Hide resolved
},
onOpenChange(isOpen: boolean) {
if (isOpen) {
Expand Down
2 changes: 1 addition & 1 deletion playground/src/views/examples/modal/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import AutoHeightDemo from './auto-height-demo.vue';
import BaseDemo from './base-demo.vue';
import DragDemo from './drag-demo.vue';
import DynamicDemo from './dynamic-demo.vue';
import FormModalDemo from './form-model-demo.vue';
import FormModalDemo from './form-modal-demo.vue';
import SharedDataDemo from './shared-data-demo.vue';

const [BaseModal, baseModalApi] = useVbenModal({
Expand Down
6 changes: 0 additions & 6 deletions playground/src/views/examples/vxe-table/form.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ interface RowType {
const formOptions: VbenFormProps = {
// 默认展开
collapsed: false,
fieldMapToTime: [['dateRangePicker', ['startTime', 'endTime'], 'YYYY-MM']],
schema: [
{
component: 'Input',
Expand Down Expand Up @@ -63,11 +62,6 @@ const formOptions: VbenFormProps = {
fieldName: 'datePicker',
label: 'Date',
},
{
component: 'RangePicker',
fieldName: 'dateRangePicker',
label: 'DateRange',
},
],
// 控制表单是否显示折叠按钮
showCollapseButton: true,
Expand Down
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading