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

feat: table search form visible control #5121

Merged
merged 3 commits into from
Dec 12, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
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
20 changes: 12 additions & 8 deletions docs/src/components/common-ui/vben-vxe-table.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ vxeUI.renderer.add('CellLink', {

**表单搜索** 部分采用了`Vben Form 表单`,参考 [Vben Form 表单文档](/components/common-ui/vben-form)。

当启用了表单搜索时,可以在toolbarConfig中配置`search`为`true`来让表格在工具栏区域显示一个搜索表单控制按钮。

<DemoPreview dir="demos/vben-vxe-table/form" />

## 单元格编辑
Expand Down Expand Up @@ -215,14 +217,15 @@ const [Grid, gridApi] = useVbenVxeGrid({

useVbenVxeGrid 返回的第二个参数,是一个对象,包含了一些表单的方法。

| 方法名 | 描述 | 类型 |
| --- | --- | --- |
| setLoading | 设置loading状态 | `(loading)=>void` |
| setGridOptions | 设置vxe-table grid组件参数 | `(options: Partial<VxeGridProps['gridOptions'])=>void` |
| reload | 重载表格,会进行初始化 | `(params:any)=>void` |
| query | 重载表格,会保留当前分页 | `(params:any)=>void` |
| grid | vxe-table grid实例 | `VxeGridInstance` |
| formApi | vbenForm api实例 | `FormApi` |
| 方法名 | 描述 | 类型 | 说明 |
| --- | --- | --- | --- |
| setLoading | 设置loading状态 | `(loading)=>void` | - |
| setGridOptions | 设置vxe-table grid组件参数 | `(options: Partial<VxeGridProps['gridOptions'])=>void` | - |
| reload | 重载表格,会进行初始化 | `(params:any)=>void` | - |
| query | 重载表格,会保留当前分页 | `(params:any)=>void` | - |
| grid | vxe-table grid实例 | `VxeGridInstance` | - |
| formApi | vbenForm api实例 | `FormApi` | - |
| toggleSearchForm | 设置搜索表单显示状态 | `(show?: boolean)=>boolean` | 当省略参数时,则将表单在显示和隐藏两种状态之间切换 |

## Props

Expand All @@ -236,3 +239,4 @@ useVbenVxeGrid 返回的第二个参数,是一个对象,包含了一些表
| gridOptions | grid组件的参数 | `VxeTableGridProps` |
| gridEvents | grid组件的触发的⌚️ | `VxeGridListeners` |
| formOptions | 表单参数 | `VbenFormProps` |
| isFormShow | 是否显示搜索表单 | `boolean` |
5 changes: 5 additions & 0 deletions docs/src/demos/vben-vxe-table/form/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ const gridOptions: VxeGridProps<RowType> = {
},
},
},
toolbarConfig: {
// 是否显示搜索表单控制按钮
// @ts-ignore 正式环境时有完整的类型声明
search: true,
},
mynetfan marked this conversation as resolved.
Show resolved Hide resolved
};

const [Grid] = useVbenVxeGrid({ formOptions, gridOptions });
Expand Down
18 changes: 18 additions & 0 deletions packages/effects/plugins/src/vxe-table/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { toRaw } from 'vue';
import { Store } from '@vben-core/shared/store';
import {
bindMethods,
isBoolean,
isFunction,
mergeWithArrayOverride,
StateHandler,
Expand All @@ -20,6 +21,7 @@ function getDefaultState(): VxeGridProps {
gridOptions: {},
gridEvents: {},
formOptions: undefined,
isFormShow: true,
};
}

Expand Down Expand Up @@ -80,6 +82,12 @@ export class VxeGridApi {
}
}

setFormVisible(isVisible: boolean) {
this.setState({
isFormShow: isVisible,
});
}

