diff --git a/openmetadata-ui/src/main/resources/ui/src/components/WorkflowDefinitions/WorkflowBuilder/WorkflowHeader.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/WorkflowDefinitions/WorkflowBuilder/WorkflowHeader.test.tsx index 6686a2326ad1..7064fe8a1272 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/WorkflowDefinitions/WorkflowBuilder/WorkflowHeader.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/WorkflowDefinitions/WorkflowBuilder/WorkflowHeader.test.tsx @@ -87,6 +87,36 @@ jest.mock('@openmetadata/ui-core-components', () => ({ }) => {children}, })); +jest.mock('../../common/HeaderShell/HeaderShell.component', () => ({ + __esModule: true, + default: ({ + breadcrumb, + leading, + title, + subtitle, + badge, + actions, + 'data-testid': dataTestId, + }: { + breadcrumb?: React.ReactNode; + leading?: React.ReactNode; + title?: React.ReactNode; + subtitle?: React.ReactNode; + badge?: React.ReactNode; + actions?: React.ReactNode; + 'data-testid'?: string; + }) => ( +
+ {breadcrumb} + {leading} + {title} + {badge} + {subtitle} + {actions} +
+ ), +})); + jest.mock('../../../assets/svg/edit-new.svg', () => ({ ReactComponent: () => null, })); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/WorkflowDefinitions/WorkflowBuilder/WorkflowHeader.tsx b/openmetadata-ui/src/main/resources/ui/src/components/WorkflowDefinitions/WorkflowBuilder/WorkflowHeader.tsx index ecbf0bb8db66..271990970d5e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/WorkflowDefinitions/WorkflowBuilder/WorkflowHeader.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/WorkflowDefinitions/WorkflowBuilder/WorkflowHeader.tsx @@ -14,7 +14,6 @@ import { Badge, Button, - Card, Dialog, Input, Modal, @@ -31,9 +30,11 @@ import { ReactComponent as WorkflowIcon } from '../../../assets/svg/workflow.svg import { useWorkflowModeContext } from '../../../contexts/WorkflowModeContext'; import { WorkflowHeaderProps } from '../../../interface/workflow-builder-components.interface'; import { showErrorToast } from '../../../utils/ToastUtils'; +import HeaderShell from '../../common/HeaderShell/HeaderShell.component'; import { WorkflowControls } from './WorkflowControls'; export const WorkflowHeader: React.FC = ({ + breadcrumb, title, workflowName, handleTestWorkflow, @@ -89,89 +90,96 @@ export const WorkflowHeader: React.FC = ({ }; return ( - -
-
+ <> + + + {showEditButton && ( + + )} + + } + badge={ + <> + {isNoOp && ( + + + + {t('label.system')} + + + + )} + {!isViewMode && !isNoOp && ( +
- {workflowName && ( - - {workflowName} - - )} -
- - -
- - {showEditButton && ( - - )} -
- + } + subtitle={ + workflowName ? ( + + {workflowName} + + ) : undefined + } + title={ + + {title} + + } + variant="gradient" + /> @@ -209,6 +217,6 @@ export const WorkflowHeader: React.FC = ({ -
+ ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/interface/workflow-builder-components.interface.ts b/openmetadata-ui/src/main/resources/ui/src/interface/workflow-builder-components.interface.ts index 7d06e644b1fe..98979afbff0e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/interface/workflow-builder-components.interface.ts +++ b/openmetadata-ui/src/main/resources/ui/src/interface/workflow-builder-components.interface.ts @@ -289,6 +289,7 @@ export interface WorkflowControlsProps { } export interface WorkflowHeaderProps { + breadcrumb?: React.ReactNode; title: string; workflowName?: string; children?: React.ReactNode; diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/WorkflowDefinitions/WorkflowBuilder/WorkflowBuilder.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/WorkflowDefinitions/WorkflowBuilder/WorkflowBuilder.tsx index 52cd8c9d8558..5c95b9d847a3 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/WorkflowDefinitions/WorkflowBuilder/WorkflowBuilder.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/WorkflowDefinitions/WorkflowBuilder/WorkflowBuilder.tsx @@ -26,8 +26,9 @@ import { useTranslation } from 'react-i18next'; import { Navigate } from 'react-router-dom'; import { Edge, Node, ReactFlowProvider } from 'reactflow'; import DeleteModal from '../../../components/common/DeleteModal/DeleteModal'; +import HeaderBreadcrumb from '../../../components/common/HeaderBreadcrumb/HeaderBreadcrumb.component'; +import { getGlossaryHomeCrumb } from '../../../components/common/HeaderBreadcrumb/HeaderBreadcrumb.utils'; import Loader from '../../../components/common/Loader/Loader'; -import TitleBreadcrumb from '../../../components/common/TitleBreadcrumb/TitleBreadcrumb.component'; import { UnsavedChangesModal } from '../../../components/Modals/UnsavedChangesModal/UnsavedChangesModal.component'; import PageLayoutV1 from '../../../components/PageLayoutV1/PageLayoutV1'; import { @@ -48,6 +49,7 @@ import { WorkflowModeProvider, } from '../../../contexts/WorkflowModeContext'; import { NodeType } from '../../../generated/governance/workflows/elements/nodeType'; +import { useIsAiMode } from '../../../hooks/useAppMode'; import { useFqn } from '../../../hooks/useFqn'; import { useWorkflowActions } from '../../../hooks/useWorkflowActions'; import { useWorkflowHistory } from '../../../hooks/useWorkflowHistory'; @@ -73,6 +75,7 @@ const WorkflowBuilderInternal: React.FC = ({ workflowLogic, }) => { const { t } = useTranslation(); + const isAiMode = useIsAiMode(); const { canAccessSidebar, canDragNodes, @@ -408,15 +411,23 @@ const WorkflowBuilderInternal: React.FC = ({ workflowMetadata?.displayName || 'Workflow Builder'; const workflowName = workflowMetadata?.name; - const breadcrumbs = useMemo(() => { - return [ - { - activeTitle: false, - name: t('label.workflow-plural'), - url: getWorkflowDefinitionsListPath(), - }, - ]; - }, [workflowDisplayName, t]); + const breadcrumb = useMemo( + () => ( + + ), + [workflowDisplayName, t] + ); if (loading) { return ; @@ -440,18 +451,20 @@ const WorkflowBuilderInternal: React.FC = ({ height: 'calc(100vh - var(--ant-navbar-height))', overflow: 'hidden', }} - pageTitle={t('label.workflow-plural')}> + pageTitle={t('label.workflow-plural')} + variant={isAiMode ? 'compact' : 'default'}> {isConnectionModalOpen && (
)} -
-
- -
- +