fix(ui): remove redundant tags from explore page (#9701)

* fix(ui): remove redundant tags from explore page
also update folder structure

* fix unit tests

* fix path

* fix unit tests
This commit is contained in:
Chirag Madlani 2023-01-13 10:56:06 +05:30 committed by GitHub
parent dbdd4a13cb
commit 50278f93d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 73 additions and 70 deletions

View File

@ -14,6 +14,7 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Space, Typography } from 'antd';
import classNames from 'classnames';
import Tags from 'components/Tag/Tags/tags';
import { cloneDeep } from 'lodash';
import { EntityTags } from 'Models';
import React, { useRef, useState } from 'react';
@ -32,7 +33,6 @@ import TitleBreadcrumb from '../common/title-breadcrumb/title-breadcrumb.compone
import PageLayout from '../containers/PageLayout';
import Loader from '../Loader/Loader';
import ReviewerModal from '../Modals/ReviewerModal/ReviewerModal.component';
import Tags from '../tags/tags';
import { AddGlossaryError, AddGlossaryProps } from './AddGlossary.interface';
const Field = ({ children }: { children: React.ReactNode }) => {

View File

@ -14,6 +14,7 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Space } from 'antd';
import classNames from 'classnames';
import Tags from 'components/Tag/Tags/tags';
import { t } from 'i18next';
import { cloneDeep, isEmpty, isUndefined } from 'lodash';
import { EntityTags } from 'Models';
@ -37,7 +38,6 @@ import PageLayout from '../containers/PageLayout';
import Loader from '../Loader/Loader';
import RelatedTermsModal from '../Modals/RelatedTermsModal/RelatedTermsModal';
import ReviewerModal from '../Modals/ReviewerModal/ReviewerModal.component';
import Tags from '../tags/tags';
import { AddGlossaryTermProps } from './AddGlossaryTerm.interface';
const Field = ({

View File

@ -72,8 +72,8 @@ import Loader from '../Loader/Loader';
import { ModalWithMarkdownEditor } from '../Modals/ModalWithMarkdownEditor/ModalWithMarkdownEditor';
import { usePermissionProvider } from '../PermissionProvider/PermissionProvider';
import { ResourceEntity } from '../PermissionProvider/PermissionProvider.interface';
import TagsContainer from '../tags-container/tags-container';
import TagsViewer from '../tags-viewer/tags-viewer';
import TagsContainer from '../Tag/TagsContainer/tags-container';
import TagsViewer from '../Tag/TagsViewer/tags-viewer';
import { ChartType, DashboardDetailsProps } from './DashboardDetails.interface';
const DashboardDetails = ({

View File

@ -127,7 +127,7 @@ jest.mock('../common/rich-text-editor/RichTextEditorPreviewer', () => {
return jest.fn().mockReturnValue(<p>RichTextEditorPreviwer</p>);
});
jest.mock('../tags-container/tags-container', () => {
jest.mock('components/Tag/TagsContainer/tags-container', () => {
return jest.fn().mockImplementation(({ tagList }) => {
return (
<>
@ -139,7 +139,7 @@ jest.mock('../tags-container/tags-container', () => {
});
});
jest.mock('../tags/tags', () => {
jest.mock('components/Tag/Tags/tags', () => {
return jest.fn().mockReturnValue(<p>Tags</p>);
});

View File

@ -34,7 +34,7 @@ import { showErrorToast } from '../../utils/ToastUtils';
import RichTextEditorPreviewer from '../common/rich-text-editor/RichTextEditorPreviewer';
import { SelectedNode } from '../EntityLineage/EntityLineage.interface';
import Loader from '../Loader/Loader';
import TagsViewer from '../tags-viewer/tags-viewer';
import TagsViewer from '../Tag/TagsViewer/tags-viewer';
import { LineageDrawerProps } from './EntityInfoDrawer.interface';
import './EntityInfoDrawer.style.less';

View File

@ -59,8 +59,8 @@ import {
} from '../../utils/TasksUtils';
import RichTextEditorPreviewer from '../common/rich-text-editor/RichTextEditorPreviewer';
import { ModalWithMarkdownEditor } from '../Modals/ModalWithMarkdownEditor/ModalWithMarkdownEditor';
import TagsContainer from '../tags-container/tags-container';
import TagsViewer from '../tags-viewer/tags-viewer';
import TagsContainer from '../Tag/TagsContainer/tags-container';
import TagsViewer from '../Tag/TagsViewer/tags-viewer';
import { EntityTableProps, TableCellRendered } from './EntityTable.interface';
import './EntityTable.style.less';

View File

@ -192,7 +192,7 @@ jest.mock('../Modals/ModalWithMarkdownEditor/ModalWithMarkdownEditor', () => ({
ModalWithMarkdownEditor: jest.fn().mockReturnValue(<p>EditorModal</p>),
}));
jest.mock('../tags-container/tags-container', () => {
jest.mock('components/Tag/TagsContainer/tags-container', () => {
return jest.fn().mockImplementation(({ tagList }) => {
return (
<>
@ -204,11 +204,11 @@ jest.mock('../tags-container/tags-container', () => {
});
});
jest.mock('../tags-viewer/tags-viewer', () => {
jest.mock('components/Tag/TagsViewer/tags-viewer', () => {
return jest.fn().mockReturnValue(<p>TagViewer</p>);
});
jest.mock('../tags/tags', () => {
jest.mock('components/Tag/Tags/tags', () => {
return jest.fn().mockReturnValue(<p>Tag</p>);
});

View File

@ -12,6 +12,7 @@
*/
import { Col, Divider, Row, Space, Typography } from 'antd';
import TagsViewer from 'components/Tag/TagsViewer/tags-viewer';
import React from 'react';
import { useTranslation } from 'react-i18next';
import { ReactComponent as IconTagGrey } from '../../../../../assets/svg/tag-grey.svg';
@ -19,7 +20,6 @@ import { MAX_CHAR_LIMIT_ENTITY_SUMMARY } from '../../../../../constants/constant
import { getTagValue } from '../../../../../utils/CommonUtils';
import { prepareConstraintIcon } from '../../../../../utils/TableUtils';
import RichTextEditorPreviewer from '../../../../common/rich-text-editor/RichTextEditorPreviewer';
import TagsViewer from '../../../../tags-viewer/tags-viewer';
import { SummaryListItemProps } from './SummaryListItems.interface';
const { Text, Paragraph } = Typography;

View File

@ -29,7 +29,7 @@ jest.mock('../../../../common/rich-text-editor/RichTextEditorPreviewer', () =>
))
);
jest.mock('../../../../tags-viewer/tags-viewer', () =>
jest.mock('components/Tag/TagsViewer/tags-viewer', () =>
jest
.fn()
.mockImplementation(() => <div data-testid="TagsViewer">TagsViewer</div>)

View File

@ -14,6 +14,7 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Button as ButtonAntd, Card as AntdCard, Tooltip } from 'antd';
import classNames from 'classnames';
import Tags from 'components/Tag/Tags/tags';
import { t } from 'i18next';
import { cloneDeep, debounce, includes, isEqual } from 'lodash';
import { EntityTags } from 'Models';
@ -43,9 +44,8 @@ import ProfilePicture from '../common/ProfilePicture/ProfilePicture';
import DropDownList from '../dropdown/DropDownList';
import ReviewerModal from '../Modals/ReviewerModal/ReviewerModal.component';
import { OperationPermission } from '../PermissionProvider/PermissionProvider.interface';
import TagsContainer from '../tags-container/tags-container';
import TagsViewer from '../tags-viewer/tags-viewer';
import Tags from '../tags/tags';
import TagsContainer from '../Tag/TagsContainer/tags-container';
import TagsViewer from '../Tag/TagsViewer/tags-viewer';
import './GlossaryDetails.style.less';
type props = {

View File

@ -24,7 +24,7 @@ jest.mock('react-router-dom', () => ({
}),
}));
jest.mock('components/tags-container/tags-container', () => {
jest.mock('components/Tag/TagsContainer/tags-container', () => {
return jest.fn().mockReturnValue(<>Tags-container component</>);
});

View File

@ -68,7 +68,7 @@ jest.mock('react-router-dom', () => ({
}),
}));
jest.mock('components/tags-container/tags-container', () => {
jest.mock('components/Tag/TagsContainer/tags-container', () => {
return jest.fn().mockReturnValue(<>Tags-container component</>);
});

View File

@ -15,6 +15,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Button, Card, Col, Divider, Row, Tooltip, Typography } from 'antd';
import { AxiosError } from 'axios';
import classNames from 'classnames';
import Tags from 'components/Tag/Tags/tags';
import { t } from 'i18next';
import { cloneDeep, includes, isEqual } from 'lodash';
import { AssetsDataType, EntityTags } from 'Models';
@ -37,9 +38,8 @@ import ProfilePicture from '../common/ProfilePicture/ProfilePicture';
import TabsPane from '../common/TabsPane/TabsPane';
import ReviewerModal from '../Modals/ReviewerModal/ReviewerModal.component';
import { OperationPermission } from '../PermissionProvider/PermissionProvider.interface';
import TagsContainer from '../tags-container/tags-container';
import TagsViewer from '../tags-viewer/tags-viewer';
import Tags from '../tags/tags';
import TagsContainer from '../Tag/TagsContainer/tags-container';
import TagsViewer from '../Tag/TagsViewer/tags-viewer';
import AssetsTabs from './tabs/AssetsTabs.component';
import GlossaryTermReferences from './tabs/GlossaryTermReferences';
import GlossaryTermSynonyms from './tabs/GlossaryTermSynonyms';

View File

@ -147,7 +147,7 @@ jest.mock('../Modals/ModalWithMarkdownEditor/ModalWithMarkdownEditor', () => ({
.mockReturnValue(<p> ModalWithMarkdownEditor</p>),
}));
jest.mock('../tags/tags', () => {
jest.mock('components/Tag/Tags/tags', () => {
return jest.fn().mockImplementation(({ tag }) => <span>{tag}</span>);
});

View File

@ -21,6 +21,7 @@ import {
Tooltip,
Typography,
} from 'antd';
import Tags from 'components/Tag/Tags/tags';
import { isEmpty } from 'lodash';
import { EntityTags, TagOption } from 'Models';
import React, { FC, Fragment, useState } from 'react';
@ -38,8 +39,7 @@ import ErrorPlaceHolder from '../common/error-with-placeholder/ErrorPlaceHolder'
import RichTextEditorPreviewer from '../common/rich-text-editor/RichTextEditorPreviewer';
import { ModalWithMarkdownEditor } from '../Modals/ModalWithMarkdownEditor/ModalWithMarkdownEditor';
import { OperationPermission } from '../PermissionProvider/PermissionProvider.interface';
import TagsContainer from '../tags-container/tags-container';
import Tags from '../tags/tags';
import TagsContainer from '../Tag/TagsContainer/tags-container';
import SourceList from './SourceList.component';
interface MlModelFeaturesListProp {

View File

@ -16,7 +16,7 @@ import classNames from 'classnames';
import ErrorPlaceHolder from 'components/common/error-with-placeholder/ErrorPlaceHolder';
import RichTextEditorPreviewer from 'components/common/rich-text-editor/RichTextEditorPreviewer';
import SourceList from 'components/MlModelDetail/SourceList.component';
import TagsContainer from 'components/tags-container/tags-container';
import TagsContainer from 'components/Tag/TagsContainer/tags-container';
import { MlFeature, Mlmodel } from 'generated/entity/data/mlmodel';
import { isUndefined } from 'lodash';
import { ExtraInfo } from 'Models';

View File

@ -90,8 +90,8 @@ import Loader from '../Loader/Loader';
import { ModalWithMarkdownEditor } from '../Modals/ModalWithMarkdownEditor/ModalWithMarkdownEditor';
import { usePermissionProvider } from '../PermissionProvider/PermissionProvider';
import { ResourceEntity } from '../PermissionProvider/PermissionProvider.interface';
import TagsContainer from '../tags-container/tags-container';
import TagsViewer from '../tags-viewer/tags-viewer';
import TagsContainer from '../Tag/TagsContainer/tags-container';
import TagsViewer from '../Tag/TagsViewer/tags-viewer';
import TasksDAGView from '../TasksDAGView/TasksDAGView';
import { PipeLineDetailsProp } from './PipelineDetails.interface';

View File

@ -143,11 +143,11 @@ jest.mock('../common/rich-text-editor/RichTextEditorPreviewer', () => {
return jest.fn().mockReturnValue(<p>RichTextEditorPreviwer</p>);
});
jest.mock('../tags-container/tags-container', () => {
jest.mock('components/Tag/TagsContainer/tags-container', () => {
return jest.fn().mockReturnValue(<p>Tag Container</p>);
});
jest.mock('../tags/tags', () => {
jest.mock('components/Tag/Tags/tags', () => {
return jest.fn().mockReturnValue(<p>Tags</p>);
});

View File

@ -11,7 +11,7 @@
* limitations under the License.
*/
import { TagLabel } from '../../generated/type/tagLabel';
import { TagLabel } from '../../../generated/type/tagLabel';
export type TagProps = {
className?: string;

View File

@ -12,14 +12,14 @@
*/
import { fireEvent, getByTestId, render } from '@testing-library/react';
import { LabelType, State, TagSource } from 'generated/type/tagLabel';
import React from 'react';
import { LabelType, State, TagSource } from '../../generated/type/tagLabel';
import Tags from './tags';
const mockCallback = jest.fn();
const mockPush = jest.fn();
jest.mock('../common/rich-text-editor/RichTextEditorPreviewer', () => {
jest.mock('components/common/rich-text-editor/RichTextEditorPreviewer', () => {
return jest.fn().mockReturnValue(<p>RichTextEditorPreviewer</p>);
});

View File

@ -14,15 +14,15 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Tooltip } from 'antd';
import classNames from 'classnames';
import RichTextEditorPreviewer from 'components/common/rich-text-editor/RichTextEditorPreviewer';
import { FQN_SEPARATOR_CHAR } from 'constants/char.constants';
import { ROUTES } from 'constants/constants';
import { isEmpty, isString } from 'lodash';
import React, { FunctionComponent } from 'react';
import { useTranslation } from 'react-i18next';
import { useHistory } from 'react-router-dom';
import { FQN_SEPARATOR_CHAR } from '../../constants/char.constants';
import { ROUTES } from '../../constants/constants';
import SVGIcons, { Icons } from '../../utils/SvgUtils';
import { getTagDisplay } from '../../utils/TagsUtils';
import RichTextEditorPreviewer from '../common/rich-text-editor/RichTextEditorPreviewer';
import SVGIcons, { Icons } from 'utils/SvgUtils';
import { getTagDisplay } from 'utils/TagsUtils';
import { TagProps } from './tags.interface';
import { tagStyles } from './tags.styles';

View File

@ -13,7 +13,7 @@
import { EntityTags, TagOption } from 'Models';
import { ReactNode } from 'react';
import { TagProps } from '../tags/tags.interface';
import { TagProps } from '../Tags/tags.interface';
export type TagsContainerProps = {
children?: ReactNode;

View File

@ -24,7 +24,7 @@ const tagList = [
const onCancel = jest.fn();
const onSelectionChange = jest.fn();
jest.mock('../../utils/UserDataUtils', () => {
jest.mock('utils/UserDataUtils', () => {
return {
fetchAllUsers: jest.fn(),
fetchUserProfilePic: jest.fn(),
@ -34,7 +34,7 @@ jest.mock('../../utils/UserDataUtils', () => {
};
});
jest.mock('../tags/tags', () => {
jest.mock('components/Tag/Tags/tags', () => {
return jest.fn().mockReturnValue(<p>tags</p>);
});

View File

@ -14,6 +14,7 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Select, Space } from 'antd';
import classNames from 'classnames';
import Tags from 'components/Tag/Tags/tags';
import { isEmpty } from 'lodash';
import { EntityTags, TagOption } from 'Models';
import React, {
@ -24,11 +25,10 @@ import React, {
useMemo,
useState,
} from 'react';
import { FQN_SEPARATOR_CHAR } from '../../constants/char.constants';
import { TagSource } from '../../generated/type/tagLabel';
import { withLoader } from '../../hoc/withLoader';
import { Button } from '../buttons/Button/Button';
import Tags from '../tags/tags';
import { FQN_SEPARATOR_CHAR } from '../../../constants/char.constants';
import { TagSource } from '../../../generated/type/tagLabel';
import { withLoader } from '../../../hoc/withLoader';
import { Button } from '../../buttons/Button/Button';
import { TagsContainerProps } from './tags-container.interface';
const TagsContainer: FunctionComponent<TagsContainerProps> = ({

View File

@ -33,7 +33,7 @@ const tagsWithTerm = [
{ tagFQN: `test.tags.term`, source: 'Glossary' },
];
jest.mock('../common/rich-text-editor/RichTextEditorPreviewer', () => {
jest.mock('components/common/rich-text-editor/RichTextEditorPreviewer', () => {
return jest.fn().mockReturnValue(<p>RichTextEditorPreviewer</p>);
});

View File

@ -13,12 +13,12 @@
import { Popover } from 'antd';
import classNames from 'classnames';
import { sortBy } from 'lodash';
import Tags from 'components/Tag/Tags/tags';
import { sortBy, uniqBy } from 'lodash';
import { EntityTags } from 'Models';
import React, { FunctionComponent, useCallback, useMemo } from 'react';
import { LIST_SIZE } from '../../constants/constants';
import { TagSource } from '../../generated/type/tagLabel';
import Tags from '../tags/tags';
import { LIST_SIZE } from '../../../constants/constants';
import { TagSource } from '../../../generated/type/tagLabel';
import { TagsViewerProps } from './tags-viewer.interface';
const TagsViewer: FunctionComponent<TagsViewerProps> = ({
@ -50,7 +50,10 @@ const TagsViewer: FunctionComponent<TagsViewerProps> = ({
);
// sort tags by source so that "Glossary" tags always comes first
const sortedTagsBySource = useMemo(() => sortBy(tags, 'source'), [tags]);
const sortedTagsBySource = useMemo(
() => sortBy(uniqBy(tags, 'tagFQN'), 'source'),
[tags]
);
return sizeCap > -1 ? (
<>

View File

@ -128,11 +128,11 @@ jest.mock('../common/rich-text-editor/RichTextEditorPreviewer', () => {
return jest.fn().mockReturnValue(<p>RichTextEditorPreviwer</p>);
});
jest.mock('../tags-container/tags-container', () => {
jest.mock('components/Tag/TagsContainer/tags-container', () => {
return jest.fn().mockReturnValue(<p>Tag Container</p>);
});
jest.mock('../tags/tags', () => {
jest.mock('components/Tag/Tags/tags', () => {
return jest.fn().mockReturnValue(<p>Tags</p>);
});

View File

@ -62,13 +62,13 @@ jest.mock(
})
);
jest.mock('../../tags-container/tags-container', () =>
jest.mock('components/Tag/TagsContainer/tags-container', () =>
jest
.fn()
.mockReturnValue(<div data-testid="tag-container">Tag Container</div>)
);
jest.mock('../../tags-viewer/tags-viewer', () =>
jest.mock('components/Tag/TagsViewer/tags-viewer', () =>
jest.fn().mockReturnValue(<div data-testid="tag-viewer">Tag Viewer</div>)
);

View File

@ -28,8 +28,8 @@ import {
} from '../../../utils/TopicSchema.utils';
import RichTextEditorPreviewer from '../../common/rich-text-editor/RichTextEditorPreviewer';
import { ModalWithMarkdownEditor } from '../../Modals/ModalWithMarkdownEditor/ModalWithMarkdownEditor';
import TagsContainer from '../../tags-container/tags-container';
import TagsViewer from '../../tags-viewer/tags-viewer';
import TagsContainer from '../../Tag/TagsContainer/tags-container';
import TagsViewer from '../../Tag/TagsViewer/tags-viewer';
import { CellRendered, TopicSchemaFieldsProps } from './TopicSchema.interface';
const TopicSchemaFields: FC<TopicSchemaFieldsProps> = ({

View File

@ -22,7 +22,7 @@ import {
import { getTableExpandableConfig, makeData } from '../../utils/TableUtils';
import RichTextEditorPreviewer from '../common/rich-text-editor/RichTextEditorPreviewer';
import Searchbar from '../common/searchbar/Searchbar';
import TagsViewer from '../tags-viewer/tags-viewer';
import TagsViewer from '../Tag/TagsViewer/tags-viewer';
import { VersionTableProps } from './VersionTable.interfaces';
const VersionTable = ({ columnName, columns, joins }: VersionTableProps) => {

View File

@ -11,10 +11,10 @@
* limitations under the License.
*/
import Tags from 'components/Tag/Tags/tags';
import React, { FunctionComponent, useEffect, useRef } from 'react';
import { Link } from 'react-router-dom';
import { getExplorePathWithSearch } from '../../constants/constants';
import Tags from '../tags/tags';
type SearchOptionsProp = {
searchText: string;

View File

@ -127,7 +127,7 @@ jest.mock('../../../utils/TagsUtils', () => ({
]),
}));
jest.mock('../../tags-container/tags-container', () => {
jest.mock('components/Tag/TagsContainer/tags-container', () => {
return jest.fn().mockImplementation(({ tagList }) => {
return (
<>
@ -139,7 +139,7 @@ jest.mock('../../tags-container/tags-container', () => {
});
});
jest.mock('../../tags-viewer/tags-viewer', () => {
jest.mock('components/Tag/TagsViewer/tags-viewer', () => {
return jest.fn().mockReturnValue(<p data-testid="info-tags">TagViewer</p>);
});
@ -151,7 +151,7 @@ jest.mock('../EntitySummaryDetails/EntitySummaryDetails', () => {
);
});
jest.mock('../../tags/tags', () => {
jest.mock('components/Tag/Tags/tags', () => {
return jest.fn().mockReturnValue(<p data-testid="tier-tag">Tag</p>);
});

View File

@ -16,6 +16,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Button, Popover, Space, Tooltip } from 'antd';
import { AxiosError } from 'axios';
import classNames from 'classnames';
import Tags from 'components/Tag/Tags/tags';
import { t } from 'i18next';
import { cloneDeep, isEmpty, isUndefined } from 'lodash';
import { EntityTags, ExtraInfo, TagOption } from 'Models';
@ -42,9 +43,8 @@ import {
TASK_ENTITIES,
} from '../../../utils/TasksUtils';
import { showErrorToast } from '../../../utils/ToastUtils';
import TagsContainer from '../../tags-container/tags-container';
import TagsViewer from '../../tags-viewer/tags-viewer';
import Tags from '../../tags/tags';
import TagsContainer from '../../Tag/TagsContainer/tags-container';
import TagsViewer from '../../Tag/TagsViewer/tags-viewer';
import EntitySummaryDetails from '../EntitySummaryDetails/EntitySummaryDetails';
import ProfilePicture from '../ProfilePicture/ProfilePicture';
import TitleBreadcrumb from '../title-breadcrumb/title-breadcrumb.component';

View File

@ -17,7 +17,7 @@ import React, { FunctionComponent } from 'react';
import { TagLabel } from '../../../generated/type/tagLabel';
import { getTagValue } from '../../../utils/CommonUtils';
import SVGIcons from '../../../utils/SvgUtils';
import TagsViewer from '../../tags-viewer/tags-viewer';
import TagsViewer from '../../Tag/TagsViewer/tags-viewer';
import EntitySummaryDetails from '../EntitySummaryDetails/EntitySummaryDetails';
import RichTextEditorPreviewer from '../rich-text-editor/RichTextEditorPreviewer';

View File

@ -272,7 +272,7 @@ jest.mock('../../utils/CommonUtils', () => ({
getEntityName: jest.fn().mockReturnValue('entityname'),
}));
jest.mock('components/tags/tags', () => {
jest.mock('components/Tag/Tags/tags', () => {
return jest.fn().mockReturnValue(<span>Tag</span>);
});

View File

@ -237,7 +237,7 @@ jest.mock(
}
);
jest.mock('components/tags-viewer/tags-viewer', () => {
jest.mock('components/Tag/TagsViewer/tags-viewer', () => {
return jest
.fn()
.mockReturnValue(<div data-testid="tag-viewer">Tag Viewer</div>);

View File

@ -32,7 +32,7 @@ import Loader from 'components/Loader/Loader';
import { usePermissionProvider } from 'components/PermissionProvider/PermissionProvider';
import { OperationPermission } from 'components/PermissionProvider/PermissionProvider.interface';
import ServiceConnectionDetails from 'components/ServiceConnectionDetails/ServiceConnectionDetails.component';
import TagsViewer from 'components/tags-viewer/tags-viewer';
import TagsViewer from 'components/Tag/TagsViewer/tags-viewer';
import { t } from 'i18next';
import { isEmpty, isNil, isUndefined, startCase, toLower } from 'lodash';
import { ExtraInfo, ServicesUpdateRequest, ServiceTypes } from 'Models';