fix: avoid o2o, o2m can select the data already selected (#1462)
* fix: avoid o2o, o2m can select the data already selected * fix: o2m
This commit is contained in:
parent
1beb25da70
commit
92185ec57c
@ -81,12 +81,12 @@ const InternalAssociationSelect = connect(
|
|||||||
mapReadPretty(ReadPretty),
|
mapReadPretty(ReadPretty),
|
||||||
);
|
);
|
||||||
|
|
||||||
interface RemoteSelectInterface {
|
interface AssociationSelectInterface {
|
||||||
(props: any): React.ReactElement;
|
(props: any): React.ReactElement;
|
||||||
Designer: React.FC;
|
Designer: React.FC;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const AssociationSelect = InternalAssociationSelect as unknown as RemoteSelectInterface;
|
export const AssociationSelect = InternalAssociationSelect as unknown as AssociationSelectInterface;
|
||||||
|
|
||||||
AssociationSelect.Designer = () => {
|
AssociationSelect.Designer = () => {
|
||||||
const { getCollectionFields, getInterface, getCollectionJoinField } = useCollectionManager();
|
const { getCollectionFields, getInterface, getCollectionJoinField } = useCollectionManager();
|
||||||
|
@ -1,20 +1,51 @@
|
|||||||
import { useFieldSchema } from '@formily/react';
|
import { useFieldSchema } from '@formily/react';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import { useCollection } from '../../../collection-manager';
|
import { useCollection, useCollectionManager } from '../../../collection-manager';
|
||||||
|
import { useRecord } from '../../../record-provider';
|
||||||
|
|
||||||
export default function useServiceOptions(props) {
|
export default function useServiceOptions(props) {
|
||||||
const { action = 'list', service } = props;
|
const { action = 'list', service, params, value } = props;
|
||||||
const fieldSchema = useFieldSchema();
|
const fieldSchema = useFieldSchema();
|
||||||
const { getField } = useCollection();
|
const { getField } = useCollection();
|
||||||
|
const { getCollectionFields } = useCollectionManager();
|
||||||
|
const record = useRecord();
|
||||||
|
|
||||||
const collectionField = useMemo(() => {
|
const collectionField = useMemo(() => {
|
||||||
return getField(fieldSchema.name);
|
return getField(fieldSchema.name);
|
||||||
}, [fieldSchema.name]);
|
}, [fieldSchema.name]);
|
||||||
|
|
||||||
|
const filter = useMemo(() => {
|
||||||
|
if (!collectionField) return params?.filter;
|
||||||
|
let extraFilter = {};
|
||||||
|
if (['oho', 'o2m'].includes(collectionField.interface)) {
|
||||||
|
const eqValue = record?.[collectionField.sourceKey];
|
||||||
|
extraFilter = {
|
||||||
|
$or: [
|
||||||
|
{
|
||||||
|
[collectionField.foreignKey]: {
|
||||||
|
$is: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
eqValue !== undefined && eqValue !== null
|
||||||
|
? {
|
||||||
|
[collectionField.foreignKey]: {
|
||||||
|
$eq: eqValue,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
: null,
|
||||||
|
].filter(Boolean),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return params?.filter ? { $and: [extraFilter, params?.filter] } : extraFilter;
|
||||||
|
}, [params?.filter, getCollectionFields, collectionField]);
|
||||||
|
|
||||||
return useMemo(() => {
|
return useMemo(() => {
|
||||||
return {
|
return {
|
||||||
resource: collectionField?.target,
|
resource: collectionField?.target,
|
||||||
action,
|
action,
|
||||||
...service,
|
...service,
|
||||||
|
params: { ...service?.params, filter },
|
||||||
};
|
};
|
||||||
}, [collectionField?.target, action, service]);
|
}, [collectionField?.target, action, filter, service]);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user