Aniket Katkar 9257065d69
ui: fix permission related bugs (#12160)
* 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
2023-06-28 11:44:47 +05:30

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;