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:
		
							parent
							
								
									630c6f2d79
								
							
						
					
					
						commit
						bc5ecc9b5f
					
				@ -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) {
 | 
				
			||||||
 | 
				
			|||||||
@ -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>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
				
			|||||||
@ -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',
 | 
				
			||||||
 | 
				
			|||||||
@ -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,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user