fix: association field in reference block failed to append (#2998)
* fix: reference block association data failed to append * feat: default value should not set in edit form * chore: block template provider
This commit is contained in:
parent
d9e7ba6e8d
commit
b11c22798a
@ -21,6 +21,7 @@ import { FilterBlockRecord } from '../filter-provider/FilterProvider';
|
|||||||
import { useRecordIndex } from '../record-provider';
|
import { useRecordIndex } from '../record-provider';
|
||||||
import { SharedFilterProvider } from './SharedFilterProvider';
|
import { SharedFilterProvider } from './SharedFilterProvider';
|
||||||
import { useAssociationNames } from './hooks';
|
import { useAssociationNames } from './hooks';
|
||||||
|
import { useTemplateBlockContext } from './TemplateBlockProvider';
|
||||||
|
|
||||||
export const BlockResourceContext = createContext(null);
|
export const BlockResourceContext = createContext(null);
|
||||||
export const BlockAssociationContext = createContext(null);
|
export const BlockAssociationContext = createContext(null);
|
||||||
@ -115,21 +116,23 @@ const useResourceAction = (props, opts = {}) => {
|
|||||||
const api = useAPIClient();
|
const api = useAPIClient();
|
||||||
const fieldSchema = useFieldSchema();
|
const fieldSchema = useFieldSchema();
|
||||||
const { snapshot } = useActionContext();
|
const { snapshot } = useActionContext();
|
||||||
|
const { templateFinshed } = useTemplateBlockContext();
|
||||||
const record = useRecord();
|
const record = useRecord();
|
||||||
|
const isTemplate = fieldSchema['x-template-key'];
|
||||||
if (!Reflect.has(params, 'appends')) {
|
if (!Reflect.has(params, 'appends')) {
|
||||||
const appends = fields?.filter((field) => field.target).map((field) => field.name);
|
const appends = fields?.filter((field) => field.target).map((field) => field.name);
|
||||||
if (appends?.length) {
|
if (appends?.length) {
|
||||||
params['appends'] = appends;
|
params['appends'] = appends;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
console.log(templateFinshed);
|
||||||
const result = useRequest(
|
const result = useRequest(
|
||||||
snapshot
|
snapshot
|
||||||
? async () => ({
|
? async () => ({
|
||||||
data: record[tableFieldName] ?? [],
|
data: record[tableFieldName] ?? [],
|
||||||
})
|
})
|
||||||
: (opts) => {
|
: (opts) => {
|
||||||
if (!action) {
|
if (!action || (isTemplate && !templateFinshed)) {
|
||||||
return Promise.resolve({});
|
return Promise.resolve({});
|
||||||
}
|
}
|
||||||
const actionParams = { ...params, ...opts };
|
const actionParams = { ...params, ...opts };
|
||||||
@ -147,7 +150,7 @@ const useResourceAction = (props, opts = {}) => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
defaultParams: [params],
|
defaultParams: [params],
|
||||||
refreshDeps: [runWhenParamsChanged ? null : JSON.stringify(params.appends)],
|
refreshDeps: [runWhenParamsChanged ? null : JSON.stringify(params.appends), templateFinshed],
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
// automatic run service when params has changed
|
// automatic run service when params has changed
|
||||||
@ -180,7 +183,6 @@ export const BlockRequestProvider = (props) => {
|
|||||||
const field = useField<Field>();
|
const field = useField<Field>();
|
||||||
const resource = useBlockResource();
|
const resource = useBlockResource();
|
||||||
const [allowedActions, setAllowedActions] = useState({});
|
const [allowedActions, setAllowedActions] = useState({});
|
||||||
|
|
||||||
const service = useResourceAction(
|
const service = useResourceAction(
|
||||||
{ ...props, resource },
|
{ ...props, resource },
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,7 @@ import { useActionContext, useDesignable } from '../schema-component';
|
|||||||
import { Templates as DataTemplateSelect } from '../schema-component/antd/form-v2/Templates';
|
import { Templates as DataTemplateSelect } from '../schema-component/antd/form-v2/Templates';
|
||||||
import { BlockProvider, useBlockRequestContext } from './BlockProvider';
|
import { BlockProvider, useBlockRequestContext } from './BlockProvider';
|
||||||
import { FormActiveFieldsProvider } from './hooks';
|
import { FormActiveFieldsProvider } from './hooks';
|
||||||
|
import { TemplateBlockProvider } from './TemplateBlockProvider';
|
||||||
|
|
||||||
export const FormBlockContext = createContext<any>({});
|
export const FormBlockContext = createContext<any>({});
|
||||||
|
|
||||||
@ -103,11 +104,13 @@ export const FormBlockProvider = (props) => {
|
|||||||
(currentCollection.name === (collection?.name || collection) && !isDetailBlock) || !currentCollection.name;
|
(currentCollection.name === (collection?.name || collection) && !isDetailBlock) || !currentCollection.name;
|
||||||
return (
|
return (
|
||||||
(detailFlag || createFlag || isCusomeizeCreate) && (
|
(detailFlag || createFlag || isCusomeizeCreate) && (
|
||||||
<BlockProvider name={props.name || 'form'} {...props} block={'form'}>
|
<TemplateBlockProvider>
|
||||||
<FormActiveFieldsProvider name="form">
|
<BlockProvider name={props.name || 'form'} {...props} block={'form'}>
|
||||||
<InternalFormBlockProvider {...props} />
|
<FormActiveFieldsProvider name="form">
|
||||||
</FormActiveFieldsProvider>
|
<InternalFormBlockProvider {...props} />
|
||||||
</BlockProvider>
|
</FormActiveFieldsProvider>
|
||||||
|
</BlockProvider>
|
||||||
|
</TemplateBlockProvider>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
import React, { createContext, useContext, useState } from 'react';
|
||||||
|
|
||||||
|
const TemplateBlockContext = createContext<{
|
||||||
|
// 模板是否已经请求结束
|
||||||
|
templateFinshed?: boolean;
|
||||||
|
onTemplateSuccess?: Function;
|
||||||
|
}>({});
|
||||||
|
|
||||||
|
export const useTemplateBlockContext = () => {
|
||||||
|
return useContext(TemplateBlockContext);
|
||||||
|
};
|
||||||
|
|
||||||
|
const TemplateBlockProvider = (props) => {
|
||||||
|
const [templateFinshed, setTemplateFinshed] = useState(false);
|
||||||
|
return (
|
||||||
|
<TemplateBlockContext.Provider value={{ templateFinshed, onTemplateSuccess: () => setTemplateFinshed(true) }}>
|
||||||
|
{props.children}
|
||||||
|
</TemplateBlockContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export { TemplateBlockProvider };
|
@ -8,6 +8,7 @@ import { useDesignable, useFormBlockContext, useSchemaInitializer } from '../../
|
|||||||
import { DndContext } from '../../common/dnd-context';
|
import { DndContext } from '../../common/dnd-context';
|
||||||
import { useToken } from '../__builtins__';
|
import { useToken } from '../__builtins__';
|
||||||
import useStyles from './Grid.style';
|
import useStyles from './Grid.style';
|
||||||
|
import { useFormBlockType } from '../../../block-provider';
|
||||||
|
|
||||||
const GridRowContext = createContext<any>({});
|
const GridRowContext = createContext<any>({});
|
||||||
const GridColContext = createContext<any>({});
|
const GridColContext = createContext<any>({});
|
||||||
@ -368,6 +369,7 @@ Grid.Row = observer(
|
|||||||
const addr = field.address.toString();
|
const addr = field.address.toString();
|
||||||
const cols = useColProperties();
|
const cols = useColProperties();
|
||||||
const { showDivider } = useGridContext();
|
const { showDivider } = useGridContext();
|
||||||
|
const { type } = useFormBlockType();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<GridRowContext.Provider value={{ schema: fieldSchema, cols }}>
|
<GridRowContext.Provider value={{ schema: fieldSchema, cols }}>
|
||||||
@ -392,7 +394,16 @@ Grid.Row = observer(
|
|||||||
{cols.map((schema, index) => {
|
{cols.map((schema, index) => {
|
||||||
return (
|
return (
|
||||||
<React.Fragment key={index}>
|
<React.Fragment key={index}>
|
||||||
<RecursionField name={schema.name} schema={schema} />
|
<RecursionField
|
||||||
|
name={schema.name}
|
||||||
|
schema={schema}
|
||||||
|
mapProperties={(schema) => {
|
||||||
|
if (type === 'update') {
|
||||||
|
schema.default = null;
|
||||||
|
}
|
||||||
|
return schema;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
{showDivider && (
|
{showDivider && (
|
||||||
<ColDivider
|
<ColDivider
|
||||||
cols={cols}
|
cols={cols}
|
||||||
|
@ -2,6 +2,7 @@ import { observer, useField, useFieldSchema } from '@formily/react';
|
|||||||
import React, { createContext, useContext, useMemo } from 'react';
|
import React, { createContext, useContext, useMemo } from 'react';
|
||||||
import { RemoteSchemaComponent, useDesignable } from '..';
|
import { RemoteSchemaComponent, useDesignable } from '..';
|
||||||
import { useSchemaTemplateManager } from './SchemaTemplateManagerProvider';
|
import { useSchemaTemplateManager } from './SchemaTemplateManagerProvider';
|
||||||
|
import { useTemplateBlockContext } from '../block-provider/TemplateBlockProvider';
|
||||||
|
|
||||||
const BlockTemplateContext = createContext<any>({});
|
const BlockTemplateContext = createContext<any>({});
|
||||||
|
|
||||||
@ -17,9 +18,12 @@ export const BlockTemplate = observer(
|
|||||||
const fieldSchema = useFieldSchema();
|
const fieldSchema = useFieldSchema();
|
||||||
const { dn } = useDesignable();
|
const { dn } = useDesignable();
|
||||||
const template = useMemo(() => getTemplateById(templateId), [templateId]);
|
const template = useMemo(() => getTemplateById(templateId), [templateId]);
|
||||||
|
const { onTemplateSuccess } = useTemplateBlockContext();
|
||||||
|
|
||||||
const onSuccess = (data) => {
|
const onSuccess = (data) => {
|
||||||
fieldSchema['x-linkage-rules'] = data?.data?.['x-linkage-rules'] || [];
|
fieldSchema['x-linkage-rules'] = data?.data?.['x-linkage-rules'] || [];
|
||||||
fieldSchema.setProperties(data?.data?.properties);
|
fieldSchema.setProperties(data?.data?.properties);
|
||||||
|
onTemplateSuccess();
|
||||||
};
|
};
|
||||||
return template ? (
|
return template ? (
|
||||||
<BlockTemplateContext.Provider value={{ dn, field, fieldSchema, template }}>
|
<BlockTemplateContext.Provider value={{ dn, field, fieldSchema, template }}>
|
||||||
|
Loading…
Reference in New Issue
Block a user