fix: data-block dataSource

This commit is contained in:
dream2023 2024-01-23 10:13:56 +08:00
parent 3da6bdc659
commit 819b38fe28
10 changed files with 74 additions and 40 deletions

View File

@ -10,8 +10,7 @@ import { useCollection, useCollectionManager } from '../collection-manager';
import { useResourceActionContext } from '../collection-manager/ResourceActionProvider';
import { useRecord } from '../record-provider';
import { SchemaComponentOptions, useDesignable } from '../schema-component';
import { useApp } from '../application';
import { useDataSourceName } from '../block-provider/BlockProvider';
import { useApp, useCollectionDataSourceName } from '../application';
export const ACLContext = createContext<any>({});
@ -93,7 +92,7 @@ export const ACLActionParamsContext = createContext<any>({});
export const useACLRolesCheck = () => {
const ctx = useContext(ACLContext);
const dataSourceName = useDataSourceName();
const dataSourceName = useCollectionDataSourceName();
const { dataSources: dataSourcesAcl } = ctx?.data?.meta || {};
const data = { ...ctx?.data?.data, ...omit(dataSourcesAcl?.[dataSourceName], 'snippets') };
const getActionAlias = (actionPath: string) => {

View File

@ -60,7 +60,7 @@ interface DataSource {
[key: string]: any;
}
type DataSourceName = string;
type DataSourceNameType = string;
export interface CollectionManagerOptionsV2 {
collections?: CollectionOptionsV2[];
@ -76,11 +76,11 @@ type ReloadCallback = (collections: CollectionOptionsV2[]) => void;
export class CollectionManagerV2 {
public app: Application;
protected collections: Record<string, Record<DataSourceName, CollectionV2>> = {};
protected collections: Record<string, Record<DataSourceNameType, CollectionV2>> = {};
protected collectionTemplateInstances: Record<string, CollectionTemplateBase> = {};
protected fieldInterfaceInstances: Record<string, CollectionFieldInterfaceBase> = {};
protected collectionMixins: CollectionMixinConstructor[] = [];
protected dataSourceMap: Record<DataSourceName, Omit<DataSource, 'collections'>> = {};
protected dataSourceMap: Record<DataSourceNameType, Omit<DataSource, 'collections'>> = {};
protected collectionFieldGroups: Record<string, { label: string; order?: number }> = {};
protected mainDataSourceFn: MainDataSOurceFn;
protected thirdDataSourceFn: ThirdDataResourceFn;

View File

@ -0,0 +1,15 @@
import React, { FC, ReactNode, createContext, useContext } from 'react';
export const CollectionDataSourceName = createContext<string>(undefined);
CollectionDataSourceName.displayName = 'CollectionDataSourceName';
export const CollectionDataSourceProvider: FC<{ dataSource: string; children: ReactNode }> = ({
dataSource,
children,
}) => {
return <CollectionDataSourceName.Provider value={dataSource}>{children}</CollectionDataSourceName.Provider>;
};
export const useCollectionDataSourceName = () => {
return useContext(CollectionDataSourceName);
};

View File

@ -6,10 +6,12 @@ import { withDynamicSchemaProps } from '../hoc';
import { DataBlockResourceProviderV2 } from './DataBlockResourceProvider';
import { AssociationProviderV2, CollectionProviderV2, RecordV2 } from '../collection';
import { UseRequestOptions, UseRequestService } from '../../api-client';
import { CollectionDataSourceProvider } from './CollectionDataSourceProvider';
export interface AllDataBlockProps {
collection: string;
association: string;
dataSource?: string;
sourceId: string | number;
filterByTk: string | number;
record: RecordV2;
@ -21,26 +23,39 @@ export interface AllDataBlockProps {
[index: string]: any;
}
type CollectionCreate = Pick<AllDataBlockProps, 'collection'>;
type CollectionCreate = Pick<AllDataBlockProps, 'collection' | 'dataSource'>;
interface CollectionGet
extends Pick<AllDataBlockProps, 'collection' | 'filterByTk' | 'params' | 'requestService' | 'requestOptions'> {
extends Pick<
AllDataBlockProps,
'collection' | 'dataSource' | 'filterByTk' | 'params' | 'requestService' | 'requestOptions'
> {
action: 'get';
}
interface CollectionList
extends Pick<AllDataBlockProps, 'collection' | 'params' | 'requestService' | 'requestOptions'> {
extends Pick<AllDataBlockProps, 'collection' | 'dataSource' | 'params' | 'requestService' | 'requestOptions'> {
action: 'list';
}
type CollectionRecord = Pick<AllDataBlockProps, 'collection' | 'record' | 'requestService' | 'requestOptions'>;
type CollectionRecord = Pick<
AllDataBlockProps,
'collection' | 'dataSource' | 'record' | 'requestService' | 'requestOptions'
>;
type AssociationCreate = Pick<AllDataBlockProps, 'association' | 'sourceId' | 'parentRecord'>;
type AssociationCreate = Pick<AllDataBlockProps, 'association' | 'dataSource' | 'sourceId' | 'parentRecord'>;
interface AssociationGet
extends Pick<
AllDataBlockProps,
'association' | 'sourceId' | 'parentRecord' | 'filterByTk' | 'params' | 'requestService' | 'requestOptions'
| 'association'
| 'dataSource'
| 'sourceId'
| 'parentRecord'
| 'filterByTk'
| 'params'
| 'requestService'
| 'requestOptions'
> {
action: 'get';
}
@ -48,14 +63,14 @@ interface AssociationGet
interface AssociationList
extends Pick<
AllDataBlockProps,
'association' | 'sourceId' | 'parentRecord' | 'params' | 'requestService' | 'requestOptions'
'association' | 'dataSource' | 'sourceId' | 'parentRecord' | 'params' | 'requestService' | 'requestOptions'
> {
action: 'list';
}
type AssociationRecord = Pick<
AllDataBlockProps,
'association' | 'record' | 'parentRecord' | 'requestService' | 'requestOptions'
'association' | 'dataSource' | 'record' | 'parentRecord' | 'requestService' | 'requestOptions'
>;
type AllDataBlockType = {
@ -73,7 +88,7 @@ export type DataBlockProviderProps = AllDataBlockType[keyof AllDataBlockType];
export type UseDataBlockProps<T extends keyof AllDataBlockType> = (
props: DataBlockProviderProps & { [index: string]: any },
) => Omit<AllDataBlockType[T], 'association' | 'collection' | 'action'> & { [index: string]: any };
) => Omit<AllDataBlockType[T], 'association' | 'collection' | 'dataSource' | 'action'> & { [index: string]: any };
export interface DataBlockContextValue<T extends {} = {}> {
props: AllDataBlockProps & T;
@ -85,7 +100,7 @@ DataBlockContextV2.displayName = 'DataBlockContextV2';
export const DataBlockProviderV2: FC<DataBlockProviderProps & { children?: ReactNode }> = withDynamicSchemaProps(
(props) => {
const { collection, association, children, ...resets } = props as Partial<AllDataBlockProps>;
const { collection, association, dataSource, children, ...resets } = props as Partial<AllDataBlockProps>;
const AssociationOrCollection = useMemo(() => {
if (association) {
return {
@ -105,14 +120,16 @@ export const DataBlockProviderV2: FC<DataBlockProviderProps & { children?: React
<DataBlockContextV2.Provider
value={{
dn,
props: { ...resets, collection, association } as AllDataBlockProps,
props: { ...resets, collection, association, dataSource } as AllDataBlockProps,
}}
>
<AssociationOrCollection.Component name={AssociationOrCollection.name}>
<DataBlockResourceProviderV2>
<BlockRequestProviderV2>{children}</BlockRequestProviderV2>
</DataBlockResourceProviderV2>
</AssociationOrCollection.Component>
<CollectionDataSourceProvider dataSource={dataSource}>
<AssociationOrCollection.Component name={AssociationOrCollection.name}>
<DataBlockResourceProviderV2>
<BlockRequestProviderV2>{children}</BlockRequestProviderV2>
</DataBlockResourceProviderV2>
</AssociationOrCollection.Component>
</CollectionDataSourceProvider>
</DataBlockContextV2.Provider>
);
},

View File

@ -3,20 +3,26 @@ import { IResource } from '@nocobase/sdk';
import { useAPIClient } from '../../api-client';
import { useDataBlockPropsV2 } from './DataBlockProvider';
import { DEFAULT_DATA_SOURCE_NAME } from '../collection';
export const DataBlockResourceContextV2 = createContext<IResource>(null);
DataBlockResourceContextV2.displayName = 'DataBlockResourceContextV2';
export const DataBlockResourceProviderV2: FC<{ children?: ReactNode }> = ({ children }) => {
const dataBlockProps = useDataBlockPropsV2();
const { association, collection, sourceId } = dataBlockProps;
const { association, collection, dataSource, sourceId } = dataBlockProps;
const api = useAPIClient();
const headers = useMemo(() => {
if (dataSource && dataSource !== DEFAULT_DATA_SOURCE_NAME) {
return { 'x-connection': dataSource };
}
}, [dataSource]);
const resource = useMemo(() => {
if (association) {
return api.resource(association, sourceId);
return api.resource(association, sourceId, headers);
}
return api.resource(collection);
}, [api, association, collection, sourceId]);
return api.resource(collection, undefined, headers);
}, [api, association, collection, sourceId, headers]);
return <DataBlockResourceContextV2.Provider value={resource}>{children}</DataBlockResourceContextV2.Provider>;
};

View File

@ -1,3 +1,4 @@
export * from './DataBlockResourceProvider';
export * from './DataBlockRequestProvider';
export * from './DataBlockProvider';
export * from './CollectionDataSourceProvider';

View File

@ -23,6 +23,7 @@ import { useRecordIndex } from '../record-provider';
import { SharedFilterProvider } from './SharedFilterProvider';
import { useTemplateBlockContext } from './TemplateBlockProvider';
import { useAssociationNames } from './hooks';
import { CollectionDataSourceProvider } from '../application/data-block';
export const BlockResourceContext = createContext(null);
export const BlockAssociationContext = createContext(null);
@ -303,11 +304,6 @@ export const useBlockContext = () => {
return useContext(BlockContext);
};
export const DataSourceName = createContext<string>(undefined);
export const useDataSourceName = () => {
return useContext(DataSourceName);
};
export const BlockProvider = (props: {
name: string;
resource: any;
@ -331,7 +327,7 @@ export const BlockProvider = (props: {
return (
<BlockContext.Provider value={blockValue}>
<DataSourceName.Provider value={dataSource}>
<CollectionDataSourceProvider dataSource={dataSource}>
<MaybeCollectionProvider collection={collection}>
<BlockAssociationContext.Provider value={association}>
<BlockResourceContext.Provider value={resource}>
@ -345,7 +341,7 @@ export const BlockProvider = (props: {
</BlockResourceContext.Provider>
</BlockAssociationContext.Provider>
</MaybeCollectionProvider>
</DataSourceName.Provider>
</CollectionDataSourceProvider>
</BlockContext.Provider>
);
};

View File

@ -4,7 +4,7 @@ import { CollectionOptions } from './types';
import React from 'react';
import { DeletedPlaceholder } from '../application/collection/DeletedPlaceholder';
import { CollectionExtendsProvider } from './CollectionManagerProvider';
import { useDataSourceName } from '../block-provider/BlockProvider';
import { useCollectionDataSourceName } from '../application/data-block';
function getCollectionName(name?: string | CollectionOptions): string {
if (!name) return undefined;
@ -20,7 +20,7 @@ export const CollectionProvider: FC<{
dataSource?: string;
}> = ({ children, allowNull, name, dataSource, collection }) => {
const collectionName = getCollectionName(name || collection);
const dataSourceName = useDataSourceName();
const dataSourceName = useCollectionDataSourceName();
const dataSourceValue = dataSource || dataSourceName || undefined;
const cm = useCollectionManagerV2();
const hasCollection = cm.getCollection(collectionName, { dataSource: dataSourceValue });

View File

@ -6,11 +6,11 @@ import { CollectionFieldOptions, CollectionOptions } from '../types';
import { useCollectionManagerV2 } from '../../application';
import { InheritanceCollectionMixin } from '../mixins/InheritanceCollectionMixin';
import { uid } from '@formily/shared';
import { useDataSourceName } from '../../block-provider/BlockProvider';
import { useCollectionDataSourceName } from '../../application/data-block';
export const useCollectionManager = (dataSourceName?: string) => {
const cm = useCollectionManagerV2();
const blockDataSourceName = useDataSourceName();
const blockDataSourceName = useCollectionDataSourceName();
const dataSourceNameValue = dataSourceName || blockDataSourceName || undefined;
const [random, setRandom] = useState(uid());
const { refresh } = useSchemaComponentContext();

View File

@ -4,7 +4,7 @@ import {
BlockRequestContext,
CollectionProvider,
DEFAULT_DATA_SOURCE_NAME,
DataSourceName,
CollectionDataSourceProvider,
FormActiveFieldsProvider,
FormBlockContext,
FormV2,
@ -75,7 +75,7 @@ export function FormBlockProvider(props) {
}, [field, form, params, service, updateAssociationValues]);
return !userJob.status || values ? (
<DataSourceName.Provider value={dataSource}>
<CollectionDataSourceProvider dataSource={dataSource}>
<CollectionProvider collection={props.collection}>
<RecordProvider record={values} parent={false}>
<FormActiveFieldsProvider name="form">
@ -92,6 +92,6 @@ export function FormBlockProvider(props) {
</FormActiveFieldsProvider>
</RecordProvider>
</CollectionProvider>
</DataSourceName.Provider>
</CollectionDataSourceProvider>
) : null;
}