fix(acl): association field acl check error (#2675)

* fix: association field acl check

* fix: association field acl check

* fix: import action form field acl check error
This commit is contained in:
katherinehhh 2023-09-19 17:26:29 +08:00 committed by GitHub
parent 630c6f2d79
commit bc5ecc9b5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 49 additions and 36 deletions

View File

@ -182,7 +182,7 @@ export const ACLCollectionProvider = (props) => {
if (allowAll) { if (allowAll) {
return props.children; return props.children;
} }
const actionPath = schema?.['x-acl-action']; const actionPath = schema?.['x-acl-action'] || props.actionPath;
if (!actionPath) { if (!actionPath) {
return props.children; return props.children;
} }
@ -190,6 +190,8 @@ export const ACLCollectionProvider = (props) => {
if (!params) { if (!params) {
return null; return null;
} }
const [_, actionName] = actionPath.split(':');
params.actionName = actionName;
return <ACLActionParamsContext.Provider value={params}>{props.children}</ACLActionParamsContext.Provider>; return <ACLActionParamsContext.Provider value={params}>{props.children}</ACLActionParamsContext.Provider>;
}; };
@ -258,7 +260,8 @@ export const ACLCollectionFieldProvider = (props) => {
const field = useField<Field>(); const field = useField<Field>();
const { allowAll } = useACLRoleContext(); const { allowAll } = useACLRoleContext();
const { whitelist } = useACLFieldWhitelist(); const { whitelist } = useACLFieldWhitelist();
const allowed = whitelist.length > 0 ? whitelist.includes(fieldSchema.name) : true; const [name] = (fieldSchema.name as string).split('.');
const allowed = whitelist.length > 0 ? whitelist.includes(name) : true;
useEffect(() => { useEffect(() => {
if (!allowed) { if (!allowed) {

View File

@ -4,6 +4,7 @@ import { RecursionField, useField, useFieldSchema, observer } from '@formily/rea
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import { CollectionProvider } from '../../../collection-manager'; import { CollectionProvider } from '../../../collection-manager';
import { useAssociationFieldContext, useInsertSchema } from './hooks'; import { useAssociationFieldContext, useInsertSchema } from './hooks';
import { ACLCollectionProvider, useACLActionParamsContext } from '../../../acl';
import schema from './schema'; import schema from './schema';
export const InternalNester = observer( export const InternalNester = observer(
@ -13,47 +14,50 @@ export const InternalNester = observer(
const insertNester = useInsertSchema('Nester'); const insertNester = useInsertSchema('Nester');
const { options: collectionField } = useAssociationFieldContext(); const { options: collectionField } = useAssociationFieldContext();
const showTitle = fieldSchema['x-decorator-props']?.showTitle ?? true; const showTitle = fieldSchema['x-decorator-props']?.showTitle ?? true;
const { actionName } = useACLActionParamsContext();
useEffect(() => { useEffect(() => {
insertNester(schema.Nester); insertNester(schema.Nester);
}, []); }, []);
return ( return (
<CollectionProvider name={collectionField.target}> <CollectionProvider name={collectionField.target}>
<FormLayout layout={'vertical'}> <ACLCollectionProvider actionPath={`${collectionField.target}:${actionName}`}>
<div <FormLayout layout={'vertical'}>
className={cx( <div
css` className={cx(
& .ant-formily-item-layout-vertical { css`
margin-bottom: 10px; & .ant-formily-item-layout-vertical {
} margin-bottom: 10px;
.ant-card-body { }
padding: 15px 20px 5px;
}
.ant-divider-horizontal {
margin: 10px 0;
}
`,
{
[css`
.ant-card-body { .ant-card-body {
padding: 0px 20px 20px 0px; padding: 15px 20px 5px;
} }
> .ant-card-bordered { .ant-divider-horizontal {
border: none; margin: 10px 0;
} }
`]: showTitle === false, `,
}, {
)} [css`
> .ant-card-body {
<RecursionField padding: 0px 20px 20px 0px;
onlyRenderProperties }
basePath={field.address} > .ant-card-bordered {
schema={fieldSchema} border: none;
filterProperties={(s) => { }
return s['x-component'] === 'AssociationField.Nester'; `]: showTitle === false,
}} },
/> )}
</div> >
</FormLayout> <RecursionField
onlyRenderProperties
basePath={field.address}
schema={fieldSchema}
filterProperties={(s) => {
return s['x-component'] === 'AssociationField.Nester';
}}
/>
</div>
</FormLayout>
</ACLCollectionProvider>
</CollectionProvider> </CollectionProvider>
); );
}, },

View File

@ -77,6 +77,11 @@ export const ImportActionInitializer = (props) => {
formLayout: { formLayout: {
type: 'void', type: 'void',
'x-component': 'FormLayout', 'x-component': 'FormLayout',
'x-component-props': {
labelCol: 6,
wrapperCol: 10,
layout: 'vertical',
},
properties: { properties: {
download: { download: {
type: 'void', type: 'void',

View File

@ -1,6 +1,7 @@
import { SchemaComponentOptions } from '@nocobase/client'; import { SchemaComponentOptions } from '@nocobase/client';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { createPortal } from 'react-dom'; import { createPortal } from 'react-dom';
import { FormLayout, FormItem } from '@formily/antd-v5';
import { ImportActionInitializer, ImportDesigner, ImportInitializerProvider } from '.'; import { ImportActionInitializer, ImportDesigner, ImportInitializerProvider } from '.';
import { ImportContext } from './context'; import { ImportContext } from './context';
import { ImportModal, ImportStatus } from './ImportModal'; import { ImportModal, ImportStatus } from './ImportModal';
@ -11,7 +12,7 @@ export const ImportPluginProvider = (props: any) => {
const { uploadValidator, beforeUploadHandler, validateUpload } = useShared(); const { uploadValidator, beforeUploadHandler, validateUpload } = useShared();
return ( return (
<SchemaComponentOptions <SchemaComponentOptions
components={{ ImportActionInitializer, ImportDesigner }} components={{ ImportActionInitializer, ImportDesigner, FormLayout, FormItem }}
scope={{ scope={{
uploadValidator, uploadValidator,
validateUpload, validateUpload,