mirror of
https://github.com/vbenjs/gf-vben-admin.git
synced 2025-01-24 04:10:20 +08:00
feat(table): 表格的数据列和操作列的字段可以根据权限和业务来控制是否显示
This commit is contained in:
parent
7c41c8673c
commit
5a3861b9cf
@ -37,6 +37,7 @@
|
|||||||
import { useTableContext } from '../hooks/useTableContext';
|
import { useTableContext } from '../hooks/useTableContext';
|
||||||
import { usePermission } from '/@/hooks/web/usePermission';
|
import { usePermission } from '/@/hooks/web/usePermission';
|
||||||
|
|
||||||
|
import { isBoolean, isFunction } from '/@/utils/is';
|
||||||
import { propTypes } from '/@/utils/propTypes';
|
import { propTypes } from '/@/utils/propTypes';
|
||||||
import { ACTION_COLUMN_FLAG } from '../const';
|
import { ACTION_COLUMN_FLAG } from '../const';
|
||||||
|
|
||||||
@ -63,10 +64,24 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { hasPermission } = usePermission();
|
const { hasPermission } = usePermission();
|
||||||
|
function isIfShow(action: ActionItem): boolean {
|
||||||
|
const ifShow = action.ifShow;
|
||||||
|
|
||||||
|
let isIfShow = true;
|
||||||
|
|
||||||
|
if (isBoolean(ifShow)) {
|
||||||
|
isIfShow = ifShow;
|
||||||
|
}
|
||||||
|
if (isFunction(ifShow)) {
|
||||||
|
isIfShow = ifShow(action);
|
||||||
|
}
|
||||||
|
return isIfShow;
|
||||||
|
}
|
||||||
|
|
||||||
const getActions = computed(() => {
|
const getActions = computed(() => {
|
||||||
return (toRaw(props.actions) || [])
|
return (toRaw(props.actions) || [])
|
||||||
.filter((action) => {
|
.filter((action) => {
|
||||||
return hasPermission(action.auth);
|
return hasPermission(action.auth) && isIfShow(action);
|
||||||
})
|
})
|
||||||
.map((action) => {
|
.map((action) => {
|
||||||
const { popConfirm } = action;
|
const { popConfirm } = action;
|
||||||
@ -85,7 +100,7 @@
|
|||||||
const getDropdownList = computed(() => {
|
const getDropdownList = computed(() => {
|
||||||
return (toRaw(props.dropDownActions) || [])
|
return (toRaw(props.dropDownActions) || [])
|
||||||
.filter((action) => {
|
.filter((action) => {
|
||||||
return hasPermission(action.auth);
|
return hasPermission(action.auth) && isIfShow(action);
|
||||||
})
|
})
|
||||||
.map((action, index) => {
|
.map((action, index) => {
|
||||||
const { label, popConfirm } = action;
|
const { label, popConfirm } = action;
|
||||||
|
@ -6,6 +6,7 @@ import { unref, Ref, computed, watch, ref, toRaw } from 'vue';
|
|||||||
|
|
||||||
import { renderEditCell } from '../components/editable';
|
import { renderEditCell } from '../components/editable';
|
||||||
|
|
||||||
|
import { usePermission } from '/@/hooks/web/usePermission';
|
||||||
import { useI18n } from '/@/hooks/web/useI18n';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||||||
|
|
||||||
import { isBoolean, isArray, isString, isObject, isFunction } from '/@/utils/is';
|
import { isBoolean, isArray, isString, isObject, isFunction } from '/@/utils/is';
|
||||||
@ -133,31 +134,50 @@ export function useColumns(
|
|||||||
return cloneColumns;
|
return cloneColumns;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function isIfShow(column: BasicColumn): boolean {
|
||||||
|
const ifShow = column.ifShow;
|
||||||
|
|
||||||
|
let isIfShow = true;
|
||||||
|
|
||||||
|
if (isBoolean(ifShow)) {
|
||||||
|
isIfShow = ifShow;
|
||||||
|
}
|
||||||
|
if (isFunction(ifShow)) {
|
||||||
|
isIfShow = ifShow(column);
|
||||||
|
}
|
||||||
|
return isIfShow;
|
||||||
|
}
|
||||||
|
const { hasPermission } = usePermission();
|
||||||
|
|
||||||
const getViewColumns = computed(() => {
|
const getViewColumns = computed(() => {
|
||||||
const viewColumns = sortFixedColumn(unref(getColumnsRef));
|
const viewColumns = sortFixedColumn(unref(getColumnsRef));
|
||||||
|
|
||||||
const columns = cloneDeep(viewColumns);
|
const columns = cloneDeep(viewColumns);
|
||||||
columns.forEach((column) => {
|
return columns
|
||||||
const { slots, dataIndex, customRender, format, edit, editRow, flag } = column;
|
.filter((column) => {
|
||||||
|
return hasPermission(column.auth) && isIfShow(column);
|
||||||
|
})
|
||||||
|
.map((column) => {
|
||||||
|
const { slots, dataIndex, customRender, format, edit, editRow, flag } = column;
|
||||||
|
|
||||||
if (!slots || !slots?.title) {
|
if (!slots || !slots?.title) {
|
||||||
column.slots = { title: `header-${dataIndex}`, ...(slots || {}) };
|
column.slots = { title: `header-${dataIndex}`, ...(slots || {}) };
|
||||||
column.customTitle = column.title;
|
column.customTitle = column.title;
|
||||||
Reflect.deleteProperty(column, 'title');
|
Reflect.deleteProperty(column, 'title');
|
||||||
}
|
}
|
||||||
const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!);
|
const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!);
|
||||||
if (!customRender && format && !edit && !isDefaultAction) {
|
if (!customRender && format && !edit && !isDefaultAction) {
|
||||||
column.customRender = ({ text, record, index }) => {
|
column.customRender = ({ text, record, index }) => {
|
||||||
return formatCell(text, format, record, index);
|
return formatCell(text, format, record, index);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// edit table
|
// edit table
|
||||||
if ((edit || editRow) && !isDefaultAction) {
|
if ((edit || editRow) && !isDefaultAction) {
|
||||||
column.customRender = renderEditCell(column);
|
column.customRender = renderEditCell(column);
|
||||||
}
|
}
|
||||||
});
|
return column;
|
||||||
return columns;
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
|
@ -8,6 +8,7 @@ import type {
|
|||||||
|
|
||||||
import { ComponentType } from './componentType';
|
import { ComponentType } from './componentType';
|
||||||
import { VueNode } from '/@/utils/propTypes';
|
import { VueNode } from '/@/utils/propTypes';
|
||||||
|
import { RoleEnum } from '/@/enums/roleEnum';
|
||||||
|
|
||||||
export declare type SortOrder = 'ascend' | 'descend';
|
export declare type SortOrder = 'ascend' | 'descend';
|
||||||
|
|
||||||
@ -421,4 +422,8 @@ export interface BasicColumn extends ColumnProps {
|
|||||||
editRule?: boolean | ((text: string, record: Recordable) => Promise<string>);
|
editRule?: boolean | ((text: string, record: Recordable) => Promise<string>);
|
||||||
editValueMap?: (value: any) => string;
|
editValueMap?: (value: any) => string;
|
||||||
onEditRow?: () => void;
|
onEditRow?: () => void;
|
||||||
|
// 权限编码控制是否显示
|
||||||
|
auth?: RoleEnum | RoleEnum[] | string | string[];
|
||||||
|
// 业务控制是否显示
|
||||||
|
ifShow?: boolean | ((column: BasicColumn) => boolean);
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,10 @@ export interface ActionItem extends ButtonProps {
|
|||||||
popConfirm?: PopConfirm;
|
popConfirm?: PopConfirm;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
divider?: boolean;
|
divider?: boolean;
|
||||||
// Permission code
|
// 权限编码控制是否显示
|
||||||
auth?: RoleEnum | RoleEnum[] | string | string[];
|
auth?: RoleEnum | RoleEnum[] | string | string[];
|
||||||
|
// 业务控制是否显示
|
||||||
|
ifShow?: boolean | ((action: ActionItem) => boolean);
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PopConfirm {
|
export interface PopConfirm {
|
||||||
|
Loading…
Reference in New Issue
Block a user