diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AddGlossary/AddGlossary.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AddGlossary/AddGlossary.component.tsx index 25d204c063c..01214883e39 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AddGlossary/AddGlossary.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AddGlossary/AddGlossary.component.tsx @@ -12,9 +12,9 @@ */ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { Space, Switch, Typography } from 'antd'; -import classNames from 'classnames'; +import { Button, Space, Switch, Typography } from 'antd'; import Tags from 'components/Tag/Tags/tags'; +import { LOADING_STATE } from 'enums/common.enum'; import { cloneDeep } from 'lodash'; import { EntityTags } from 'Models'; import React, { useRef, useState } from 'react'; @@ -26,12 +26,10 @@ import { CreateGlossary } from '../../generated/api/data/createGlossary'; import { EntityReference } from '../../generated/type/entityReference'; import { getCurrentUserId, requiredField } from '../../utils/CommonUtils'; import { AddTags } from '../AddTags/add-tags.component'; -import { Button } from '../buttons/Button/Button'; import RichTextEditor from '../common/rich-text-editor/RichTextEditor'; import { EditorContentRef } from '../common/rich-text-editor/RichTextEditor.interface'; import TitleBreadcrumb from '../common/title-breadcrumb/title-breadcrumb.component'; import PageLayout from '../containers/PageLayout'; -import Loader from '../Loader/Loader'; import ReviewerModal from '../Modals/ReviewerModal/ReviewerModal.component'; import { AddGlossaryError, AddGlossaryProps } from './AddGlossary.interface'; @@ -137,44 +135,6 @@ const AddGlossary = ({ } }; - const getSaveButton = () => { - return allowAccess ? ( - <> - {saveState === 'waiting' ? ( - - ) : saveState === 'success' ? ( - - ) : ( - - )} - - ) : null; - }; - const fetchRightPanel = () => { return ( <> @@ -270,11 +230,9 @@ const AddGlossary = ({ {t('label.reviewer-plural')}: @@ -300,13 +258,19 @@ const AddGlossary = ({
- {getSaveButton()} + +
= ({ | ); + const getIngestionPermission = (name: string): boolean => + !isRequiredDetailsAvailable || getEditPermission(name); + const getTriggerDeployButton = (ingestion: IngestionPipeline) => { if (ingestion.deployed) { return ( <> - - + + {label} - + ) } description={description} @@ -290,7 +289,7 @@ const TeamDetailsV1 = ({ ? t('label.remove') : t('message.no-permission-for-action') }> - 0 && isActionAllowed() && (
), }); @@ -938,23 +934,15 @@ const TeamDetailsV1 = ({ const teamActionButton = (alreadyJoined: boolean, isJoinable: boolean) => { return alreadyJoined ? ( isJoinable || hasAccess ? ( - ) : null ) : ( @@ -980,18 +968,14 @@ const TeamDetailsV1 = ({ @@ -1014,8 +998,8 @@ const TeamDetailsV1 = ({ }) : t('message.no-permission-for-action') }> - + icon={} + size="small" + type="text" + onClick={() => setIsHeadingEditing(true)} + />
)} @@ -1103,7 +1084,7 @@ const TeamDetailsV1 = ({ placement="bottomRight" trigger={['click']} onOpenChange={setShowActions}> - @@ -1111,7 +1092,7 @@ const TeamDetailsV1 = ({ className="text-primary self-center manage-dropdown-icon" icon="ellipsis-vertical" /> - + )} @@ -1199,7 +1180,7 @@ const TeamDetailsV1 = ({ - handleAddTeam(true)}> {addTeam} - + @@ -1248,7 +1229,7 @@ const TeamDetailsV1 = ({ - {addRole} - + - {addPolicy} - + diff --git a/openmetadata-ui/src/main/resources/ui/src/components/TestSuiteDetails/TestSuiteDetails.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/TestSuiteDetails/TestSuiteDetails.component.tsx index 0e273e50b7a..7e2cfaf6267 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/TestSuiteDetails/TestSuiteDetails.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/TestSuiteDetails/TestSuiteDetails.component.tsx @@ -11,14 +11,13 @@ * limitations under the License. */ -import { Space, Tooltip } from 'antd'; +import { Button, Space, Tooltip } from 'antd'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { NO_PERMISSION_FOR_ACTION } from '../../constants/HelperTextUtil'; import { useAuth } from '../../hooks/authHooks'; import { IcDeleteColored } from '../../utils/SvgUtils'; import { useAuthContext } from '../authentication/auth-provider/AuthProvider'; -import { Button } from '../buttons/Button/Button'; import DeleteWidgetModal from '../common/DeleteWidget/DeleteWidgetModal'; import Description from '../common/description/Description'; import EntitySummaryDetails from '../common/EntitySummaryDetails/EntitySummaryDetails'; @@ -55,20 +54,23 @@ const TestSuiteDetails = ({ titleLinks={slashedBreadCrumb} /> + placement="topRight" + title={!hasAccess && NO_PERMISSION_FOR_ACTION}> diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/ManageButton/ManageButton.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/ManageButton/ManageButton.test.tsx index ecbcf5e05ee..18e7a8cca2b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/ManageButton/ManageButton.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/ManageButton/ManageButton.test.tsx @@ -129,6 +129,15 @@ describe('Test manage button component', () => { fireEvent.click(restoreOption); + const modalBody = await screen.findByTestId('restore-modal-body'); + + expect(modalBody).toBeInTheDocument(); + + const modalRestoreButton = await screen.findAllByText('label.restore'); + screen.debug(modalRestoreButton); + + fireEvent.click(modalRestoreButton[1]); + expect(mockOnRestoreEntity).toHaveBeenCalled(); }); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/ManageButton/ManageButton.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/ManageButton/ManageButton.tsx index d77975bc092..f55f4713528 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/ManageButton/ManageButton.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/ManageButton/ManageButton.tsx @@ -12,7 +12,7 @@ */ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { Button, Col, Dropdown, Row, Tooltip, Typography } from 'antd'; +import { Button, Col, Dropdown, Modal, Row, Tooltip, Typography } from 'antd'; import { ItemType } from 'antd/lib/menu/hooks/useItems'; import classNames from 'classnames'; import React, { FC, useState } from 'react'; @@ -63,6 +63,7 @@ const ManageButton: FC = ({ const { t } = useTranslation(); const [showActions, setShowActions] = useState(false); const [isDelete, setIsDelete] = useState(false); + const [showReactiveModal, setShowReactiveModal] = useState(false); const items = [ { @@ -118,7 +119,7 @@ const ManageButton: FC = ({ if (canDelete) { e.stopPropagation(); setShowActions(false); - onRestoreEntity && onRestoreEntity(); + setShowReactiveModal(true); } }}> @@ -233,6 +234,29 @@ const ManageButton: FC = ({ onCancel={() => setIsDelete(false)} /> )} + + { + setShowReactiveModal(false); + }} + onOk={onRestoreEntity}> + + {t('message.are-you-want-to-restore', { + entity: entityName, + })} + + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/next-previous/NextPrevious.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/next-previous/NextPrevious.tsx index 724574255c9..a9afb8a58b9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/next-previous/NextPrevious.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/next-previous/NextPrevious.tsx @@ -13,10 +13,11 @@ import { faArrowLeft, faArrowRight } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { Button } from 'antd'; import React, { FC, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { CursorType } from '../../../enums/pagination.enum'; import { Paging } from '../../../generated/type/paging'; -import { Button } from '../../buttons/Button/Button'; interface Prop { paging: Paging; @@ -39,6 +40,7 @@ const NextPrevious: FC = ({ isNumberBased = false, currentPage, }: Prop) => { + const { t } = useTranslation(); const [activePage, setActivePage] = useState(1); const onNextHandler = () => { @@ -86,18 +88,14 @@ const NextPrevious: FC = ({ className="tw-my-4 tw-flex tw-justify-center tw-items-center tw-gap-2" data-testid="pagination"> = ({ totalCount )} Page`} ); diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json index a5cf226f17c..4306629e2b1 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json @@ -394,6 +394,7 @@ "press": "Press", "preview": "Preview", "preview-uploaded-data": "Preview uploaded data", + "previous": "Previous", "primary-key": "Primary Key", "private-key": "PrivateKey", "profile": "Profile", diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/TaskDetailPage/TaskDetailPage.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/TaskDetailPage/TaskDetailPage.tsx index 406f68020e0..7a573567700 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/TaskDetailPage/TaskDetailPage.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/TaskDetailPage/TaskDetailPage.tsx @@ -42,6 +42,7 @@ import { updateThread, } from 'rest/feedsAPI'; import AppState from '../../../AppState'; +import { ReactComponent as IconEdit } from '../../../assets/svg/ic-edit.svg'; import { FQN_SEPARATOR_CHAR } from '../../../constants/char.constants'; import { PanelTab, TaskOperation } from '../../../constants/Feeds.constants'; import { EntityType } from '../../../enums/entity.enum'; @@ -67,7 +68,6 @@ import { updateThreadData, } from '../../../utils/FeedUtils'; import { getEncodedFqn } from '../../../utils/StringsUtils'; -import SVGIcons from '../../../utils/SvgUtils'; import { getEntityLink } from '../../../utils/TableUtils'; import { fetchEntityDetail, @@ -629,17 +629,14 @@ const TaskDetailPage = () => { className="tw-ml-0.5 tw-align-middle tw-inline-flex tw-flex-wrap" /> {(hasEditAccess() || isCreator) && !isTaskClosed && ( - + icon={} + size="small" + type="text" + onClick={() => setEditAssignee(true)} + /> )} )} diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/TestSuitePage/TestSuitePage.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/TestSuitePage/TestSuitePage.tsx index 407baf49275..b732a0c0924 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/TestSuitePage/TestSuitePage.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/TestSuitePage/TestSuitePage.tsx @@ -19,11 +19,14 @@ import RichTextEditorPreviewer from 'components/common/rich-text-editor/RichText import TitleBreadcrumb from 'components/common/title-breadcrumb/title-breadcrumb.component'; import PageLayoutV1 from 'components/containers/PageLayoutV1'; import Loader from 'components/Loader/Loader'; +import { usePermissionProvider } from 'components/PermissionProvider/PermissionProvider'; +import { ResourceEntity } from 'components/PermissionProvider/PermissionProvider.interface'; import { isEmpty } from 'lodash'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Link, useHistory } from 'react-router-dom'; import { getListTestSuites } from 'rest/testAPI'; +import { checkPermission } from 'utils/PermissionsUtils'; import { INITIAL_PAGING_VALUE, MAX_CHAR_LIMIT_TEST_SUITE, @@ -33,6 +36,7 @@ import { } from '../../constants/constants'; import { WEBHOOK_DOCS } from '../../constants/docs.constants'; import { TEST_SUITE_BREADCRUMB } from '../../constants/TestSuite.constant'; +import { Operation } from '../../generated/entity/policies/policy'; import { TestSuite } from '../../generated/tests/testSuite'; import { Paging } from '../../generated/type/paging'; import { getEntityName, pluralize } from '../../utils/CommonUtils'; @@ -45,6 +49,15 @@ const TestSuitePage = () => { const [isLoading, setIsLoading] = useState(false); const [testSuitePage, setTestSuitePage] = useState(INITIAL_PAGING_VALUE); const [testSuitePaging, setTestSuitePaging] = useState(pagingObject); + const { permissions } = usePermissionProvider(); + + const createPermission = useMemo(() => { + return checkPermission( + Operation.Create, + ResourceEntity.TEST_SUITE, + permissions + ); + }, [permissions]); const fetchTestSuites = async (param?: Record) => { try { @@ -144,6 +157,7 @@ const TestSuitePage = () => { ghost className="h-8 rounded-4 tw-m-y-sm" data-testid="add-test-suite-button" + disabled={!createPermission} size="small" type="primary" onClick={onAddTestSuite}> @@ -173,14 +187,19 @@ const TestSuitePage = () => { - + + + diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/service/index.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/service/index.tsx index 4fec4945f9d..fd0ab125189 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/service/index.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/service/index.tsx @@ -14,7 +14,6 @@ import { Button, Col, Row, Space, Tooltip, Typography } from 'antd'; import Table, { ColumnsType } from 'antd/lib/table'; import { AxiosError } from 'axios'; -import { Button as LegacyButton } from 'components/buttons/Button/Button'; import DeleteWidgetModal from 'components/common/DeleteWidget/DeleteWidgetModal'; import Description from 'components/common/description/Description'; import EntitySummaryDetails from 'components/common/EntitySummaryDetails/EntitySummaryDetails'; @@ -974,26 +973,28 @@ const ServicePage: FunctionComponent = () => { {serviceDetails?.serviceType !== MetadataServiceType.OpenMetadata && ( - + } size="small" - theme="primary" - variant="outlined" + type="primary" onClick={handleDelete}> - {t('label.delete')} - + )}