From 038dda896763ff47aa561ca878ca329bf8a8f10d Mon Sep 17 00:00:00 2001 From: PangSanJin <1160840143@qq.com> Date: Fri, 1 Mar 2024 20:11:21 +0800 Subject: [PATCH] feat(components): add tablesearch component, reduce page build --- src/components/advanced/table-search.vue | 71 ++++++++++++++++++++++++ src/hooks/common/table.ts | 14 ++++- src/typings/components.d.ts | 1 + src/utils/selectTypes.ts | 18 ++++++ src/views/manage/role/index.vue | 18 +++++- src/views/manage/user/index.vue | 41 +++++++++++++- 6 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 src/components/advanced/table-search.vue create mode 100644 src/utils/selectTypes.ts diff --git a/src/components/advanced/table-search.vue b/src/components/advanced/table-search.vue new file mode 100644 index 00000000..e7102b53 --- /dev/null +++ b/src/components/advanced/table-search.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/hooks/common/table.ts b/src/hooks/common/table.ts index de9e1738..a42dc13a 100644 --- a/src/hooks/common/table.ts +++ b/src/hooks/common/table.ts @@ -10,6 +10,13 @@ type BaseData = Record; type ApiFn = (args: any) => Promise; +type ParamType = { + label: string; + model: string; + placeholder: string; + options?: Record; +}; + export type TableColumn = | (Omit, 'key'> & { key: keyof T | CustomColumnKey }) | (Omit, 'key'> & { key: keyof T | CustomColumnKey }) @@ -34,6 +41,8 @@ export type TableConfig[0]; + /** params rule */ + paramsRule?: ParamType[]; /** transform api response to table data */ transformer: Transformer>>; /** pagination */ @@ -70,10 +79,12 @@ export function useTable[0]> = reactive({ ...apiParams }); + const rule = ref({ ...paramsRule }); + const { columns, filteredColumns, reloadColumns } = useTableColumn(config.columns); const data: Ref = ref([]); @@ -172,6 +183,7 @@ export function useTable, selected: boolean) => VNodeChild) +> = { + value?: V; + label?: L; + class?: string; + style?: string | CSSProperties; + disabled?: boolean; + render?: (info: { node: VNode; option: UpdatedSelectBaseOption; selected: boolean }) => VNodeChild; + [k: string]: unknown; +}; + +type UpdatedSelectMixedOption = UpdatedSelectBaseOption | SelectGroupOption | any; +export type SelectMixedOption = UpdatedSelectMixedOption; diff --git a/src/views/manage/role/index.vue b/src/views/manage/role/index.vue index 8ab1b427..2e86047d 100644 --- a/src/views/manage/role/index.vue +++ b/src/views/manage/role/index.vue @@ -7,8 +7,8 @@ import { useAppStore } from '@/store/modules/app'; import { useTable } from '@/hooks/common/table'; import { $t } from '@/locales'; import { enableStatusRecord } from '@/constants/business'; +import TableSearch from '@/components/advanced/table-search.vue'; import RoleOperateDrawer, { type OperateType } from './modules/role-operate-drawer.vue'; -import RoleSearch from './modules/role-search.vue'; const appStore = useAppStore(); const { bool: drawerVisible, setTrue: openDrawer } = useBoolean(); @@ -21,6 +21,7 @@ const { pagination, getData, searchParams, + rule, updateSearchParams, resetSearchParams } = useTable({ @@ -34,6 +35,19 @@ const { roleName: null, roleCode: null }, + paramsRule: [ + { label: 'page.manage.role.roleName', model: 'roleName', placeholder: 'page.manage.role.form.roleName' }, + { label: 'page.manage.role.roleCode', model: 'roleCode', placeholder: 'page.manage.role.form.roleCode' }, + { + label: 'page.manage.role.roleStatus', + model: 'status', + placeholder: 'page.manage.role.form.roleStatus', + options: { + '1': 'page.manage.common.status.enable', + '2': 'page.manage.common.status.disable' + } + } + ], transformer: res => { const { records = [], current = 1, size = 10, total = 0 } = res.data || {}; @@ -175,7 +189,7 @@ function getIndex(index: number) {