diff --git a/packages/acl/src/acl-available-action.ts b/packages/acl/src/acl-available-action.ts index 2bb4667a3..1c697f6ba 100644 --- a/packages/acl/src/acl-available-action.ts +++ b/packages/acl/src/acl-available-action.ts @@ -3,6 +3,8 @@ export interface AvailableActionOptions { type: 'new-data' | 'old-data'; displayName?: string; resource?: string; + onNewRecord?: boolean; + allowConfigureFields?: boolean; } export class AclAvailableAction { diff --git a/packages/client/src/acl/Configuration/RoleConfigure.tsx b/packages/client/src/acl/Configuration/RoleConfigure.tsx index e57359c2f..4485c35bd 100644 --- a/packages/client/src/acl/Configuration/RoleConfigure.tsx +++ b/packages/client/src/acl/Configuration/RoleConfigure.tsx @@ -47,7 +47,7 @@ export const RoleConfigure = () => { 'x-component': 'Checkbox', 'x-content': '允许配置系统,包括界面配置、数据表配置、权限配置、系统配置等全部配置项', }, - strategy: { + 'strategy.actions': { title: '通用数据操作权限', description: '所有数据表都默认使用通用数据操作权限;同时,可以针对每个数据表单独配置权限。', 'x-component': 'StrategyActions', diff --git a/packages/client/src/acl/Configuration/RolesResourcesActions.tsx b/packages/client/src/acl/Configuration/RolesResourcesActions.tsx index 25661ba09..6016538b8 100644 --- a/packages/client/src/acl/Configuration/RolesResourcesActions.tsx +++ b/packages/client/src/acl/Configuration/RolesResourcesActions.tsx @@ -1,15 +1,62 @@ import { FormItem, FormLayout } from '@formily/antd'; -import { Checkbox, Select, Table } from 'antd'; +import { ArrayField } from '@formily/core'; +import { connect, useField, useForm } from '@formily/react'; +import { Checkbox, Select, Table, Tag } from 'antd'; import React from 'react'; +import { useTranslation } from 'react-i18next'; import { useAvailableActions } from '.'; import { useCollectionManager, useCompile, useRecord } from '../..'; -export const RolesResourcesActions = () => { +const toActionMap = (arr: any[]) => { + const obj = {}; + arr?.forEach((action) => { + obj[action.name] = action; + }); + return obj; +}; + +export const RolesResourcesActions = connect((props) => { + const { onChange } = props; + const form = useForm(); const roleCollection = useRecord(); const availableActions = useAvailableActions(); const { getCollection } = useCollectionManager(); const collection = getCollection(roleCollection.name); const compile = useCompile(); + const { t } = useTranslation(); + const field = useField(); + const actionMap: any = toActionMap(field.value || []); + const inAction = (actionName, fieldName) => { + const action = actionMap?.[actionName]; + if (!action) { + return false; + } + return action?.fields?.includes(fieldName); + }; + const availableActionsWithFields = availableActions.filter((action) => action.allowConfigureFields); + const fieldPermissions = collection?.fields?.map((field) => { + const permission = { ...field }; + for (const action of availableActionsWithFields) { + permission[action.name] = inAction(action.name, field.name); + } + return permission; + }); + const toggleAction = (actionName: string) => { + if (actionMap[actionName]) { + delete actionMap[actionName]; + } else { + actionMap[actionName] = { + name: actionName, + fields: collection?.fields?.map?.((item) => item.name), + }; + } + onChange(Object.values(actionMap)); + }; + const allChecked = {}; + for (const action of availableActionsWithFields) { + allChecked[action.name] = collection?.fields?.length === actionMap?.[action.name]?.fields?.length; + } + return (
@@ -24,13 +71,26 @@ export const RolesResourcesActions = () => { render: (value) => compile(value), }, { - dataIndex: 'type', + dataIndex: 'onNewRecord', title: '类型', + render: (onNewRecord) => + onNewRecord ? ( + {t('Operate on new record')} + ) : ( + {t('Operate on existing record')} + ), }, { - dataIndex: 'enable', + dataIndex: 'enabled', title: '允许操作', - render: () => , + render: (enabled, action) => ( + { + toggleAction(action.name); + }} + /> + ), }, { dataIndex: 'scope', @@ -38,36 +98,81 @@ export const RolesResourcesActions = () => { render: () => , + render: (scope, action) => + !action.onNewRecord && ( +