Skip to content

Commit fded33c

Browse files
annadoesdesignAnna Everhart
andauthored
add clone back into menu (#15240)
Co-authored-by: Anna Everhart <[email protected]>
1 parent da57d9e commit fded33c

File tree

5 files changed

+43
-2
lines changed

5 files changed

+43
-2
lines changed

datahub-web-react/src/app/entityV2/glossaryNode/GlossaryNodeEntity.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { EntityType, GlossaryNode, SearchResult } from '@types';
2828
const headerDropdownItems = new Set([
2929
EntityMenuItems.MOVE,
3030
EntityMenuItems.SHARE,
31+
EntityMenuItems.CLONE,
3132
EntityMenuItems.DELETE,
3233
EntityMenuItems.ANNOUNCE,
3334
]);

datahub-web-react/src/app/entityV2/glossaryTerm/GlossaryTermEntity.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const headerDropdownItems = new Set([
3737
EntityMenuItems.MOVE,
3838
EntityMenuItems.SHARE,
3939
EntityMenuItems.UPDATE_DEPRECATION,
40+
EntityMenuItems.CLONE,
4041
EntityMenuItems.DELETE,
4142
EntityMenuItems.ANNOUNCE,
4243
]);

datahub-web-react/src/app/entityV2/shared/EntityDropdown/CreateGlossaryEntityModal.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { EditOutlined } from '@ant-design/icons';
22
import { Collapse, Form, Input, Modal, Typography, message } from 'antd';
33
import DOMPurify from 'dompurify';
4-
import React, { useState } from 'react';
4+
import React, { useEffect, useState } from 'react';
55
import styled from 'styled-components/macro';
66

77
import analytics, { EventType } from '@app/analytics';
@@ -39,6 +39,7 @@ interface Props {
3939
// acryl-main only prop
4040
canCreateGlossaryEntity: boolean;
4141
canSelectParentUrn?: boolean;
42+
isCloning?: boolean;
4243
}
4344

4445
function CreateGlossaryEntityModal(props: Props) {
@@ -49,7 +50,7 @@ function CreateGlossaryEntityModal(props: Props) {
4950
const entityRegistry = useEntityRegistry();
5051
const [stagedId, setStagedId] = useState<string | undefined>(undefined);
5152
const [stagedName, setStagedName] = useState('');
52-
const [selectedParentUrn, setSelectedParentUrn] = useState(entityData.urn);
53+
const [selectedParentUrn, setSelectedParentUrn] = useState(props.isCloning ? '' : entityData.urn);
5354
const [documentation, setDocumentation] = useState('');
5455
const [isDocumentationModalVisible, setIsDocumentationModalVisible] = useState(false);
5556
const [createButtonDisabled, setCreateButtonDisabled] = useState(true);
@@ -58,6 +59,21 @@ function CreateGlossaryEntityModal(props: Props) {
5859
const [createGlossaryTermMutation] = useCreateGlossaryTermMutation();
5960
const [createGlossaryNodeMutation] = useCreateGlossaryNodeMutation();
6061

62+
useEffect(() => {
63+
if (props.isCloning && entityData.entityData) {
64+
const { properties } = entityData.entityData;
65+
66+
if (properties?.name) {
67+
setStagedName(`${properties.name} (copy)`);
68+
form.setFieldValue('name', `${properties.name} (copy)`);
69+
}
70+
71+
if (properties?.description) {
72+
setDocumentation(properties.description);
73+
}
74+
}
75+
}, [props.isCloning, entityData.entityData, form]);
76+
6177
function createGlossaryEntity() {
6278
const mutation =
6379
entityType === EntityType.GlossaryTerm ? createGlossaryTermMutation : createGlossaryNodeMutation;

datahub-web-react/src/app/entityV2/shared/EntityDropdown/EntityDropdown.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ const EntityDropdown = (props: Props) => {
108108

109109
const [isCreateTermModalVisible, setIsCreateTermModalVisible] = useState(false);
110110
const [isCreateNodeModalVisible, setIsCreateNodeModalVisible] = useState(false);
111+
const [isCloneEntityModalVisible, setIsCloneEntityModalVisible] = useState(false);
111112
const [isDeprecationModalVisible, setIsDeprecationModalVisible] = useState(false);
112113
const [isEntityAnnouncementModalVisible, setIsEntityAnnouncementModalVisible] = useState(false);
113114
const [isMoveModalVisible, setIsMoveModalVisible] = useState(false);
@@ -288,6 +289,18 @@ const EntityDropdown = (props: Props) => {
288289
});
289290
}
290291

292+
if (menuItems.has(EntityMenuItems.CLONE)) {
293+
menuItemsList.push({
294+
type: 'item' as const,
295+
key: '10',
296+
title: 'Clone',
297+
icon: 'Copy',
298+
disabled: !entityData?.privileges?.canManageEntity,
299+
onClick: () => setIsCloneEntityModalVisible(true),
300+
'data-testid': 'entity-menu-clone-button',
301+
});
302+
}
303+
291304
if (menuItems.has(EntityMenuItems.RAISE_INCIDENT)) {
292305
menuItemsList.push({
293306
type: 'item' as const,
@@ -463,6 +476,15 @@ const EntityDropdown = (props: Props) => {
463476
refetchData={refetchForNodes}
464477
/>
465478
)}
479+
{isCloneEntityModalVisible && (
480+
<CreateGlossaryEntityModal
481+
entityType={entityType}
482+
canCreateGlossaryEntity
483+
onClose={() => setIsCloneEntityModalVisible(false)}
484+
refetchData={entityType === EntityType.GlossaryTerm ? refetchForTerms : refetchForNodes}
485+
isCloning
486+
/>
487+
)}
466488
{isDeprecationModalVisible && (
467489
<UpdateDeprecationModal
468490
urns={[urn]}

datahub-web-react/src/app/entityV2/shared/EntityDropdown/EntityMenuActions.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export enum EntityMenuItems {
2525
ANNOUNCE, // acryl-main only
2626
RAISE_INCIDENT,
2727
LINK_VERSION,
28+
CLONE,
2829
}
2930

3031
export const MenuIcon = styled(MoreOutlined)<{ fontSize?: number }>`

0 commit comments

Comments
 (0)