Преглед изворни кода

feat: customizable table separator (#5898)

* 表格的分隔条支持定制背景色或完全移除
Netfan пре 5 месеци
родитељ
комит
9379093a4f

+ 27 - 9
docs/src/components/common-ui/vben-vxe-table.md

@@ -167,6 +167,23 @@ vxeUI.renderer.add('CellLink', {
 
 
 当启用了表单搜索时,可以在toolbarConfig中配置`search`为`true`来让表格在工具栏区域显示一个搜索表单控制按钮。表格的所有以`form-`开头的命名插槽都会被传递给搜索表单。
 当启用了表单搜索时,可以在toolbarConfig中配置`search`为`true`来让表格在工具栏区域显示一个搜索表单控制按钮。表格的所有以`form-`开头的命名插槽都会被传递给搜索表单。
 
 
+### 定制分隔条
+
+当你启用表单搜索时,在表单和表格之间会显示一个分隔条。这个分隔条使用了默认的组件背景色,并且横向贯穿整个Vben Vxe Table在视觉上融入了页面的默认背景中。如果你在Vben Vxe Table的外层包裹了一个不同背景色的容器(如将其放在一个Card内),默认的表单和表格之间的分隔条可能就显得格格不入了,下面的代码演示了如何定制这个分隔条。
+
+```ts
+const [Grid] = useVbenVxeGrid({
+  formOptions: {},
+  gridOptions: {},
+  // 完全移除分隔条
+  separator: false,
+  // 你也可以使用下面的代码来移除分隔条
+  // separator: { show: false },
+  // 或者使用下面的代码来改变分隔条的颜色
+  // separator: { backgroundColor: 'rgba(100,100,0,0.5)' },
+});
+```
+
 <DemoPreview dir="demos/vben-vxe-table/form" />
 <DemoPreview dir="demos/vben-vxe-table/form" />
 
 
 ## 单元格编辑
 ## 单元格编辑
@@ -231,15 +248,16 @@ useVbenVxeGrid 返回的第二个参数,是一个对象,包含了一些表
 
 
 所有属性都可以传入 `useVbenVxeGrid` 的第一个参数中。
 所有属性都可以传入 `useVbenVxeGrid` 的第一个参数中。
 
 
-| 属性名         | 描述                 | 类型                |
-| -------------- | -------------------- | ------------------- |
-| tableTitle     | 表格标题             | `string`            |
-| tableTitleHelp | 表格标题帮助信息     | `string`            |
-| gridClass      | grid组件的class      | `string`            |
-| gridOptions    | grid组件的参数       | `VxeTableGridProps` |
-| gridEvents     | grid组件的触发的事件 | `VxeGridListeners`  |
-| formOptions    | 表单参数             | `VbenFormProps`     |
-| showSearchForm | 是否显示搜索表单     | `boolean`           |
+| 属性名 | 描述 | 类型 | 版本要求 |
+| --- | --- | --- | --- |
+| tableTitle | 表格标题 | `string` | - |
+| tableTitleHelp | 表格标题帮助信息 | `string` | - |
+| gridClass | grid组件的class | `string` | - |
+| gridOptions | grid组件的参数 | `VxeTableGridProps` | - |
+| gridEvents | grid组件的触发的事件 | `VxeGridListeners` | - |
+| formOptions | 表单参数 | `VbenFormProps` | - |
+| showSearchForm | 是否显示搜索表单 | `boolean` | - |
+| separator | 搜索表单与表格主体之间的分隔条 | `boolean\|SeparatorOptions` | >5.5.4 |
 
 
 ## Slots
 ## Slots
 
 

+ 8 - 0
packages/effects/plugins/src/vxe-table/types.ts

@@ -31,6 +31,10 @@ export interface VxeTableGridOptions<T = any> extends VxeTableGridProps<T> {
   toolbarConfig?: ToolbarConfigOptions;
   toolbarConfig?: ToolbarConfigOptions;
 }
 }
 
 
+export interface SeparatorOptions {
+  show?: boolean;
+  backgroundColor?: string;
+}
 export interface VxeGridProps {
 export interface VxeGridProps {
   /**
   /**
    * 标题
    * 标题
@@ -64,6 +68,10 @@ export interface VxeGridProps {
    * 显示搜索表单
    * 显示搜索表单
    */
    */
   showSearchForm?: boolean;
   showSearchForm?: boolean;
+  /**
+   * 搜索表单与表格主体之间的分隔条
+   */
+  separator?: boolean | SeparatorOptions;
 }
 }
 
 
 export type ExtendedVxeGridApi = VxeGridApi & {
 export type ExtendedVxeGridApi = VxeGridApi & {

+ 44 - 3
packages/effects/plugins/src/vxe-table/use-vxe-grid.vue

@@ -29,7 +29,13 @@ import { usePriorityValues } from '@vben/hooks';
 import { EmptyIcon } from '@vben/icons';
 import { EmptyIcon } from '@vben/icons';
 import { $t } from '@vben/locales';
 import { $t } from '@vben/locales';
 import { usePreferences } from '@vben/preferences';
 import { usePreferences } from '@vben/preferences';
-import { cloneDeep, cn, isEqual, mergeWithArrayOverride } from '@vben/utils';
+import {
+  cloneDeep,
+  cn,
+  isBoolean,
+  isEqual,
+  mergeWithArrayOverride,
+} from '@vben/utils';
 
 
 import { VbenHelpTooltip, VbenLoading } from '@vben-core/shadcn-ui';
 import { VbenHelpTooltip, VbenLoading } from '@vben-core/shadcn-ui';
 
 
@@ -67,10 +73,30 @@ const {
   tableTitle,
   tableTitle,
   tableTitleHelp,
   tableTitleHelp,
   showSearchForm,
   showSearchForm,
+  separator,
 } = usePriorityValues(props, state);
 } = usePriorityValues(props, state);
 
 
 const { isMobile } = usePreferences();
 const { isMobile } = usePreferences();
-
+const isSeparator = computed(() => {
+  if (
+    !formOptions.value ||
+    showSearchForm.value === false ||
+    separator.value === false
+  ) {
+    return false;
+  }
+  if (separator.value === true || separator.value === undefined) {
+    return true;
+  }
+  return separator.value.show !== false;
+});
+const separatorBg = computed(() => {
+  return !separator.value ||
+    isBoolean(separator.value) ||
+    !separator.value.backgroundColor
+    ? undefined
+    : separator.value.backgroundColor;
+});
 const slots: SetupContext['slots'] = useSlots();
 const slots: SetupContext['slots'] = useSlots();
 
 
 const [Form, formApi] = useTableForm({
 const [Form, formApi] = useTableForm({
@@ -375,7 +401,18 @@ onUnmounted(() => {
         <div
         <div
           v-if="formOptions"
           v-if="formOptions"
           v-show="showSearchForm !== false"
           v-show="showSearchForm !== false"
-          :class="cn('relative rounded py-3', isCompactForm ? 'pb-8' : 'pb-4')"
+          :class="
+            cn(
+              'relative rounded py-3',
+              isCompactForm
+                ? isSeparator
+                  ? 'pb-8'
+                  : 'pb-4'
+                : isSeparator
+                  ? 'pb-4'
+                  : 'pb-0',
+            )
+          "
         >
         >
           <slot name="form">
           <slot name="form">
             <Form>
             <Form>
@@ -404,6 +441,10 @@ onUnmounted(() => {
             </Form>
             </Form>
           </slot>
           </slot>
           <div
           <div
+            v-if="isSeparator"
+            :style="{
+              ...(separatorBg ? { backgroundColor: separatorBg } : undefined),
+            }"
             class="bg-background-deep z-100 absolute -left-2 bottom-1 h-2 w-[calc(100%+1rem)] overflow-hidden md:bottom-2 md:h-3"
             class="bg-background-deep z-100 absolute -left-2 bottom-1 h-2 w-[calc(100%+1rem)] overflow-hidden md:bottom-2 md:h-3"
           ></div>
           ></div>
         </div>
         </div>