Commit 5a3861b9cfc79da3297f8ddd045b88f0daca0ada
1 parent
7c41c867
feat(table): 表格的数据列和操作列的字段可以根据权限和业务来控制是否显示
Showing
4 changed files
with
65 additions
and
23 deletions
src/components/Table/src/components/TableAction.vue
@@ -37,6 +37,7 @@ | @@ -37,6 +37,7 @@ | ||
37 | import { useTableContext } from '../hooks/useTableContext'; | 37 | import { useTableContext } from '../hooks/useTableContext'; |
38 | import { usePermission } from '/@/hooks/web/usePermission'; | 38 | import { usePermission } from '/@/hooks/web/usePermission'; |
39 | 39 | ||
40 | + import { isBoolean, isFunction } from '/@/utils/is'; | ||
40 | import { propTypes } from '/@/utils/propTypes'; | 41 | import { propTypes } from '/@/utils/propTypes'; |
41 | import { ACTION_COLUMN_FLAG } from '../const'; | 42 | import { ACTION_COLUMN_FLAG } from '../const'; |
42 | 43 | ||
@@ -63,10 +64,24 @@ | @@ -63,10 +64,24 @@ | ||
63 | } | 64 | } |
64 | 65 | ||
65 | const { hasPermission } = usePermission(); | 66 | const { hasPermission } = usePermission(); |
67 | + function isIfShow(action: ActionItem): boolean { | ||
68 | + const ifShow = action.ifShow; | ||
69 | + | ||
70 | + let isIfShow = true; | ||
71 | + | ||
72 | + if (isBoolean(ifShow)) { | ||
73 | + isIfShow = ifShow; | ||
74 | + } | ||
75 | + if (isFunction(ifShow)) { | ||
76 | + isIfShow = ifShow(action); | ||
77 | + } | ||
78 | + return isIfShow; | ||
79 | + } | ||
80 | + | ||
66 | const getActions = computed(() => { | 81 | const getActions = computed(() => { |
67 | return (toRaw(props.actions) || []) | 82 | return (toRaw(props.actions) || []) |
68 | .filter((action) => { | 83 | .filter((action) => { |
69 | - return hasPermission(action.auth); | 84 | + return hasPermission(action.auth) && isIfShow(action); |
70 | }) | 85 | }) |
71 | .map((action) => { | 86 | .map((action) => { |
72 | const { popConfirm } = action; | 87 | const { popConfirm } = action; |
@@ -85,7 +100,7 @@ | @@ -85,7 +100,7 @@ | ||
85 | const getDropdownList = computed(() => { | 100 | const getDropdownList = computed(() => { |
86 | return (toRaw(props.dropDownActions) || []) | 101 | return (toRaw(props.dropDownActions) || []) |
87 | .filter((action) => { | 102 | .filter((action) => { |
88 | - return hasPermission(action.auth); | 103 | + return hasPermission(action.auth) && isIfShow(action); |
89 | }) | 104 | }) |
90 | .map((action, index) => { | 105 | .map((action, index) => { |
91 | const { label, popConfirm } = action; | 106 | const { label, popConfirm } = action; |
src/components/Table/src/hooks/useColumns.ts
@@ -6,6 +6,7 @@ import { unref, Ref, computed, watch, ref, toRaw } from 'vue'; | @@ -6,6 +6,7 @@ import { unref, Ref, computed, watch, ref, toRaw } from 'vue'; | ||
6 | 6 | ||
7 | import { renderEditCell } from '../components/editable'; | 7 | import { renderEditCell } from '../components/editable'; |
8 | 8 | ||
9 | +import { usePermission } from '/@/hooks/web/usePermission'; | ||
9 | import { useI18n } from '/@/hooks/web/useI18n'; | 10 | import { useI18n } from '/@/hooks/web/useI18n'; |
10 | 11 | ||
11 | import { isBoolean, isArray, isString, isObject, isFunction } from '/@/utils/is'; | 12 | import { isBoolean, isArray, isString, isObject, isFunction } from '/@/utils/is'; |
@@ -133,31 +134,50 @@ export function useColumns( | @@ -133,31 +134,50 @@ export function useColumns( | ||
133 | return cloneColumns; | 134 | return cloneColumns; |
134 | }); | 135 | }); |
135 | 136 | ||
137 | + function isIfShow(column: BasicColumn): boolean { | ||
138 | + const ifShow = column.ifShow; | ||
139 | + | ||
140 | + let isIfShow = true; | ||
141 | + | ||
142 | + if (isBoolean(ifShow)) { | ||
143 | + isIfShow = ifShow; | ||
144 | + } | ||
145 | + if (isFunction(ifShow)) { | ||
146 | + isIfShow = ifShow(column); | ||
147 | + } | ||
148 | + return isIfShow; | ||
149 | + } | ||
150 | + const { hasPermission } = usePermission(); | ||
151 | + | ||
136 | const getViewColumns = computed(() => { | 152 | const getViewColumns = computed(() => { |
137 | const viewColumns = sortFixedColumn(unref(getColumnsRef)); | 153 | const viewColumns = sortFixedColumn(unref(getColumnsRef)); |
138 | 154 | ||
139 | const columns = cloneDeep(viewColumns); | 155 | const columns = cloneDeep(viewColumns); |
140 | - columns.forEach((column) => { | ||
141 | - const { slots, dataIndex, customRender, format, edit, editRow, flag } = column; | ||
142 | - | ||
143 | - if (!slots || !slots?.title) { | ||
144 | - column.slots = { title: `header-${dataIndex}`, ...(slots || {}) }; | ||
145 | - column.customTitle = column.title; | ||
146 | - Reflect.deleteProperty(column, 'title'); | ||
147 | - } | ||
148 | - const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!); | ||
149 | - if (!customRender && format && !edit && !isDefaultAction) { | ||
150 | - column.customRender = ({ text, record, index }) => { | ||
151 | - return formatCell(text, format, record, index); | ||
152 | - }; | ||
153 | - } | 156 | + return columns |
157 | + .filter((column) => { | ||
158 | + return hasPermission(column.auth) && isIfShow(column); | ||
159 | + }) | ||
160 | + .map((column) => { | ||
161 | + const { slots, dataIndex, customRender, format, edit, editRow, flag } = column; | ||
162 | + | ||
163 | + if (!slots || !slots?.title) { | ||
164 | + column.slots = { title: `header-${dataIndex}`, ...(slots || {}) }; | ||
165 | + column.customTitle = column.title; | ||
166 | + Reflect.deleteProperty(column, 'title'); | ||
167 | + } | ||
168 | + const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!); | ||
169 | + if (!customRender && format && !edit && !isDefaultAction) { | ||
170 | + column.customRender = ({ text, record, index }) => { | ||
171 | + return formatCell(text, format, record, index); | ||
172 | + }; | ||
173 | + } | ||
154 | 174 | ||
155 | - // edit table | ||
156 | - if ((edit || editRow) && !isDefaultAction) { | ||
157 | - column.customRender = renderEditCell(column); | ||
158 | - } | ||
159 | - }); | ||
160 | - return columns; | 175 | + // edit table |
176 | + if ((edit || editRow) && !isDefaultAction) { | ||
177 | + column.customRender = renderEditCell(column); | ||
178 | + } | ||
179 | + return column; | ||
180 | + }); | ||
161 | }); | 181 | }); |
162 | 182 | ||
163 | watch( | 183 | watch( |
src/components/Table/src/types/table.ts
@@ -8,6 +8,7 @@ import type { | @@ -8,6 +8,7 @@ import type { | ||
8 | 8 | ||
9 | import { ComponentType } from './componentType'; | 9 | import { ComponentType } from './componentType'; |
10 | import { VueNode } from '/@/utils/propTypes'; | 10 | import { VueNode } from '/@/utils/propTypes'; |
11 | +import { RoleEnum } from '/@/enums/roleEnum'; | ||
11 | 12 | ||
12 | export declare type SortOrder = 'ascend' | 'descend'; | 13 | export declare type SortOrder = 'ascend' | 'descend'; |
13 | 14 | ||
@@ -421,4 +422,8 @@ export interface BasicColumn extends ColumnProps { | @@ -421,4 +422,8 @@ export interface BasicColumn extends ColumnProps { | ||
421 | editRule?: boolean | ((text: string, record: Recordable) => Promise<string>); | 422 | editRule?: boolean | ((text: string, record: Recordable) => Promise<string>); |
422 | editValueMap?: (value: any) => string; | 423 | editValueMap?: (value: any) => string; |
423 | onEditRow?: () => void; | 424 | onEditRow?: () => void; |
425 | + // 权限编码控制是否显示 | ||
426 | + auth?: RoleEnum | RoleEnum[] | string | string[]; | ||
427 | + // 业务控制是否显示 | ||
428 | + ifShow?: boolean | ((column: BasicColumn) => boolean); | ||
424 | } | 429 | } |
src/components/Table/src/types/tableAction.ts
@@ -8,8 +8,10 @@ export interface ActionItem extends ButtonProps { | @@ -8,8 +8,10 @@ export interface ActionItem extends ButtonProps { | ||
8 | popConfirm?: PopConfirm; | 8 | popConfirm?: PopConfirm; |
9 | disabled?: boolean; | 9 | disabled?: boolean; |
10 | divider?: boolean; | 10 | divider?: boolean; |
11 | - // Permission code | 11 | + // 权限编码控制是否显示 |
12 | auth?: RoleEnum | RoleEnum[] | string | string[]; | 12 | auth?: RoleEnum | RoleEnum[] | string | string[]; |
13 | + // 业务控制是否显示 | ||
14 | + ifShow?: boolean | ((action: ActionItem) => boolean); | ||
13 | } | 15 | } |
14 | 16 | ||
15 | export interface PopConfirm { | 17 | export interface PopConfirm { |