fix: the edit drawer's audit logs block can only get records by this … (#1917)
* chore: rename resource function and add comment * chore: remove AuditLogsDesigner when create audit logs schema --------- Co-authored-by: chenos <chenlinxh@gmail.com>
This commit is contained in:
parent
e6a2a292b3
commit
42ad77da68
@ -2,12 +2,13 @@ import { ArrayField, createForm } from '@formily/core';
|
||||
import { FormContext, Schema, useField, useFieldSchema } from '@formily/react';
|
||||
import uniq from 'lodash/uniq';
|
||||
import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';
|
||||
import { useCollectionManager } from '../collection-manager';
|
||||
import { useCollection, useCollectionManager } from '../collection-manager';
|
||||
import { useFilterBlock } from '../filter-provider/FilterProvider';
|
||||
import { FixedBlockWrapper, SchemaComponentOptions, removeNullCondition } from '../schema-component';
|
||||
import { BlockProvider, RenderChildrenWithAssociationFilter, useBlockRequestContext } from './BlockProvider';
|
||||
import { mergeFilter } from './SharedFilterProvider';
|
||||
import { findFilterTargets } from './hooks';
|
||||
import { useRecord } from '../record-provider';
|
||||
|
||||
export const TableBlockContext = createContext<any>({});
|
||||
|
||||
@ -99,11 +100,18 @@ const useAssociationNames = (collection) => {
|
||||
export const TableBlockProvider = (props) => {
|
||||
const resourceName = props.resource;
|
||||
const params = { ...props.params };
|
||||
const record = useRecord();
|
||||
|
||||
const appends = useAssociationNames(props.collection);
|
||||
const fieldSchema = useFieldSchema();
|
||||
const { getCollection, getCollectionField } = useCollectionManager();
|
||||
const parent = useCollection();
|
||||
const filter = generateFilterParams(record, parent.name, parent.filterTargetKey, {});
|
||||
const collection = getCollection(props.collection);
|
||||
const { treeTable } = fieldSchema?.['x-decorator-props'] || {};
|
||||
if (filter) {
|
||||
params.filter = filter;
|
||||
}
|
||||
if (props.dragSort) {
|
||||
params['sort'] = ['sort'];
|
||||
}
|
||||
@ -253,3 +261,28 @@ export const useTableBlockProps = () => {
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const generateFilterParams = (record, parentName, filterTargetKey, defaultFilter) => {
|
||||
let filter = defaultFilter;
|
||||
|
||||
if (parentName) {
|
||||
const filterByTk = `${record?.[filterTargetKey || 'id']}`;
|
||||
if (filter) {
|
||||
filter = {
|
||||
$and: [
|
||||
filter,
|
||||
{
|
||||
collectionName: parentName,
|
||||
recordId: filterByTk,
|
||||
},
|
||||
],
|
||||
};
|
||||
} else {
|
||||
filter = {
|
||||
collectionName: parentName,
|
||||
recordId: filterByTk,
|
||||
};
|
||||
}
|
||||
}
|
||||
return filter;
|
||||
};
|
||||
|
@ -31,7 +31,7 @@ export const useValues = () => {
|
||||
};
|
||||
const value2data = () => {
|
||||
field.data = field.data || {};
|
||||
const values = flat(field.value);
|
||||
const values = flat(field.value || {});
|
||||
const path = Object.keys(values).shift() || '';
|
||||
if (!path || !options) {
|
||||
return;
|
||||
|
@ -13,6 +13,8 @@ import { useCompile, useDesignable } from '../../hooks';
|
||||
import { removeNullCondition } from '../filter';
|
||||
import { FixedBlockDesignerItem } from '../page';
|
||||
import { FilterDynamicComponent } from './FilterDynamicComponent';
|
||||
import cloneDeep from 'lodash/cloneDeep';
|
||||
import isEmpty from 'lodash/isEmpty';
|
||||
|
||||
export const TableBlockDesigner = () => {
|
||||
const { name, title, sortable } = useCollection();
|
||||
@ -25,7 +27,9 @@ export const TableBlockDesigner = () => {
|
||||
const { t } = useTranslation();
|
||||
const { dn } = useDesignable();
|
||||
const compile = useCompile();
|
||||
const defaultFilter = fieldSchema?.['x-decorator-props']?.params?.filter || {};
|
||||
const defaultFilter = removeNullCondition(fieldSchema?.['x-decorator-props']?.params?.filter || {});
|
||||
// 当前filter 不需要在 "设置数据范围" 表单里初始化,只需要在查询的时候合并到查询条件 filter中
|
||||
const crypticFilter = fieldSchema?.['x-decorator-props']?.params?.crypticFilter;
|
||||
const defaultSort = fieldSchema?.['x-decorator-props']?.params?.sort || [];
|
||||
const defaultResource = fieldSchema?.['x-decorator-props']?.resource;
|
||||
const supportTemplate = !fieldSchema?.['x-decorator-props']?.disableTemplate;
|
||||
@ -67,12 +71,16 @@ export const TableBlockDesigner = () => {
|
||||
({ filter }) => {
|
||||
filter = removeNullCondition(filter);
|
||||
const params = field.decoratorProps.params || {};
|
||||
let tempFilter = !isEmpty(crypticFilter) ? crypticFilter : filter;
|
||||
if (!isEmpty(filter)) {
|
||||
tempFilter = !isEmpty(crypticFilter) ? mergeFilter([filter, tempFilter]) : cloneDeep(filter);
|
||||
}
|
||||
params.filter = filter;
|
||||
field.decoratorProps.params = params;
|
||||
fieldSchema['x-decorator-props']['params'] = params;
|
||||
const filters = service.params?.[1]?.filters || {};
|
||||
service.run(
|
||||
{ ...service.params?.[0], filter: mergeFilter([...Object.values(filters), filter]), page: 1 },
|
||||
{ ...service.params?.[0], filter: mergeFilter([...Object.values(filters), tempFilter]), page: 1 },
|
||||
{ filters },
|
||||
);
|
||||
dn.emit('patch', {
|
||||
@ -82,7 +90,7 @@ export const TableBlockDesigner = () => {
|
||||
},
|
||||
});
|
||||
},
|
||||
[field],
|
||||
[field, crypticFilter],
|
||||
);
|
||||
|
||||
return (
|
||||
|
@ -1323,6 +1323,8 @@ export const createTableBlockSchema = (options) => {
|
||||
TableBlockDesigner,
|
||||
blockType,
|
||||
pageSize = 20,
|
||||
// 当前filter 不需要在 "设置数据范围" 表单里初始化,只需要在查询的时候合并到查询条件 filter中
|
||||
crypticFilter = {},
|
||||
...others
|
||||
} = options;
|
||||
const schema: ISchema = {
|
||||
@ -1335,6 +1337,7 @@ export const createTableBlockSchema = (options) => {
|
||||
action: 'list',
|
||||
params: {
|
||||
pageSize,
|
||||
crypticFilter,
|
||||
},
|
||||
rowKey,
|
||||
showIndex: true,
|
||||
|
@ -1,13 +1,30 @@
|
||||
import { TableOutlined } from '@ant-design/icons';
|
||||
import { ISchema } from '@formily/react';
|
||||
import { createTableBlockSchema, SchemaInitializer } from '@nocobase/client';
|
||||
import { ISchema, useFieldSchema } from '@formily/react';
|
||||
import {
|
||||
createTableBlockSchema,
|
||||
generateFilterParams,
|
||||
SchemaInitializer,
|
||||
useCollection,
|
||||
useRecord,
|
||||
} from '@nocobase/client';
|
||||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { getResourceOfBlockDesigner } from './utils';
|
||||
|
||||
export const AuditLogsBlockInitializer = (props) => {
|
||||
const { filterTargetKey } = useCollection();
|
||||
|
||||
const { insert } = props;
|
||||
const { t } = useTranslation();
|
||||
const record = useRecord();
|
||||
const fieldSchema = useFieldSchema();
|
||||
|
||||
const crypticFilterFromAuditLogs = generateFilterParams(
|
||||
record,
|
||||
getResourceOfBlockDesigner(fieldSchema),
|
||||
filterTargetKey,
|
||||
{},
|
||||
);
|
||||
const schema = createTableBlockSchema({
|
||||
collection: 'auditLogs',
|
||||
rowKey: 'id',
|
||||
@ -16,6 +33,8 @@ export const AuditLogsBlockInitializer = (props) => {
|
||||
tableActionColumnInitializers: 'AuditLogsTableActionColumnInitializers',
|
||||
tableBlockProvider: 'AuditLogsBlockProvider',
|
||||
disableTemplate: true,
|
||||
// 当前filter 不需要在 "设置数据范围" 表单里初始化,只需要在查询的时候合并到查询条件 filter中
|
||||
crypticFilter: crypticFilterFromAuditLogs,
|
||||
});
|
||||
|
||||
return (
|
||||
|
@ -4,6 +4,7 @@ import {
|
||||
CollectionManagerContext,
|
||||
CollectionManagerProvider,
|
||||
FormProvider,
|
||||
generateFilterParams,
|
||||
SchemaComponent,
|
||||
TableBlockProvider,
|
||||
useCollection,
|
||||
@ -458,55 +459,35 @@ export const AuditLogs: any = () => {
|
||||
);
|
||||
};
|
||||
|
||||
AuditLogs.Decorator = observer(
|
||||
(props: any) => {
|
||||
const parent = useCollection();
|
||||
const record = useRecord();
|
||||
const { interfaces } = useContext(CollectionManagerContext);
|
||||
let filter = props?.params?.filter;
|
||||
if (parent.name) {
|
||||
const filterByTk = record?.[parent.filterTargetKey || 'id'];
|
||||
if (filter) {
|
||||
filter = {
|
||||
$and: [
|
||||
filter,
|
||||
{
|
||||
collectionName: parent.name,
|
||||
recordId: `${filterByTk}`,
|
||||
},
|
||||
],
|
||||
};
|
||||
} else {
|
||||
filter = {
|
||||
collectionName: parent.name,
|
||||
recordId: `${filterByTk}`,
|
||||
};
|
||||
}
|
||||
}
|
||||
const defaults = {
|
||||
collection: 'auditLogs',
|
||||
resource: 'auditLogs',
|
||||
action: 'list',
|
||||
params: {
|
||||
pageSize: 20,
|
||||
appends: ['collection', 'user'],
|
||||
...props.params,
|
||||
filter,
|
||||
sort: '-createdAt',
|
||||
},
|
||||
rowKey: 'id',
|
||||
showIndex: true,
|
||||
dragSort: false,
|
||||
};
|
||||
return (
|
||||
<IsAssociationBlock.Provider value={!!parent.name}>
|
||||
<CollectionManagerProvider collections={[collection]} interfaces={interfaces}>
|
||||
<TableBlockProvider {...defaults}>{props.children}</TableBlockProvider>
|
||||
</CollectionManagerProvider>
|
||||
</IsAssociationBlock.Provider>
|
||||
);
|
||||
},
|
||||
{ displayName: 'AuditLogs.Decorator' },
|
||||
);
|
||||
AuditLogs.Decorator = observer((props: any) => {
|
||||
const parent = useCollection();
|
||||
const record = useRecord();
|
||||
const { interfaces } = useContext(CollectionManagerContext);
|
||||
const filter = generateFilterParams(record, parent.name, parent.filterTargetKey, props?.params?.filter) || {};
|
||||
const defaults = {
|
||||
collection: 'auditLogs',
|
||||
resource: 'auditLogs',
|
||||
action: 'list',
|
||||
params: {
|
||||
pageSize: 20,
|
||||
appends: ['collection', 'user'],
|
||||
...props.params,
|
||||
filter,
|
||||
sort: '-createdAt',
|
||||
},
|
||||
rowKey: 'id',
|
||||
showIndex: true,
|
||||
dragSort: false,
|
||||
};
|
||||
return (
|
||||
<IsAssociationBlock.Provider value={!!parent.name}>
|
||||
<CollectionManagerProvider collections={[collection]} interfaces={interfaces}>
|
||||
<TableBlockProvider {...defaults}>{props.children}</TableBlockProvider>
|
||||
</CollectionManagerProvider>
|
||||
</IsAssociationBlock.Provider>
|
||||
);
|
||||
}, {
|
||||
displayName: 'AuditLogs.Decorator'
|
||||
});
|
||||
|
||||
AuditLogs.Designer = AuditLogsDesigner;
|
||||
|
@ -1,4 +1,6 @@
|
||||
import { uid } from '@formily/shared';
|
||||
import { Schema } from '@formily/react';
|
||||
import cloneDeep from 'lodash/cloneDeep';
|
||||
|
||||
export const createSchema = () => {
|
||||
const filterSchema = {
|
||||
@ -301,3 +303,18 @@ export const createSchema = () => {
|
||||
};
|
||||
return schema;
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取 TableBlockDesigner 或 DetailsDesigner 的 resource
|
||||
*/
|
||||
export function getResourceOfBlockDesigner(schema: Schema) {
|
||||
let tempSchema = cloneDeep(schema);
|
||||
while (
|
||||
tempSchema &&
|
||||
((tempSchema?.['x-designer'] !== 'TableBlockDesigner' && tempSchema?.['x-designer'] !== 'DetailsDesigner') ||
|
||||
tempSchema?.['x-decorator-props']?.['resource'] === 'auditLogs')
|
||||
) {
|
||||
tempSchema = tempSchema.parent;
|
||||
}
|
||||
return tempSchema?.['x-decorator-props']?.['resource'];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user