mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-07-15 13:10:44 +00:00

* fixed permissions related bugs for entity details pages * permission related bug fixes for version pages * changes to revert tab visibility for no permission * fixed console errors * fixed unit tests
244 lines
8.1 KiB
TypeScript
244 lines
8.1 KiB
TypeScript
/*
|
|
* Copyright 2023 Collate.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { Col, Row, Space, Tabs, TabsProps } from 'antd';
|
|
import classNames from 'classnames';
|
|
import { CustomPropertyTable } from 'components/common/CustomPropertyTable/CustomPropertyTable';
|
|
import { CustomPropertyProps } from 'components/common/CustomPropertyTable/CustomPropertyTable.interface';
|
|
import DescriptionV1 from 'components/common/description/DescriptionV1';
|
|
import ErrorPlaceHolder from 'components/common/error-with-placeholder/ErrorPlaceHolder';
|
|
import DataAssetsVersionHeader from 'components/DataAssets/DataAssetsVersionHeader/DataAssetsVersionHeader';
|
|
import TabsLabel from 'components/TabsLabel/TabsLabel.component';
|
|
import TagsContainerV1 from 'components/Tag/TagsContainerV1/TagsContainerV1';
|
|
import { getVersionPathWithTab } from 'constants/constants';
|
|
import { EntityField } from 'constants/Feeds.constants';
|
|
import { ERROR_PLACEHOLDER_TYPE } from 'enums/common.enum';
|
|
import {
|
|
ChangeDescription,
|
|
Column,
|
|
Container,
|
|
} from 'generated/entity/data/container';
|
|
import { TagSource } from 'generated/type/tagLabel';
|
|
import { cloneDeep, toString } from 'lodash';
|
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { useHistory, useParams } from 'react-router-dom';
|
|
import { FQN_SEPARATOR_CHAR } from '../../constants/char.constants';
|
|
import { EntityTabs, EntityType, FqnPart } from '../../enums/entity.enum';
|
|
import { getPartialNameFromTableFQN } from '../../utils/CommonUtils';
|
|
import {
|
|
getColumnsDataWithVersionChanges,
|
|
getCommonExtraInfoForVersionDetails,
|
|
getEntityVersionByField,
|
|
getEntityVersionTags,
|
|
} from '../../utils/EntityVersionUtils';
|
|
import EntityVersionTimeLine from '../EntityVersionTimeLine/EntityVersionTimeLine';
|
|
import Loader from '../Loader/Loader';
|
|
import VersionTable from '../VersionTable/VersionTable.component';
|
|
import { ContainerVersionProp } from './ContainerVersion.interface';
|
|
|
|
const ContainerVersion: React.FC<ContainerVersionProp> = ({
|
|
version,
|
|
currentVersionData,
|
|
isVersionLoading,
|
|
owner,
|
|
tier,
|
|
containerFQN,
|
|
breadCrumbList,
|
|
versionList,
|
|
deleted = false,
|
|
backHandler,
|
|
versionHandler,
|
|
entityPermissions,
|
|
}: ContainerVersionProp) => {
|
|
const { t } = useTranslation();
|
|
const history = useHistory();
|
|
const { tab } = useParams<{ tab: EntityTabs }>();
|
|
const [changeDescription, setChangeDescription] = useState<ChangeDescription>(
|
|
currentVersionData.changeDescription as ChangeDescription
|
|
);
|
|
|
|
const { ownerDisplayName, ownerRef, tierDisplayName } = useMemo(
|
|
() => getCommonExtraInfoForVersionDetails(changeDescription, owner, tier),
|
|
[changeDescription, owner, tier]
|
|
);
|
|
|
|
const columns = useMemo(() => {
|
|
const colList = cloneDeep(
|
|
(currentVersionData as Container).dataModel?.columns
|
|
);
|
|
|
|
return getColumnsDataWithVersionChanges<Column>(changeDescription, colList);
|
|
}, [currentVersionData, changeDescription]);
|
|
|
|
const handleTabChange = (activeKey: string) => {
|
|
history.push(
|
|
getVersionPathWithTab(
|
|
EntityType.CONTAINER,
|
|
containerFQN,
|
|
String(version),
|
|
activeKey
|
|
)
|
|
);
|
|
};
|
|
|
|
useEffect(() => {
|
|
setChangeDescription(
|
|
currentVersionData.changeDescription as ChangeDescription
|
|
);
|
|
}, [currentVersionData]);
|
|
|
|
const tags = useMemo(() => {
|
|
return getEntityVersionTags(currentVersionData, changeDescription);
|
|
}, [currentVersionData, changeDescription]);
|
|
|
|
const description = useMemo(() => {
|
|
return getEntityVersionByField(
|
|
changeDescription,
|
|
EntityField.DESCRIPTION,
|
|
currentVersionData.description
|
|
);
|
|
}, [currentVersionData, changeDescription]);
|
|
|
|
const displayName = useMemo(() => {
|
|
return getEntityVersionByField(
|
|
changeDescription,
|
|
EntityField.DISPLAYNAME,
|
|
currentVersionData.displayName
|
|
);
|
|
}, [currentVersionData, changeDescription]);
|
|
|
|
const tabItems: TabsProps['items'] = useMemo(
|
|
() => [
|
|
{
|
|
key: EntityTabs.SCHEMA,
|
|
label: <TabsLabel id={EntityTabs.SCHEMA} name={t('label.schema')} />,
|
|
children: (
|
|
<Row gutter={[0, 16]} wrap={false}>
|
|
<Col className="p-t-sm m-l-lg" flex="auto">
|
|
<Row gutter={[0, 16]}>
|
|
<Col span={24}>
|
|
<DescriptionV1
|
|
isVersionView
|
|
description={description}
|
|
entityType={EntityType.CONTAINER}
|
|
/>
|
|
</Col>
|
|
<Col span={24}>
|
|
<VersionTable
|
|
columnName={getPartialNameFromTableFQN(
|
|
containerFQN,
|
|
[FqnPart.Column],
|
|
FQN_SEPARATOR_CHAR
|
|
)}
|
|
columns={columns}
|
|
joins={[]}
|
|
/>
|
|
</Col>
|
|
</Row>
|
|
</Col>
|
|
<Col
|
|
className="entity-tag-right-panel-container"
|
|
data-testid="entity-right-panel"
|
|
flex="220px">
|
|
<Space className="w-full" direction="vertical" size="large">
|
|
{Object.keys(TagSource).map((tagType) => (
|
|
<TagsContainerV1
|
|
isVersionView
|
|
showLimited
|
|
entityFqn={containerFQN}
|
|
entityType={EntityType.CONTAINER}
|
|
key={tagType}
|
|
permission={false}
|
|
selectedTags={tags}
|
|
tagType={TagSource[tagType as TagSource]}
|
|
/>
|
|
))}
|
|
</Space>
|
|
</Col>
|
|
</Row>
|
|
),
|
|
},
|
|
{
|
|
key: EntityTabs.CUSTOM_PROPERTIES,
|
|
label: (
|
|
<TabsLabel
|
|
id={EntityTabs.CUSTOM_PROPERTIES}
|
|
name={t('label.custom-property-plural')}
|
|
/>
|
|
),
|
|
children: !entityPermissions.ViewAll ? (
|
|
<ErrorPlaceHolder type={ERROR_PLACEHOLDER_TYPE.PERMISSION} />
|
|
) : (
|
|
<CustomPropertyTable
|
|
isVersionView
|
|
entityDetails={
|
|
currentVersionData as CustomPropertyProps['entityDetails']
|
|
}
|
|
entityType={EntityType.CONTAINER}
|
|
hasEditAccess={false}
|
|
/>
|
|
),
|
|
},
|
|
],
|
|
[description, containerFQN, columns, currentVersionData, entityPermissions]
|
|
);
|
|
|
|
if (!(entityPermissions.ViewAll || entityPermissions.ViewBasic)) {
|
|
return <ErrorPlaceHolder type={ERROR_PLACEHOLDER_TYPE.PERMISSION} />;
|
|
}
|
|
|
|
return (
|
|
<>
|
|
{isVersionLoading ? (
|
|
<Loader />
|
|
) : (
|
|
<div className={classNames('version-data')}>
|
|
<Row gutter={[0, 12]}>
|
|
<Col span={24}>
|
|
<DataAssetsVersionHeader
|
|
breadcrumbLinks={breadCrumbList}
|
|
currentVersionData={currentVersionData}
|
|
deleted={deleted}
|
|
displayName={displayName}
|
|
ownerDisplayName={ownerDisplayName}
|
|
ownerRef={ownerRef}
|
|
tierDisplayName={tierDisplayName}
|
|
version={version}
|
|
onVersionClick={backHandler}
|
|
/>
|
|
</Col>
|
|
<Col span={24}>
|
|
<Tabs
|
|
defaultActiveKey={tab ?? EntityTabs.SCHEMA}
|
|
items={tabItems}
|
|
onChange={handleTabChange}
|
|
/>
|
|
</Col>
|
|
</Row>
|
|
</div>
|
|
)}
|
|
|
|
<EntityVersionTimeLine
|
|
show
|
|
currentVersion={toString(version)}
|
|
versionHandler={versionHandler}
|
|
versionList={versionList}
|
|
onBack={backHandler}
|
|
/>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default ContainerVersion;
|