import DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined'; import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; import { Modal, Typography, message } from 'antd'; import React, { useState } from 'react'; import styled from 'styled-components'; import MarkdownViewer from '@src/app/entity/shared/components/legacy/MarkdownViewer'; import { useDeleteQueryMutation } from '../../../../../../graphql/query.generated'; import { CorpUser, EntityType } from '../../../../../../types.generated'; import { useEntityRegistryV2 } from '../../../../../useEntityRegistry'; import ActorAvatar from '../../../ActorAvatar'; import { ActionButton } from '../../../containers/profile/sidebar/SectionActionButton'; import QueryBuilderModal from './QueryBuilderModal'; import { Query } from './types'; /* * Description Column */ const StyledLink = styled(Typography.Link)` display: block; `; const TruncatedTextWrapper = styled.div` display: inline; `; const MAX_DESCRIPTION_LENGTH = 50; interface DescriptionProps { description?: string; } export const QueryDescription = ({ description }: DescriptionProps) => { const [isTruncated, setIsTruncated] = useState(description && description.length > MAX_DESCRIPTION_LENGTH); if (!description) return null; const truncatedDescription = description.slice(0, MAX_DESCRIPTION_LENGTH); return (
{isTruncated && ( <> setIsTruncated(false)}>Read more )} {!isTruncated && ( <> {description.length > MAX_DESCRIPTION_LENGTH && ( setIsTruncated(true)}>Read less )} )}
); }; /* * Created By Column */ const INGESTION_URN = 'urn:li:corpuser:_ingestion'; interface CreatedByProps { createdBy?: CorpUser; } export const QueryCreatedBy = ({ createdBy }: CreatedByProps) => { const entityRegistry = useEntityRegistryV2(); if (!createdBy || createdBy.urn === INGESTION_URN) return null; const userName = entityRegistry.getDisplayName(EntityType.CorpUser, createdBy); return (
); }; /* * Edit/Delete Column */ const ButtonsWrapper = styled.span<{ $isHidden: boolean }>` display: flex; gap: 8px; align-items: center; justify-content: center; ${(props) => props.$isHidden && `visibility: hidden;`} `; interface EditDeleteProps { query: Query; hoveredQueryUrn: string | null; onEdited?: (query) => void; onDeleted?: (query) => void; } export const EditDeleteColumn = ({ query, hoveredQueryUrn, onEdited, onDeleted }: EditDeleteProps) => { const [editingQuery, setEditingQuery] = useState(null); const [deleteQueryMutation] = useDeleteQueryMutation(); const urn = query.urn as string; const deleteQuery = () => { deleteQueryMutation({ variables: { urn } }) .then(({ errors }) => { if (!errors) { message.success({ content: `Deleted Query!`, duration: 3, }); onDeleted?.(query); } }) .catch(() => { message.destroy(); message.error({ content: 'Failed to delete Query! An unexpected error occurred' }); }); }; const confirmDeleteQuery = () => { Modal.confirm({ title: `Delete Query`, content: `Are you sure you want to delete this query?`, onOk() { deleteQuery(); }, onCancel() {}, okText: 'Yes', maskClosable: true, closable: true, }); }; const onEditSubmitted = (newQuery) => { setEditingQuery(null); onEdited?.(newQuery); }; return ( <> setEditingQuery(query)} data-testid="edit-query"> {editingQuery && ( setEditingQuery(null)} /> )} ); }; interface ColumnProps { query: Query; } const ColumnsWrapper = styled.div` text-align: right; `; /* * Columns Column */ export const ColumnsColumn = ({ query }: ColumnProps) => { return {query.columns?.length ?? 0}; };