From 64b547108472c6caf1e2d303e24935c9d71ffeab Mon Sep 17 00:00:00 2001 From: katherinehhh Date: Wed, 20 Sep 2023 11:42:28 +0800 Subject: [PATCH] refactor: association block acl improve (#2682) --- packages/core/client/src/acl/ACLProvider.tsx | 7 +- .../association-field/InternalSubTable.tsx | 66 ++++++++++--------- .../schema-component/antd/table-v2/Table.tsx | 2 +- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/packages/core/client/src/acl/ACLProvider.tsx b/packages/core/client/src/acl/ACLProvider.tsx index 6c1410299..2baf50e38 100644 --- a/packages/core/client/src/acl/ACLProvider.tsx +++ b/packages/core/client/src/acl/ACLProvider.tsx @@ -5,7 +5,7 @@ import { Navigate } from 'react-router-dom'; import { useAPIClient, useRequest } from '../api-client'; import { useAppSpin } from '../application/hooks/useAppSpin'; import { useBlockRequestContext } from '../block-provider/BlockProvider'; -import { useCollection } from '../collection-manager'; +import { useCollection, useCollectionManager } from '../collection-manager'; import { useResourceActionContext } from '../collection-manager/ResourceActionProvider'; import { useRecord } from '../record-provider'; import { SchemaComponentOptions, useDesignable } from '../schema-component'; @@ -148,6 +148,7 @@ const useResourceName = () => { export function useACLRoleContext() { const { data, getActionAlias, inResources, getResourceActionParams, getStrategyActionParams } = useACLRolesCheck(); const allowedActions = useAllowedActions(); + const { getCollectionJoinField } = useCollectionManager(); const verifyScope = (actionName: string, recordPkValue: any) => { const actionAlias = getActionAlias(actionName); if (!Array.isArray(allowedActions?.[actionAlias])) { @@ -159,6 +160,7 @@ export function useACLRoleContext() { ...data, parseAction: (actionPath: string, options: any = {}) => { const [resourceName, actionName] = actionPath.split(':'); + const targetResource = resourceName?.includes('.') && getCollectionJoinField(resourceName)?.target; if (!getIgnoreScope(options)) { const r = verifyScope(actionName, options.recordPkValue); if (r !== null) { @@ -168,6 +170,9 @@ export function useACLRoleContext() { if (data?.allowAll) { return {}; } + if (inResources(targetResource)) { + return getResourceActionParams(`${targetResource}:${actionName}`); + } if (inResources(resourceName)) { return getResourceActionParams(actionPath); } diff --git a/packages/core/client/src/schema-component/antd/association-field/InternalSubTable.tsx b/packages/core/client/src/schema-component/antd/association-field/InternalSubTable.tsx index e33344910..5e827d609 100644 --- a/packages/core/client/src/schema-component/antd/association-field/InternalSubTable.tsx +++ b/packages/core/client/src/schema-component/antd/association-field/InternalSubTable.tsx @@ -6,6 +6,7 @@ import { CollectionProvider } from '../../../collection-manager'; import { useSchemaOptionsContext } from '../../../schema-component'; import Select from '../select/Select'; import { useAssociationFieldContext, useInsertSchema } from './hooks'; +import { ACLCollectionProvider, useACLActionParamsContext } from '../../../acl'; import schema from './schema'; export const InternalSubTable = observer( @@ -14,6 +15,7 @@ export const InternalSubTable = observer( const fieldSchema = useFieldSchema(); const insert = useInsertSchema('SubTable'); const { options } = useAssociationFieldContext(); + const { actionName } = useACLActionParamsContext(); useEffect(() => { insert(schema.SubTable); field.required = fieldSchema['required']; @@ -27,40 +29,42 @@ export const InternalSubTable = observer( }; return ( - + - - { - return s['x-component'] === 'AssociationField.SubTable'; + - - + > + { + return s['x-component'] === 'AssociationField.SubTable'; + }} + /> + + + ); }, diff --git a/packages/core/client/src/schema-component/antd/table-v2/Table.tsx b/packages/core/client/src/schema-component/antd/table-v2/Table.tsx index 9f5eb2806..c7dcc5bc1 100644 --- a/packages/core/client/src/schema-component/antd/table-v2/Table.tsx +++ b/packages/core/client/src/schema-component/antd/table-v2/Table.tsx @@ -37,7 +37,7 @@ const useTableColumns = (props) => { const { exists, render } = useSchemaInitializer(schema['x-initializer']); const columns = schema .reduceProperties((buf, s) => { - if (isColumnComponent(s) && schemaInWhitelist(Object.values(s.properties || {}).pop(), props?.isSubTable)) { + if (isColumnComponent(s) && schemaInWhitelist(Object.values(s.properties || {}).pop())) { return buf.concat([s]); } return buf;