diff --git a/bcs-services/bcs-bscp/ui/src/components/across-check.vue b/bcs-services/bcs-bscp/ui/src/components/across-check.vue new file mode 100644 index 0000000000..f7c4bc165e --- /dev/null +++ b/bcs-services/bcs-bscp/ui/src/components/across-check.vue @@ -0,0 +1,172 @@ + + + diff --git a/bcs-services/bcs-bscp/ui/src/components/across-checkbox.vue b/bcs-services/bcs-bscp/ui/src/components/across-checkbox.vue new file mode 100644 index 0000000000..80628654de --- /dev/null +++ b/bcs-services/bcs-bscp/ui/src/components/across-checkbox.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/bcs-services/bcs-bscp/ui/src/i18n/en-us.ts b/bcs-services/bcs-bscp/ui/src/i18n/en-us.ts index 3c7da82f42..11052376d7 100644 --- a/bcs-services/bcs-bscp/ui/src/i18n/en-us.ts +++ b/bcs-services/bcs-bscp/ui/src/i18n/en-us.ts @@ -944,4 +944,10 @@ export default { '组件类型 / 版本分布': 'Component type / Version distribution', 下钻: 'Drill down', 总和: 'Total', + + // 跨页全选 + 跨页全选: 'AcrossChecked', + 已选择: 'Selected', + 选择所有: 'Choose all', + 取消选择所有数据: 'Cancel all data' }; diff --git a/bcs-services/bcs-bscp/ui/src/i18n/zh-cn.ts b/bcs-services/bcs-bscp/ui/src/i18n/zh-cn.ts index c347202302..767b95c146 100644 --- a/bcs-services/bcs-bscp/ui/src/i18n/zh-cn.ts +++ b/bcs-services/bcs-bscp/ui/src/i18n/zh-cn.ts @@ -951,4 +951,10 @@ export default { '组件类型 / 版本分布': '组件类型 / 版本分布', 下钻: '下钻', 总和: '总和', + + // 跨页全选 + 跨页全选: '跨页全选', + 已选择: '已选择', + 选择所有:'选择所有', + 取消选择所有数据: '取消选择所有数据' }; diff --git a/bcs-services/bcs-bscp/ui/src/utils/hooks/use-table-across-check.ts b/bcs-services/bcs-bscp/ui/src/utils/hooks/use-table-across-check.ts new file mode 100644 index 0000000000..f37c83420f --- /dev/null +++ b/bcs-services/bcs-bscp/ui/src/utils/hooks/use-table-across-check.ts @@ -0,0 +1,98 @@ +import { h, Ref, ref } from 'vue'; +import AcrossCheck from '../../components/across-check.vue'; +import CheckType from '../../../types/across-checked'; + +export interface IAcrossCheckConfig { + tableData: Ref; + curPageData: Ref; + rowKey?: string[]; + arrowShow?: Ref; +} +// 表格跨页全选功能 +export default function useTableAcrossCheck({ + tableData, + curPageData, + rowKey = ['name', 'id'], + arrowShow, +}: IAcrossCheckConfig) { + const selectType = ref(CheckType.Uncheck); + const selections = ref([]); + const renderSelection = () => { + return h(AcrossCheck, { + value: selectType.value, + disabled: !tableData.value.length, + arrowShow: !arrowShow?.value, + onChange: handleSelectTypeChange, + }); + }; + // 表头全选事件 + const handleSelectTypeChange = (value: number) => { + switch (value) { + case CheckType.Uncheck: + handleClearSelection(); + break; + case CheckType.Checked: + handleSelectCurrentPage(); + break; + case CheckType.AcrossChecked: + handleSelectionAll(); + break; + } + }; + // 当前页全选 + const handleSelectCurrentPage = () => { + selectType.value = CheckType.Checked; + selections.value = [...curPageData.value]; + }; + // 跨页全选 + const handleSelectionAll = () => { + selectType.value = CheckType.AcrossChecked; + selections.value = [...tableData.value]; + }; + // 清空全选 + const handleClearSelection = () => { + selectType.value = CheckType.Uncheck; + selections.value = []; + }; + // 表格行勾选后重置状态 + const handleSetSelectType = () => { + if (selections.value.length === 0) { + selectType.value = CheckType.Uncheck; + } else if ( + selections.value.length < curPageData.value.length && + [CheckType.Checked, CheckType.Uncheck].includes(selectType.value) + ) { + // 从当前页全选 -> 当前页半选 + selectType.value = CheckType.HalfChecked; + } else if ( + selections.value.length === curPageData.value.length && + selectType.value !== CheckType.HalfAcrossChecked + ) { + selectType.value = CheckType.Checked; + } else if (selections.value.length < tableData.value.length && selectType.value === CheckType.AcrossChecked) { + // 从跨页全选 -> 跨页半选 + selectType.value = CheckType.HalfAcrossChecked; + } else if (selections.value.length === tableData.value.length) { + selectType.value = CheckType.AcrossChecked; + } + }; + // 当前行选中事件 + const handleRowCheckChange = (value: boolean, row: any) => { + const index = selections.value.findIndex((item) => rowKey.every((key) => item[key] === row[key])); + if (value && index === -1) { + selections.value.push(row); + } else if (!value && index > -1) { + selections.value.splice(index, 1); + } + handleSetSelectType(); + }; + + return { + selectType, // 选择状态 + selections, // 选中的数据 + renderSelection, // 渲染全选框组件 + handleRowCheckChange, // 行的全选框操作 + handleSelectionAll, // 全选操作 + handleClearSelection, // 清空全选 + }; +} diff --git a/bcs-services/bcs-bscp/ui/src/views/space/groups/index.vue b/bcs-services/bcs-bscp/ui/src/views/space/groups/index.vue index af49919ae7..971c1b299b 100644 --- a/bcs-services/bcs-bscp/ui/src/views/space/groups/index.vue +++ b/bcs-services/bcs-bscp/ui/src/views/space/groups/index.vue @@ -38,15 +38,38 @@
- - + + + + +