From 816553bfcd5a88988c6e7b93cc3378f4a5b17fee Mon Sep 17 00:00:00 2001
From: xachary <179740385@qq.com>
Date: Fri, 29 Dec 2023 09:20:02 +0800
Subject: [PATCH] feat(demo->BasicTable): add TableSelectionBar and enable
checkbox rowSelection demo (#3477)
* feat: add TableSelectionBar
* feat: enable TableSelectionBar for checkbox rowSelection demo
---
src/components/Table/src/BasicTable.vue | 9 +-
.../Table/src/components/TableHeader.vue | 20 ++++-
.../src/components/TableSelectionBar.vue | 56 ++++++++++++
.../Table/src/hooks/useRowSelection.ts | 5 ++
.../Table/src/hooks/useTableHeader.ts | 11 ++-
src/components/Table/src/props.ts | 1 +
src/components/Table/src/types/table.ts | 11 +++
src/locales/lang/en/component.json | 5 +-
src/locales/lang/zh-CN/component.json | 5 +-
src/views/demo/table/AuthColumn.vue | 1 +
src/views/demo/table/FooterTable.vue | 1 +
src/views/demo/table/FormTable.vue | 90 +------------------
src/views/demo/table/RefTable.vue | 3 +-
src/views/demo/table/TreeTable.vue | 1 +
src/views/demo/table/UseTable.vue | 1 +
15 files changed, 123 insertions(+), 97 deletions(-)
create mode 100644 src/components/Table/src/components/TableSelectionBar.vue
diff --git a/src/components/Table/src/BasicTable.vue b/src/components/Table/src/BasicTable.vue
index 1ce5a4ac..9d0ac56f 100644
--- a/src/components/Table/src/BasicTable.vue
+++ b/src/components/Table/src/BasicTable.vue
@@ -53,7 +53,7 @@
import { BasicForm, useForm } from '@/components/Form';
import { PageWrapperFixedHeightKey } from '@/enums/pageEnum';
import HeaderCell from './components/HeaderCell.vue';
- import { InnerHandlers } from './types/table';
+ import { InnerHandlers, InnerMethods } from './types/table';
import { usePagination } from './hooks/usePagination';
import { useColumns } from './hooks/useColumns';
import { useDataSource } from './hooks/useDataSource';
@@ -221,7 +221,12 @@
},
};
- const { getHeaderProps } = useTableHeader(getProps, slots, handlers);
+ const methods: InnerMethods = {
+ clearSelectedRowKeys,
+ getSelectRowKeys,
+ };
+
+ const { getHeaderProps } = useTableHeader(getProps, slots, handlers, methods);
const { getFooterProps } = useTableFooter(getProps, getScrollRef, tableElRef, getDataSourceRef);
diff --git a/src/components/Table/src/components/TableHeader.vue b/src/components/Table/src/components/TableHeader.vue
index 45d8886b..7e0b50cb 100644
--- a/src/components/Table/src/components/TableHeader.vue
+++ b/src/components/Table/src/components/TableHeader.vue
@@ -3,6 +3,9 @@
+
+
+
diff --git a/src/components/Table/src/hooks/useRowSelection.ts b/src/components/Table/src/hooks/useRowSelection.ts
index c940e783..0f4f66dc 100644
--- a/src/components/Table/src/hooks/useRowSelection.ts
+++ b/src/components/Table/src/hooks/useRowSelection.ts
@@ -83,7 +83,12 @@ export function useRowSelection(
}
function setSelectedRows(rows: Recordable[]) {
+ const { rowKey } = unref(propsRef);
selectedRowRef.value = rows;
+ selectedRowKeysRef.value = selectedRowRef.value.map((o) => {
+ const key = (isFunction(rowKey) ? rowKey(o) : rowKey) || 'key';
+ return o[key];
+ });
}
function clearSelectedRowKeys() {
diff --git a/src/components/Table/src/hooks/useTableHeader.ts b/src/components/Table/src/hooks/useTableHeader.ts
index b230437d..5fcf82fe 100644
--- a/src/components/Table/src/hooks/useTableHeader.ts
+++ b/src/components/Table/src/hooks/useTableHeader.ts
@@ -1,5 +1,5 @@
import type { ComputedRef, Slots } from 'vue';
-import type { BasicTableProps, InnerHandlers } from '../types/table';
+import type { BasicTableProps, InnerHandlers, InnerMethods } from '../types/table';
import { unref, computed, h } from 'vue';
import TableHeader from '../components/TableHeader.vue';
import { isString } from '@/utils/is';
@@ -9,9 +9,12 @@ export function useTableHeader(
propsRef: ComputedRef,
slots: Slots,
handlers: InnerHandlers,
+ //
+ methods: InnerMethods,
) {
const getHeaderProps = computed((): Recordable => {
- const { title, showTableSetting, titleHelpMessage, tableSetting } = unref(propsRef);
+ const { title, showTableSetting, titleHelpMessage, tableSetting, showSelectionBar } =
+ unref(propsRef);
const hideTitle = !slots.tableTitle && !title && !slots.toolbar && !showTableSetting;
if (hideTitle && !isString(title)) {
return {};
@@ -29,6 +32,10 @@ export function useTableHeader(
showTableSetting,
tableSetting,
onColumnsChange: handlers.onColumnsChange,
+ //
+ clearSelectedRowKeys: methods.clearSelectedRowKeys,
+ count: methods.getSelectRowKeys().length,
+ showSelectionBar,
} as Recordable,
{
...(slots.toolbar
diff --git a/src/components/Table/src/props.ts b/src/components/Table/src/props.ts
index 761fcbc8..5857683e 100644
--- a/src/components/Table/src/props.ts
+++ b/src/components/Table/src/props.ts
@@ -105,6 +105,7 @@ export const basicProps = {
type: Object as PropType,
default: null,
},
+ showSelectionBar: propTypes.bool,
title: {
type: [String, Function] as PropType string)>,
default: null,
diff --git a/src/components/Table/src/types/table.ts b/src/components/Table/src/types/table.ts
index 9fa58113..fe0410b9 100644
--- a/src/components/Table/src/types/table.ts
+++ b/src/components/Table/src/types/table.ts
@@ -312,6 +312,12 @@ export interface BasicTableProps {
*/
rowSelection?: TableRowSelection;
+ /**
+ * Show table selection bar(显示多选状态栏)
+ * @type boolean
+ */
+ showSelectionBar?: boolean;
+
/**
* Set horizontal or vertical scrolling, can also be used to specify the width and height of the scroll area.
* It is recommended to set a number for x, if you want to set it to true,
@@ -489,6 +495,11 @@ export interface InnerHandlers {
onColumnsChange: (data: ColumnChangeParam[]) => void;
}
+export interface InnerMethods {
+ clearSelectedRowKeys: TableActionType['clearSelectedRowKeys'];
+ getSelectRowKeys: TableActionType['getSelectRowKeys'];
+}
+
export interface ColumnOptionsType {
value: string;
label: string;
diff --git a/src/locales/lang/en/component.json b/src/locales/lang/en/component.json
index 7b81a574..11741189 100644
--- a/src/locales/lang/en/component.json
+++ b/src/locales/lang/en/component.json
@@ -67,7 +67,10 @@
"settingFixedRight": "Fixed Right",
"settingFullScreen": "Full Screen",
"index": "Index",
- "total": "total of {total}"
+ "total": "total of {total}",
+ "selectionBarTips": "{count} records selected.",
+ "selectionBarClear": "Clear",
+ "selectionBarEmpty": "No records selected."
},
"time": {
"before": " ago",
diff --git a/src/locales/lang/zh-CN/component.json b/src/locales/lang/zh-CN/component.json
index ddaf4881..952d99dd 100644
--- a/src/locales/lang/zh-CN/component.json
+++ b/src/locales/lang/zh-CN/component.json
@@ -67,7 +67,10 @@
"settingFixedRight": "固定到右侧",
"settingFullScreen": "全屏",
"index": "序号",
- "total": "共 {total} 条数据"
+ "total": "共 {total} 条数据",
+ "selectionBarTips": "已选择{count}条记录",
+ "selectionBarClear": "清空",
+ "selectionBarEmpty": "未选中任何记录"
},
"time": {
"before": "前",
diff --git a/src/views/demo/table/AuthColumn.vue b/src/views/demo/table/AuthColumn.vue
index f1cae38e..fd9080f4 100644
--- a/src/views/demo/table/AuthColumn.vue
+++ b/src/views/demo/table/AuthColumn.vue
@@ -137,6 +137,7 @@
dataIndex: 'action',
// slots: { customRender: 'action' },
},
+ showSelectionBar: true, // 显示多选状态栏
});
function handleEdit(record: Recordable) {
console.log('点击了编辑', record);
diff --git a/src/views/demo/table/FooterTable.vue b/src/views/demo/table/FooterTable.vue
index cc22620c..853b42fa 100644
--- a/src/views/demo/table/FooterTable.vue
+++ b/src/views/demo/table/FooterTable.vue
@@ -36,5 +36,6 @@
summaryFunc: handleSummary,
scroll: { x: 2000 },
canResize: false,
+ showSelectionBar: true, // 显示多选状态栏
});
diff --git a/src/views/demo/table/FormTable.vue b/src/views/demo/table/FormTable.vue
index 2300d867..57d1e5de 100644
--- a/src/views/demo/table/FormTable.vue
+++ b/src/views/demo/table/FormTable.vue
@@ -1,102 +1,18 @@
-
+
custom-slot
-
-
-
-
- 已选中{{ checkedRecords.length }}条记录(可跨页)
- 清空
-
-
- 未选中任何项目
-
-
-
-
获取表单数据
diff --git a/src/views/demo/table/UseTable.vue b/src/views/demo/table/UseTable.vue
index fb3756ec..51467aba 100644
--- a/src/views/demo/table/UseTable.vue
+++ b/src/views/demo/table/UseTable.vue
@@ -64,6 +64,7 @@
onColumnsChange: (data: ColumnChangeParam[]) => {
console.log('ColumnsChanged', data);
},
+ showSelectionBar: true, // 显示多选状态栏
});
function changeLoading() {