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:
black 2023-06-06 20:13:06 +08:00 committed by GitHub
parent e6a2a292b3
commit 42ad77da68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 118 additions and 57 deletions

View File

@ -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;
};

View File

@ -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;

View File

@ -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 (

View File

@ -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,

View File

@ -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 (

View File

@ -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;

View File

@ -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'];
}