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 @@ 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() {