mirror of
https://github.com/datahub-project/datahub.git
synced 2025-10-28 01:12:41 +00:00
improvement(summary-tab): hide current property in replace dropdown of property header (#14842)
This commit is contained in:
parent
d87f46d686
commit
f2d3380226
@ -4,6 +4,7 @@ import React, { useCallback, useMemo } from 'react';
|
|||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
|
|
||||||
import usePropertyMenuItems from '@app/entityV2/summary/properties/menuProperty/usePropertyMenuItems';
|
import usePropertyMenuItems from '@app/entityV2/summary/properties/menuProperty/usePropertyMenuItems';
|
||||||
|
import { filterCurrentItemInReplaceMenu } from '@app/entityV2/summary/properties/property/properties/utils';
|
||||||
import { PropertyComponentProps } from '@app/entityV2/summary/properties/types';
|
import { PropertyComponentProps } from '@app/entityV2/summary/properties/types';
|
||||||
import { usePageTemplateContext } from '@app/homeV3/context/PageTemplateContext';
|
import { usePageTemplateContext } from '@app/homeV3/context/PageTemplateContext';
|
||||||
|
|
||||||
@ -85,6 +86,8 @@ export default function BaseProperty<T>({
|
|||||||
|
|
||||||
const menuItems = usePropertyMenuItems(position, property.type);
|
const menuItems = usePropertyMenuItems(position, property.type);
|
||||||
|
|
||||||
|
const filteredItems = filterCurrentItemInReplaceMenu(menuItems, property);
|
||||||
|
|
||||||
const valuesToShow = useMemo(() => values.slice(0, maxValues ?? DEFAULT_MAX_ITEMS), [values, maxValues]);
|
const valuesToShow = useMemo(() => values.slice(0, maxValues ?? DEFAULT_MAX_ITEMS), [values, maxValues]);
|
||||||
const valuesToShowInPopover = useMemo(() => values.slice(maxValues ?? DEFAULT_MAX_ITEMS), [values, maxValues]);
|
const valuesToShowInPopover = useMemo(() => values.slice(maxValues ?? DEFAULT_MAX_ITEMS), [values, maxValues]);
|
||||||
|
|
||||||
@ -124,7 +127,7 @@ export default function BaseProperty<T>({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<PropertyWrapper>
|
<PropertyWrapper>
|
||||||
<Menu items={menuItems} trigger={['click']} disabled={!isTemplateEditable}>
|
<Menu items={filteredItems} trigger={['click']} disabled={!isTemplateEditable}>
|
||||||
<Title weight="bold" color="gray" size="sm" colorLevel={600} $clickable={isTemplateEditable} type="div">
|
<Title weight="bold" color="gray" size="sm" colorLevel={600} $clickable={isTemplateEditable} type="div">
|
||||||
{property.name}
|
{property.name}
|
||||||
</Title>
|
</Title>
|
||||||
|
|||||||
@ -0,0 +1,186 @@
|
|||||||
|
import { describe, expect, it } from 'vitest';
|
||||||
|
|
||||||
|
import { ItemType } from '@components/components/Menu/types';
|
||||||
|
|
||||||
|
import { filterCurrentItemInReplaceMenu } from '@app/entityV2/summary/properties/property/properties/utils';
|
||||||
|
import type { AssetProperty } from '@app/entityV2/summary/properties/types';
|
||||||
|
|
||||||
|
import { StructuredPropertyFieldsFragment } from '@graphql/fragments.generated';
|
||||||
|
import { EntityType, StdDataType, SummaryElementType } from '@types';
|
||||||
|
|
||||||
|
function isItemType(item: ItemType): item is Extract<ItemType, { children?: unknown }> {
|
||||||
|
return 'children' in item;
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('filterCurrentItemInReplaceMenu', () => {
|
||||||
|
it('should return items unchanged if no item with key "replace"', () => {
|
||||||
|
const menuItems: ItemType[] = [
|
||||||
|
{ key: 'notReplace', type: 'item', title: 'Item 1' },
|
||||||
|
{ key: 'anotherItem', type: 'item', title: 'Item 2' },
|
||||||
|
];
|
||||||
|
const property: AssetProperty = {
|
||||||
|
name: 'test',
|
||||||
|
type: SummaryElementType.Owners,
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = filterCurrentItemInReplaceMenu(menuItems, property);
|
||||||
|
expect(result).toEqual(menuItems);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not modify replace item if no children present', () => {
|
||||||
|
const menuItems: ItemType[] = [{ key: 'replace', type: 'item', title: 'Replace' }];
|
||||||
|
const property: AssetProperty = {
|
||||||
|
name: 'test',
|
||||||
|
type: SummaryElementType.Tags,
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = filterCurrentItemInReplaceMenu(menuItems, property);
|
||||||
|
expect(result).toEqual(menuItems);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter excludeKey from children if property.type is not StructuredProperty', () => {
|
||||||
|
const menuItems: ItemType[] = [
|
||||||
|
{
|
||||||
|
key: 'replace',
|
||||||
|
type: 'group',
|
||||||
|
title: 'Replace Group',
|
||||||
|
children: [
|
||||||
|
{ key: SummaryElementType.Tags, type: 'item', title: 'To Remove' },
|
||||||
|
{ key: 'keepMe', type: 'item', title: 'Keep Me' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const property: AssetProperty = {
|
||||||
|
name: 'test',
|
||||||
|
type: SummaryElementType.Tags,
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = filterCurrentItemInReplaceMenu(menuItems, property);
|
||||||
|
if (isItemType(result[0])) {
|
||||||
|
expect(result[0].children).toEqual([{ key: 'keepMe', type: 'item', title: 'Keep Me' }]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter nested children in structuredProperties if property.type is StructuredProperty', () => {
|
||||||
|
const menuItems: ItemType[] = [
|
||||||
|
{
|
||||||
|
key: 'replace',
|
||||||
|
type: 'group',
|
||||||
|
title: 'Replace Group',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
key: 'structuredProperties',
|
||||||
|
type: 'group',
|
||||||
|
title: 'Structured',
|
||||||
|
children: [
|
||||||
|
{ key: 'urn-to-remove', type: 'item', title: 'Remove Me' },
|
||||||
|
{ key: 'keepMe', type: 'item', title: 'Keep Me' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{ key: 'somethingElse', type: 'item', title: 'Other' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const structuredProperty: StructuredPropertyFieldsFragment = {
|
||||||
|
urn: 'urn-to-remove',
|
||||||
|
type: EntityType.StructuredProperty,
|
||||||
|
exists: true,
|
||||||
|
definition: {
|
||||||
|
qualifiedName: 'testQualifiedName',
|
||||||
|
immutable: false,
|
||||||
|
entityTypes: [
|
||||||
|
{
|
||||||
|
type: EntityType.Dataset,
|
||||||
|
urn: 'urn:li:dataset',
|
||||||
|
info: {
|
||||||
|
type: EntityType.Dataset,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
valueType: {
|
||||||
|
urn: 'urn:li:dataType:string',
|
||||||
|
type: EntityType.DataType,
|
||||||
|
info: {
|
||||||
|
type: StdDataType.String,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const property: AssetProperty = {
|
||||||
|
name: 'test',
|
||||||
|
type: SummaryElementType.StructuredProperty,
|
||||||
|
structuredProperty,
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = filterCurrentItemInReplaceMenu(menuItems, property);
|
||||||
|
if (isItemType(result[0]) && result[0].children && isItemType(result[0].children[0])) {
|
||||||
|
expect(result[0].children[0].children).toEqual([{ key: 'keepMe', type: 'item', title: 'Keep Me' }]);
|
||||||
|
expect(result[0].children[1]).toEqual({ key: 'somethingElse', type: 'item', title: 'Other' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle structuredProperties node without children gracefully', () => {
|
||||||
|
const menuItems: ItemType[] = [
|
||||||
|
{
|
||||||
|
key: 'replace',
|
||||||
|
type: 'group',
|
||||||
|
title: 'Replace Group',
|
||||||
|
children: [{ key: 'structuredProperties', type: 'group', title: 'Structured' }],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const structuredProperty: StructuredPropertyFieldsFragment = {
|
||||||
|
urn: 'urn-to-remove',
|
||||||
|
type: EntityType.StructuredProperty,
|
||||||
|
exists: true,
|
||||||
|
definition: {
|
||||||
|
qualifiedName: 'testQualifiedName',
|
||||||
|
immutable: false,
|
||||||
|
entityTypes: [
|
||||||
|
{
|
||||||
|
type: EntityType.Dataset,
|
||||||
|
urn: 'urn:li:dataset',
|
||||||
|
info: {
|
||||||
|
type: EntityType.Dataset,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
valueType: {
|
||||||
|
urn: 'urn:li:dataType:string',
|
||||||
|
type: EntityType.DataType,
|
||||||
|
info: {
|
||||||
|
type: StdDataType.String,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const property: AssetProperty = {
|
||||||
|
name: 'test',
|
||||||
|
type: SummaryElementType.StructuredProperty,
|
||||||
|
structuredProperty,
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = filterCurrentItemInReplaceMenu(menuItems, property);
|
||||||
|
if (isItemType(result[0])) {
|
||||||
|
expect(result[0].children?.[0]).toEqual({
|
||||||
|
key: 'structuredProperties',
|
||||||
|
type: 'group',
|
||||||
|
title: 'Structured',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle empty menuItems array', () => {
|
||||||
|
const menuItems: ItemType[] = [];
|
||||||
|
const property: AssetProperty = {
|
||||||
|
name: 'test',
|
||||||
|
type: SummaryElementType.Domain,
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = filterCurrentItemInReplaceMenu(menuItems, property);
|
||||||
|
expect(result).toEqual([]);
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
import { ItemType } from '@components/components/Menu/types';
|
||||||
|
|
||||||
|
import { AssetProperty } from '@app/entityV2/summary/properties/types';
|
||||||
|
|
||||||
|
import { SummaryElementType } from '@types';
|
||||||
|
|
||||||
|
export function filterCurrentItemInReplaceMenu(menuItems: ItemType[], property: AssetProperty) {
|
||||||
|
const excludeKey =
|
||||||
|
property.type === SummaryElementType.StructuredProperty ? property.structuredProperty?.urn : property.type;
|
||||||
|
|
||||||
|
return menuItems.map((item) => {
|
||||||
|
if (item.key !== 'replace') {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!('children' in item) || !item.children) {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property.type === SummaryElementType.StructuredProperty) {
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
children: item.children.map((child) =>
|
||||||
|
child.key === 'structuredProperties' && 'children' in child
|
||||||
|
? {
|
||||||
|
...child,
|
||||||
|
children: child.children?.filter((c) => c.key !== excludeKey),
|
||||||
|
}
|
||||||
|
: child,
|
||||||
|
),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
children: item.children.filter((child) => child.key !== excludeKey),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user