setGridOptions(options: Partial<VxeGridProps['gridOptions']>) {
this.setState({
gridOptions: options,
Expand Down Expand Up @@ -108,6 +116,16 @@ export class VxeGridApi {
}
}

toggleSearchForm(show?: boolean) {
this.setState({
isFormShow: isBoolean(show) ? show : !this.state?.isFormShow,
});
// nextTick(() => {
// this.grid.recalculate();
// });
return this.state?.isFormShow;
}

unmount() {
this.isMounted = false;
this.stateHandler.reset();
Expand Down
3 changes: 2 additions & 1 deletion packages/effects/plugins/src/vxe-table/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export { setupVbenVxeTable } from './init';
export type { VxeTableGridOptions } from './types';
export * from './use-vxe-grid';
export { default as VbenVxeGrid } from './use-vxe-grid.vue';

export { default as VbenVxeGrid } from './use-vxe-grid.vue';
export type { VxeGridListeners, VxeGridProps } from 'vxe-table';
16 changes: 15 additions & 1 deletion packages/effects/plugins/src/vxe-table/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { ClassType, DeepPartial } from '@vben/types';
import type { VbenFormProps } from '@vben-core/form-ui';
import type {
VxeGridListeners,
VxeGridPropTypes,
VxeGridProps as VxeTableGridProps,
VxeUIExport,
} from 'vxe-table';
Expand All @@ -18,6 +19,15 @@ export interface VxePaginationInfo {
total: number;
}

interface ToolbarConfigOptions extends VxeGridPropTypes.ToolbarConfig {
/** 是否显示切换搜索表单的按钮 */
search?: boolean;
}

export interface VxeTableGridOptions<T = any> extends VxeTableGridProps<T> {
toolbarConfig: ToolbarConfigOptions;
}
mynetfan marked this conversation as resolved.
Show resolved Hide resolved

export interface VxeGridProps {
/**
* 标题
Expand All @@ -38,7 +48,7 @@ export interface VxeGridProps {
/**
* vxe-grid 配置
*/
gridOptions?: DeepPartial<VxeTableGridProps>;
gridOptions?: DeepPartial<VxeTableGridOptions>;
/**
* vxe-grid 事件
*/
Expand All @@ -47,6 +57,10 @@ export interface VxeGridProps {
* 表单配置
*/
formOptions?: VbenFormProps;
/**
* 显示搜索表单
*/
isFormShow?: boolean;
}

export type ExtendedVxeGridApi = {
Expand Down
54 changes: 43 additions & 11 deletions packages/effects/plugins/src/vxe-table/use-vxe-grid.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<script lang="ts" setup>
import type { VbenFormProps } from '@vben-core/form-ui';
import type {
VxeGridDefines,
VxeGridInstance,
VxeGridPropTypes,
VxeGridProps as VxeTableGridProps,
} from 'vxe-table';

Expand Down Expand Up @@ -57,6 +59,7 @@ const {
formOptions,
tableTitle,
tableTitleHelp,
isFormShow,
} = usePriorityValues(props, state);

const { isMobile } = usePreferences();
Expand Down Expand Up @@ -103,21 +106,37 @@ const toolbarOptions = computed(() => {
const slotActions = slots[TOOLBAR_ACTIONS]?.();
const slotTools = slots[TOOLBAR_TOOLS]?.();

const toolbarConfig: VxeGridPropTypes.ToolbarConfig = {
tools:
gridOptions.value?.toolbarConfig?.search && !!formOptions.value
? [
{
code: 'search',
icon: 'vxe-icon--search',
circle: true,
status: isFormShow.value ? 'primary' : undefined,
title: $t('common.search'),
},
]
: [],
};

if (!showToolbar.value) {
return {};
return { toolbarConfig };
}

// if (gridOptions.value?.toolbarConfig?.search) {
// }
// 强制使用固定的toolbar配置,不允许用户自定义
// 减少配置的复杂度,以及后续维护的成本
return {
toolbarConfig: {
slots: {
...(slotActions || showTableTitle.value
? { buttons: TOOLBAR_ACTIONS }
: {}),
...(slotTools ? { tools: TOOLBAR_TOOLS } : {}),
},
},
toolbarConfig.slots = {
...(slotActions || showTableTitle.value
? { buttons: TOOLBAR_ACTIONS }
: {}),
...(slotTools ? { tools: TOOLBAR_TOOLS } : {}),
};

return { toolbarConfig };
});

const options = computed(() => {
Expand Down Expand Up @@ -173,9 +192,18 @@ const options = computed(() => {
return mergedOptions;
});

function onToolbarToolClick(event: VxeGridDefines.ToolbarToolClickEventParams) {
if (event.code === 'search') {
props.api?.toggleSearchForm?.();
}
// @ts-ignore
gridEvents.value?.toolbarToolClick?.(event);
}
mynetfan marked this conversation as resolved.
Show resolved Hide resolved

const events = computed(() => {
return {
...gridEvents.value,
toolbarToolClick: onToolbarToolClick,
};
});

Expand Down Expand Up @@ -304,7 +332,11 @@ onUnmounted(() => {

<!-- form表单 -->
<template #form>
<div v-if="formOptions" class="relative rounded py-3 pb-4">
<div
v-if="formOptions"
v-show="isFormShow !== false"
class="relative rounded py-3 pb-4"
>
<slot name="form">
<Form>
<template
Expand Down
3 changes: 2 additions & 1 deletion packages/locales/src/langs/en-US/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
"noData": "No Data",
"refresh": "Refresh",
"loadingMenu": "Loading Menu",
"query": "Search"
"query": "Search",
"search": "Search"
}
3 changes: 2 additions & 1 deletion packages/locales/src/langs/zh-CN/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
"noData": "暂无数据",
"refresh": "刷新",
"loadingMenu": "加载菜单中",
"query": "查询"
"query": "查询",
"search": "搜索"
}
1 change: 1 addition & 0 deletions playground/src/views/examples/vxe-table/custom-cell.vue
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ const gridOptions: VxeGridProps<RowType> = {
},
},
},
showOverflow: false,
};

const [Grid] = useVbenVxeGrid({ gridOptions });
Expand Down
18 changes: 15 additions & 3 deletions playground/src/views/examples/vxe-table/form.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script lang="ts" setup>
import type { VbenFormProps } from '#/adapter/form';
import type { VxeGridProps } from '#/adapter/vxe-table';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';

import { Page } from '@vben/common-ui';

Expand Down Expand Up @@ -71,7 +71,7 @@ const formOptions: VbenFormProps = {
submitOnEnter: false,
};

const gridOptions: VxeGridProps<RowType> = {
const gridOptions: VxeTableGridOptions<RowType> = {
checkboxConfig: {
highlight: true,
labelField: 'name',
Expand All @@ -85,6 +85,7 @@ const gridOptions: VxeGridProps<RowType> = {
{ field: 'price', title: 'Price' },
{ field: 'releaseDate', formatter: 'formatDateTime', title: 'Date' },
],
exportConfig: {},
height: 'auto',
keepSource: true,
pagerConfig: {},
Expand All @@ -100,9 +101,20 @@ const gridOptions: VxeGridProps<RowType> = {
},
},
},
toolbarConfig: {
custom: true,
export: true,
refresh: true,
resizable: true,
search: true,
zoom: true,
},
};

const [Grid] = useVbenVxeGrid({ formOptions, gridOptions });
const [Grid] = useVbenVxeGrid({
formOptions,
gridOptions,
});
</script>

<template>
Expand Down
Loading