mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-08 15:09:27 +08:00
* refactor(Tabs): remove observer and add memo * refactor(useFilterFieldProps): use useCallback * perf(FilterProvider): use startTransition * perf(BlockRequestProvider): split context to improve rendering performance * fix: make e2e tests pass * perf(FilterBlockProvider): avoid rerender when updating state * perf(DocumentTitleProvider): avoid rerender when updating state * chore: set the default page title to empty string * perf(BlockRequestProvider_deprecated): remove useless code * perf(RecordProvider): add memo * chore(Table): add comment * perf: add memo to avoid rerender * perf(InternalSchemaToolbar): improve style performance * perf(ActionPage): improve style performance * perf(BlockItem): improve style performance * perf(Grid): improve style performance * perf(IconField): improve style performance * perf(MenuItem): improve style performance * refactor(style): remove useless code * perf(ArrayCollapse): improve style performance * perf(acl): improve style performance * perf(LinkageRules): improve style performance * perf(ActionDrawerUsedInMobile): improve style performance * perf(InternalPopoverNesterUsedInMobile): improve style performance * perf(MobileActionPage): improve style performance * perf(MobileTabsForMobileActionPage): improve style performance * perf(Mobile): improve style performance * perf(MobileTabBar): improve style performance * perf(MobilePageContentContainer): improve style performance * perf(MobilePageHeader): improve style performance * perf(MobilePageNavigationBar): improve style performance * perf(MobileNavigationBarAction): improve style performance * chore: fix build error * perf: some minor optimizations * perf(CollectionFieldInternalField): optimize performance of default value processing * refactor(CollectionFieldInternalField): remove useless code * perf(PageContent): improve performance * refactor(Table): use skeleton component * perf(Table): improve pagination performance * perf(TableSkeleton): improve skeleton component performance * style(TableSkeleton): optimize style * perf(PageTabs): cache rendered content to prevent re-rendering * fix: fix add tab * chore: make unit tests pass * refactor: remove deprecated API * fix(filterBlocks): make e2e tests pass * fix(Action): make e2e tests pass * perf(CollectionField): use custom RecursionField component to avoid unnecessary re-renders * perf(Map): extract style * Revert "perf(CollectionField): use custom RecursionField component to avoid unnecessary re-renders" This reverts commit 203ecc1334429a8b77177337c8649ece1abdaeed. * fix: fix e2e error * fix: fix unit tests * chore: fix build error * perf(useResourceName): avoid unnecessary re-renders * perf(TableBlockProvider): prevent unnecessary re-renders by splitting context * perf(useDataBlockRequest): prevent unnecessary re-renders * perf(useBlockCollection): avoid unnecessary re-renders * perf(ActionContextProvider): add useMemo for context value * perf(useTableBlockProps): avoid unnecessary re-renders * perf(Details): add skeleton component * chore(SchemaSettingsDropdown): make menu visibility more stable * perf(withSkeletonComponent): use useDeferredValue * refactor(ErrorBoundary): optimize code * perf(plugin-charts-old): ignore old plugin context * perf(CollectionHistoryProvider): optimize location context * perf(MenuEditor): optimize router context * fix(InternalAdminLayout): fix the issue of missing left sidebar menu * perf(MenuEditor): prevent unnecessary re-renders * perf(RouteSchemaComponent): prevent unnecessary re-renders * perf(react-router-hooks): improve performance * perf: add skeleton component for other blocks * perf(CurrentUserProvider): remove loading * refactor: remove useless code * fix: fix the issue of redirecting to the homepage after refreshing the page * perf(SystemSettingsProvider): remove loading * perf(CollectionHistoryProvider): remove loading * perf(useCurrentAppInfo): remove loading * perf(RemoteCollectionManagerProvider): remove loading * perf(RequestSchemaComponent): remove loading * refactor(MenuEditor): remove useless code * refactor: remove useless code * perf(Page): reduce white screen time * Revert "Revert "perf(CollectionField): use custom RecursionField component to avoid unnecessary re-renders"" This reverts commit b3a4201a82617534b9f5c3d16d4769f1327b3b02. * perf(wip): add custom RecursionField component * perf(RecursionField): complete custom RecursionField component * perf(FilterAction): avoid unnecessary re-rendering * perf(InputReadPretty): improve render performance * fix(NocoBaseRecursionField): fix the issue where the page does not update * perf(ReadPrettyInternalViewer): remove observer * perf(Table): remove unnecessary context * perf(NocoBaseField): customize a Field component * chore: add comments * fix(ButtonEditor): fix the issue where button title does not update after modification * fix(ellipsis): fix the issue where the page does not refresh after modification * refactor(NocoBaseField): rename and improve performance * fix(NocoBaseField): add compile * perf(Table): avoid rendering popup content * chore: fix build error * fix(popup): fix the issue where popups cannot be opened in embedded pages * perf(CollectionField): remove ErrorBoundary * chore(NocoBaseRecursionField): add isUseFormilyField * perf(TemplateBlockProvider): use performance hooks * refactor(FormV2): optimize skeleton screen effect * perf(EditableAssociationField): remove observer * perf(CollectionField): reduce nested component hierarchy * refactor(SchemaSettingsSwitchItem): prevent UI refresh issues * fix: fix field issues * refactor(CollectionField): extract CollectionFieldInternalField component * fix(DataSources): fix table error issue * fix(drawer): fix drawer error * fix(CollectionManagerSchemaComponentProvider): fix incorrect scope value * fix(BodyRowComponent): fix issue with empty record * fix(usePopupSettings): fix issue with popup not opening * fix(BlockTemplates): fix table error issue * refactor(NocoBaseRecursionField): set default value of isUseFormilyField to true * refactor(Action): replace RecursionField with NocoBaseRecursionField * fix(RequestSchemaComponent): fix issue with subpage not opening on mobile devices * feat(loading): add delay for loading component * fix(workflow): fix workflow table display issue * chore(NocoBaseField): add compile method for default value * fix(CollectionField): compatibility with legacy version * fix(CollectionField): compatibility with legacy version * fix(e2e): remove memoize function * fix: add back dn.refresh * refactor(CollectionField): reduce component rendering in specific cases * Revert "fix(drawer): fix drawer error" This reverts commit da8b43d9322aed39a1adf0ccdf24beca52a228ef. * fix(popup): fix the issue where the second layer popup cannot be opened * Revert "fix(popup): fix the issue where the second layer popup cannot be opened" This reverts commit 71e9a43f361dd806affe9707254ed30882c27178. * fix(popup): fix the issue where the second layer popup cannot be opened * fix(popup): fix the issue where content is not displayed when reopening the popup * fix(NocoBaseRecursionField): add default value * refactor: revert to RecursionField version * fix(Duplicate): fix the issue where values are not displayed * Revert "refactor: revert to RecursionField version" This reverts commit 087dcd4dc4d8d83f41272ac1b270dea281f49e08. * fix(association-field): use NocoBaseRecursionField * fix(menu): fix the issue where menu items are not displayed after adding * fix(grid-card): make e2e pass * fix(NocoBasePageHeader): fix the issue where title is not updated after modification * fix(AdminLayout): fix page navigation issue * fix(e2e): make e2e pass * fix(e2e): fix the issue where data is not refreshed after closing the popup * fix(e2e): fix the issue where relationship field popup variables are displayed incorrectly * fix(e2e): fix JSON.stringify circular reference issue * fix(e2e): make mobile e2e more stable * fix(e2e): fix subform display issue * fix(e2e): fix field pattern state * chore(test): make some unit tests pass * fix(test): make some unit tests pass * fix(test): make unit tests pass * perf(SortableItem): reduce unnecessary component rendering in non-configuration mode * chore(Table): use startTransition * perf(page): implement keep-alive effect * chore: remove loading delay * chore(e2e): skip one e2e * chore: fix build error * refactor: extract KeepAlive component and fix e2e test errors * fix(test): make unit tests pass * fix(KeepAlive): children should be a function * fix(popup): avoid being affected by KeepAlive * perf(KeepAlive): reduce lag when switching pages * refactor(DndContext): extract InternalDndContext component * refactor(KeepAlive): avoid memory overflow * chore: limit maximum number of cached pages * refactor: use useEffect instead of useLayoutEffect * refactor(AdminLayout): extract NocoBaseLogo component * perf: reduce lag when switching pages * chore(KeepAlive): increase maximum number of cached pages * perf(Grid): optimize rendering performance in non-configuration mode * perf(Table): reduce one re-render when switching pagination * refactor(SubTable): separate SubTable's Table component from normal Table component * chore(test): make unit tests pass * fix(e2e): fix the issue where table data does not refresh after form submission * chore(e2e): update some e2e tests * fix(Table): fix the issue where Dropdown component disappears after adding association fields * perf(Table): optimize refresh performance * refactor(NocoBaseField): simplify code writing * perf(Context): improve performance * perf(Context): improve render performance * perf(Menu): improve menu performance * perf: lower the priority of updating title * perf(Page): avoid re-layout when switching pages * perf(Table): reduce repainting time * perf(popup): improve popup opening speed * perf(popup): using toJSON for deep clone, faster than lodash's cloneDeep * perf(withSkeletonComponent): defer loading state update * perf(PopupRouteContextResetter): improve render performance * perf(popup): improve popup closing speed * perf(popup): improve popup closing performance * perf(SchemaToolbar): avoid excessive style calculations * perf(SchemaSettingsDropdown): avoid using useLayoutEffect * perf(popup): improve popup opening speed * fix(pageTab): fix the error when switching tab pages * fix(popup): fix the issue of duplicate URLs caused by rapid button clicks * refactor: extract NocoBasePageHeaderTabs * fix(pageTabs): fix settings not refreshing after changes * chore(test): make unit tests pass * chore(test): update test case * chore(SchemaInitializerSwitch): update unit test * chore(useVariables): update unit tests * chore(e2e): make some e2e tests pass * chore(e2e): make e2e tests pass * chore(e2e): update tests to make it pass * fix(SideMenu): fix the issue where is not refresh when adding a page * fix(Menu): fix the issue where is not refresh when changing menu * fix(e2e): fix e2e error * fix(e2e): fix refresh issues * fix(e2e): fix some bugs * fix(e2e): fix e2e error * fix(test): fix unit tests * fix(popup): prevent rapid clicking issues * fix(e2e): fix e2e error * fix(e2e): fix refresh issues * fix(Table): do not change table pagination after switching pages * perf(Menu): improve performance * perf(Table): reduce row render times * fix(KeepAlive): fix lag when switching designable * fix(e2e): fix e2e error --------- Co-authored-by: chenos <chenlinxh@gmail.com>
167 lines
5.4 KiB
TypeScript
167 lines
5.4 KiB
TypeScript
/**
|
|
* This file is part of the NocoBase (R) project.
|
|
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
* Authors: NocoBase Team.
|
|
*
|
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
*/
|
|
|
|
import { useFieldSchema } from '@formily/react';
|
|
import { error } from '@nocobase/utils/client';
|
|
import { Empty } from 'antd';
|
|
import React from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { findFilterTargets, updateFilterTargets } from '../block-provider/hooks';
|
|
import { useCollection } from '../data-source/collection/CollectionProvider';
|
|
import { useAllCollectionsInheritChainGetter } from '../data-source/data-source/DataSourceManagerProvider';
|
|
import { useFilterBlock } from '../filter-provider/FilterProvider';
|
|
import {
|
|
getSupportFieldsByAssociation,
|
|
getSupportFieldsByForeignKey,
|
|
isSameCollection,
|
|
useSupportedBlocks,
|
|
} from '../filter-provider/utils';
|
|
import { getTargetKey } from '../schema-component/antd/association-filter/utilts';
|
|
import { useCompile } from '../schema-component/hooks/useCompile';
|
|
import { useDesignable } from '../schema-component/hooks/useDesignable';
|
|
import {
|
|
SchemaSettingsItem,
|
|
SchemaSettingsSelectItem,
|
|
SchemaSettingsSubMenu,
|
|
SchemaSettingsSwitchItem,
|
|
} from './SchemaSettings';
|
|
|
|
export function SchemaSettingsConnectDataBlocks(props) {
|
|
const { type, emptyDescription } = props;
|
|
const fieldSchema = useFieldSchema();
|
|
const { dn } = useDesignable();
|
|
const { t } = useTranslation();
|
|
const collection = useCollection();
|
|
const { inProvider } = useFilterBlock();
|
|
const dataBlocks = useSupportedBlocks(type);
|
|
// eslint-disable-next-line prefer-const
|
|
let { targets = [], uid } = findFilterTargets(fieldSchema);
|
|
const compile = useCompile();
|
|
const { getAllCollectionsInheritChain } = useAllCollectionsInheritChainGetter();
|
|
|
|
if (!inProvider) {
|
|
return null;
|
|
}
|
|
|
|
const Content = dataBlocks.map((block) => {
|
|
const title = `${compile(block.collection.title)} #${block.uid.slice(0, 4)}`;
|
|
const onHover = () => {
|
|
const dom = block.dom;
|
|
const designer = dom.querySelector('.general-schema-designer') as HTMLElement;
|
|
if (designer) {
|
|
designer.style.display = 'block';
|
|
}
|
|
dom.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.2)';
|
|
dom.scrollIntoView({
|
|
behavior: 'smooth',
|
|
block: 'center',
|
|
});
|
|
};
|
|
const onLeave = () => {
|
|
const dom = block.dom;
|
|
const designer = dom.querySelector('.general-schema-designer') as HTMLElement;
|
|
if (designer) {
|
|
designer.style.display = null;
|
|
}
|
|
dom.style.boxShadow = 'none';
|
|
};
|
|
if (isSameCollection(block.collection, collection)) {
|
|
return (
|
|
<SchemaSettingsSwitchItem
|
|
key={block.uid}
|
|
title={title}
|
|
checked={targets.some((target) => target.uid === block.uid)}
|
|
onChange={(checked) => {
|
|
if (checked) {
|
|
targets.push({ uid: block.uid });
|
|
} else {
|
|
targets = targets.filter((target) => target.uid !== block.uid);
|
|
block.clearFilter(uid);
|
|
}
|
|
|
|
updateFilterTargets(fieldSchema, targets);
|
|
dn.emit('patch', {
|
|
schema: {
|
|
['x-uid']: uid,
|
|
'x-filter-targets': targets,
|
|
},
|
|
}).catch(error);
|
|
dn.refresh();
|
|
}}
|
|
onMouseEnter={onHover}
|
|
onMouseLeave={onLeave}
|
|
/>
|
|
);
|
|
}
|
|
|
|
const target = targets.find((target) => target.uid === block.uid);
|
|
// 与筛选区块的数据表具有关系的表
|
|
return (
|
|
<SchemaSettingsSelectItem
|
|
key={block.uid}
|
|
title={title}
|
|
value={target?.field || ''}
|
|
options={[
|
|
...getSupportFieldsByAssociation(getAllCollectionsInheritChain(collection.name), block).map((field) => {
|
|
return {
|
|
label: compile(field.uiSchema.title) || field.name,
|
|
value: `${field.name}.${getTargetKey(field)}`,
|
|
};
|
|
}),
|
|
...getSupportFieldsByForeignKey(collection, block).map((field) => {
|
|
return {
|
|
label: `${compile(field.uiSchema.title) || field.name} [${t('Foreign key')}]`,
|
|
value: field.name,
|
|
};
|
|
}),
|
|
{
|
|
label: t('Unconnected'),
|
|
value: '',
|
|
},
|
|
]}
|
|
onChange={(value) => {
|
|
if (value === '') {
|
|
targets = targets.filter((target) => target.uid !== block.uid);
|
|
block.clearFilter(uid);
|
|
} else {
|
|
targets = targets.filter((target) => target.uid !== block.uid);
|
|
targets.push({ uid: block.uid, field: value });
|
|
}
|
|
updateFilterTargets(fieldSchema, targets);
|
|
dn.emit('patch', {
|
|
schema: {
|
|
['x-uid']: uid,
|
|
'x-filter-targets': targets,
|
|
},
|
|
});
|
|
dn.refresh();
|
|
}}
|
|
onMouseEnter={onHover}
|
|
onMouseLeave={onLeave}
|
|
/>
|
|
);
|
|
});
|
|
|
|
return (
|
|
<SchemaSettingsSubMenu title={t('Connect data blocks')}>
|
|
{Content.length ? (
|
|
Content
|
|
) : (
|
|
<SchemaSettingsItem title="empty">
|
|
<Empty
|
|
style={{ width: 160, padding: '0 1em' }}
|
|
description={emptyDescription}
|
|
image={Empty.PRESENTED_IMAGE_SIMPLE}
|
|
/>
|
|
</SchemaSettingsItem>
|
|
)}
|
|
</SchemaSettingsSubMenu>
|
|
);
|
|
}
|