= ({
{
- navigate({
- pathname: cloneScheduleRoute(
+ navigate(
+ cloneScheduleRoute(
namespace,
job.recurring_run_id,
isExperimentsAvailable ? experimentId : undefined,
+ pipelineId,
+ pipelineVersionId,
),
- search: `?${PipelineRunSearchParam.RunType}=${PipelineRunType.SCHEDULED}`,
- });
+ );
},
},
{
isSeparator: true,
},
- ]
- : []),
+ ]),
{
title: 'Delete',
onClick: () => {
diff --git a/frontend/src/concepts/pipelines/content/tables/pipelineVersion/PipelineVersionTableRow.tsx b/frontend/src/concepts/pipelines/content/tables/pipelineVersion/PipelineVersionTableRow.tsx
index e2a323e975..c36ef9cfb8 100644
--- a/frontend/src/concepts/pipelines/content/tables/pipelineVersion/PipelineVersionTableRow.tsx
+++ b/frontend/src/concepts/pipelines/content/tables/pipelineVersion/PipelineVersionTableRow.tsx
@@ -5,14 +5,12 @@ import { PipelineKFv2, PipelineVersionKFv2 } from '~/concepts/pipelines/kfTypes'
import { CheckboxTd, TableRowTitleDescription } from '~/components/table';
import { usePipelinesAPI } from '~/concepts/pipelines/context';
import PipelinesTableRowTime from '~/concepts/pipelines/content/tables/PipelinesTableRowTime';
-import { PipelineRunType } from '~/pages/pipelines/global/runs/types';
-import { PipelineRunSearchParam } from '~/concepts/pipelines/content/types';
import {
- routePipelineRunCreateNamespacePipelinesPage,
- routePipelineRunsNamespace,
- routePipelineVersionRunsNamespace,
+ pipelineVersionCreateRunRoute,
+ pipelineVersionCreateScheduleRoute,
+ pipelineVersionRunsRoute,
+ pipelineVersionSchedulesRoute,
} from '~/routes';
-import { SupportedArea, useIsAreaAvailable } from '~/concepts/areas';
type PipelineVersionTableRowProps = {
isChecked: boolean;
@@ -40,7 +38,6 @@ const PipelineVersionTableRow: React.FC = ({
const navigate = useNavigate();
const { namespace } = usePipelinesAPI();
const createdDate = new Date(version.created_at);
- const isExperimentsAvailable = useIsAreaAvailable(SupportedArea.PIPELINE_EXPERIMENTS).status;
return (
@@ -78,22 +75,24 @@ const PipelineVersionTableRow: React.FC = ({
{
title: 'Create run',
onClick: () => {
- navigate(routePipelineRunCreateNamespacePipelinesPage(namespace), {
- state: { lastPipeline: pipeline, lastVersion: version },
- });
+ navigate(
+ pipelineVersionCreateRunRoute(
+ namespace,
+ pipeline.pipeline_id,
+ version.pipeline_version_id,
+ ),
+ );
},
},
{
title: 'Create schedule',
onClick: () => {
navigate(
- {
- pathname: routePipelineRunCreateNamespacePipelinesPage(namespace),
- search: `?${PipelineRunSearchParam.RunType}=${PipelineRunType.SCHEDULED}`,
- },
- {
- state: { lastPipeline: pipeline, lastVersion: version },
- },
+ pipelineVersionCreateScheduleRoute(
+ namespace,
+ pipeline.pipeline_id,
+ version.pipeline_version_id,
+ ),
);
},
},
@@ -104,19 +103,11 @@ const PipelineVersionTableRow: React.FC = ({
title: 'View runs',
onClick: () => {
navigate(
- {
- pathname: isExperimentsAvailable
- ? routePipelineVersionRunsNamespace(
- namespace,
- pipeline.pipeline_id,
- version.pipeline_version_id,
- )
- : routePipelineRunsNamespace(namespace),
- search: `?${PipelineRunSearchParam.RunType}=${PipelineRunType.ACTIVE}`,
- },
- {
- state: { lastVersion: version },
- },
+ pipelineVersionRunsRoute(
+ namespace,
+ pipeline.pipeline_id,
+ version.pipeline_version_id,
+ ),
);
},
},
@@ -124,19 +115,11 @@ const PipelineVersionTableRow: React.FC = ({
title: 'View schedules',
onClick: () => {
navigate(
- {
- pathname: isExperimentsAvailable
- ? routePipelineVersionRunsNamespace(
- namespace,
- pipeline.pipeline_id,
- version.pipeline_version_id,
- )
- : routePipelineRunsNamespace(namespace),
- search: `?${PipelineRunSearchParam.RunType}=${PipelineRunType.SCHEDULED}`,
- },
- {
- state: { lastVersion: version },
- },
+ pipelineVersionSchedulesRoute(
+ namespace,
+ pipeline.pipeline_id,
+ version.pipeline_version_id,
+ ),
);
},
},
diff --git a/frontend/src/concepts/pipelines/content/tables/renderUtils.tsx b/frontend/src/concepts/pipelines/content/tables/renderUtils.tsx
index 3cbd17ca0a..593994a68f 100644
--- a/frontend/src/concepts/pipelines/content/tables/renderUtils.tsx
+++ b/frontend/src/concepts/pipelines/content/tables/renderUtils.tsx
@@ -26,7 +26,7 @@ import {
} from '~/concepts/pipelines/content/tables/utils';
import { computeRunStatus } from '~/concepts/pipelines/content/utils';
import PipelinesTableRowTime from '~/concepts/pipelines/content/tables/PipelinesTableRowTime';
-import { useContextExperimentArchived } from '~/pages/pipelines/global/experiments/ExperimentRunsContext';
+import { useContextExperimentArchived } from '~/pages/pipelines/global/experiments/ExperimentContext';
export const NoRunContent = (): React.JSX.Element => <>->;
diff --git a/frontend/src/concepts/pipelines/content/types.ts b/frontend/src/concepts/pipelines/content/types.ts
index 039e040579..584849ee55 100644
--- a/frontend/src/concepts/pipelines/content/types.ts
+++ b/frontend/src/concepts/pipelines/content/types.ts
@@ -1,10 +1,9 @@
import * as React from 'react';
import { BreadcrumbItem } from '@patternfly/react-core';
-import { PipelineRunType } from '~/pages/pipelines/global/runs';
export type PathProps = {
- breadcrumbPath: (runType?: PipelineRunType | null) => React.ReactElement[];
- contextPath?: string;
+ breadcrumbPath: React.ReactElement[];
+ contextPath: string;
};
export type PipelineCoreDetailsPageComponent = React.FC;
diff --git a/frontend/src/pages/pipelines/GlobalPipelineExperimentsRoutes.tsx b/frontend/src/pages/pipelines/GlobalPipelineExperimentsRoutes.tsx
index 27765915c6..aba4b1a97b 100644
--- a/frontend/src/pages/pipelines/GlobalPipelineExperimentsRoutes.tsx
+++ b/frontend/src/pages/pipelines/GlobalPipelineExperimentsRoutes.tsx
@@ -8,15 +8,21 @@ import {
experimentsPageTitle,
} from '~/pages/pipelines/global/experiments/const';
import GlobalExperiments from '~/pages/pipelines/global/experiments/GlobalExperiments';
-import PipelineRunDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunDetails';
-import PipelineRunJobDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRunJob/PipelineRunJobDetails';
import { experimentsBaseRoute } from '~/routes';
-import CreateRunPage from '~/concepts/pipelines/content/createRun/CreateRunPage';
-import CloneRunPage from '~/concepts/pipelines/content/createRun/CloneRunPage';
-import ExperimentRunsContextProvider from '~/pages/pipelines/global/experiments/ExperimentRunsContext';
-import { GlobalExperimentDetails } from './global/GlobalPipelineCoreDetails';
-import GlobalPipelineRuns from './global/runs/GlobalPipelineRuns';
-import { ExperimentRunsListBreadcrumb } from './global/experiments/ExperimentRunsListBreadcrumb';
+import ExperimentContextProvider from '~/pages/pipelines/global/experiments/ExperimentContext';
+import ExperimentPipelineRuns from '~/pages/pipelines/global/experiments/ExperimentPipelineRuns';
+import ExperimentPipelineRunsTabs from '~/pages/pipelines/global/experiments/ExperimentPipelineRunsTabs';
+import { PipelineRunType } from '~/pages/pipelines/global/runs';
+import ExperimentPipelineRunDetails from '~/pages/pipelines/global/experiments/ExperimentPipelineRunDetails';
+import ExperimentPipelineRunJobDetails from '~/pages/pipelines/global/experiments/ExperimentPipelineRunJobDetails';
+import {
+ ExperimentCreateRunPage,
+ ExperimentCreateSchedulePage,
+} from '~/pages/pipelines/global/experiments/ExperimentCreateRunPage';
+import PipelineAvailabilityLoader from '~/pages/pipelines/global/pipelines/PipelineAvailabilityLoader';
+import ExperimentCloneRunPage from '~/pages/pipelines/global/experiments/ExperimentCloneRunPage';
+import ExperimentCloneSchedulePage from '~/pages/pipelines/global/experiments/ExperimentCloneSchedulePage';
+import { ExperimentCoreDetails } from './global/GlobalPipelineCoreDetails';
import GlobalComparePipelineRunsLoader from './global/experiments/compareRuns/GlobalComparePipelineRunsLoader';
import CompareRunsPage from './global/experiments/compareRuns/CompareRunsPage';
import { ManageRunsPage } from './global/experiments/compareRuns/ManageRunsPage';
@@ -36,58 +42,82 @@ const GlobalPipelineExperimentsRoutes: React.FC = () => (
} />
} />
} />
- }>
- }
- description="Manage your experiment runs and schedules."
- getRedirectPath={experimentsBaseRoute}
+ }>
+ }>
+ }
+ >
+ }
/>
- }
- />
- }
- />
- }
/>
- }
- />
- }
- />
-
- }
- />
- }
- />
- }
- />
- }>
+ }
+ />
+ }
+ />
+
+
+
+ }
+ />
+
+ }
+ />
+
+ }
+ />
+
+
+
+ }
+ />
+
+ }
+ />
+
+ }
+ />
+
+ }>
+ }
+ />
+
}
+ path="compareRuns/add"
+ element={}
/>
+ } />
- }
- />
} />
diff --git a/frontend/src/pages/pipelines/GlobalPipelineRunsRoutes.tsx b/frontend/src/pages/pipelines/GlobalPipelineRunsRoutes.tsx
deleted file mode 100644
index 6651122a6e..0000000000
--- a/frontend/src/pages/pipelines/GlobalPipelineRunsRoutes.tsx
+++ /dev/null
@@ -1,108 +0,0 @@
-import * as React from 'react';
-import { Navigate, Route } from 'react-router-dom';
-import ProjectsRoutes from '~/concepts/projects/ProjectsRoutes';
-import GlobalPipelineCoreLoader from '~/pages/pipelines/global/GlobalPipelineCoreLoader';
-import {
- pipelineRunsPageDescription,
- pipelineRunsPageTitle,
-} from '~/pages/pipelines/global/runs/const';
-import GlobalPipelineCoreDetails from '~/pages/pipelines/global/GlobalPipelineCoreDetails';
-import PipelineDetails from '~/concepts/pipelines/content/pipelinesDetails/pipeline/PipelineDetails';
-import PipelineRunDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunDetails';
-import CreateRunPage from '~/concepts/pipelines/content/createRun/CreateRunPage';
-import CloneRunPage from '~/concepts/pipelines/content/createRun/CloneRunPage';
-import PipelineRunJobDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRunJob/PipelineRunJobDetails';
-import {
- globNamespaceAll,
- globPipelineDetails,
- globPipelineRunClone,
- globPipelineRunCreate,
- globPipelineRunDetails,
- globPipelineRunJobClone,
- globPipelineRunJobDetails,
- routePipelineRunsNamespace,
-} from '~/routes';
-import GlobalPipelineRuns from './global/runs/GlobalPipelineRuns';
-
-const GlobalPipelineRunsRoutes: React.FC = () => (
-
-
- }
- >
- } />
-
- }
- />
-
- }
- />
-
- }
- />
-
- }
- />
-
- }
- />
-
- }
- />
-
- } />
-
-
- } />
-
-);
-
-export default GlobalPipelineRunsRoutes;
diff --git a/frontend/src/pages/pipelines/GlobalPipelinesRoutes.tsx b/frontend/src/pages/pipelines/GlobalPipelinesRoutes.tsx
index 436f1ce239..c5b37cabe0 100644
--- a/frontend/src/pages/pipelines/GlobalPipelinesRoutes.tsx
+++ b/frontend/src/pages/pipelines/GlobalPipelinesRoutes.tsx
@@ -6,25 +6,23 @@ import {
pipelinesPageDescription,
pipelinesPageTitle,
} from '~/pages/pipelines/global/pipelines/const';
-import GlobalPipelineCoreDetails from '~/pages/pipelines/global/GlobalPipelineCoreDetails';
+import { PipelineVersionCoreDetails } from '~/pages/pipelines/global/GlobalPipelineCoreDetails';
import PipelineDetails from '~/concepts/pipelines/content/pipelinesDetails/pipeline/PipelineDetails';
-import PipelineRunDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunDetails';
-import CreateRunPage from '~/concepts/pipelines/content/createRun/CreateRunPage';
-import CloneRunPage from '~/concepts/pipelines/content/createRun/CloneRunPage';
-import PipelineRunJobDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRunJob/PipelineRunJobDetails';
+import { globNamespaceAll, pipelinesBaseRoute } from '~/routes';
+import PipelineVersionContextProvider from '~/pages/pipelines/global/pipelines/PipelineVersionContext';
+import { PipelineRunType } from '~/pages/pipelines/global/runs';
+import PipelineVersionRunsTabs from '~/pages/pipelines/global/pipelines/PipelineVersionRunsTabs';
+import PipelineVersionRuns from '~/pages/pipelines/global/pipelines/PipelineVersionRuns';
+import PipelineVersionRunDetails from '~/pages/pipelines/global/pipelines/PipelineVersionRunDetails';
+import PipelineVersionRunJobDetails from '~/pages/pipelines/global/pipelines/PipelineVersionRunJobDetails';
+import PipelineAvailabilityLoader from '~/pages/pipelines/global/pipelines/PipelineAvailabilityLoader';
import {
- globNamespaceAll,
- globPipelineDetails,
- globPipelineRunClone,
- globPipelineRunCreate,
- globPipelineRunDetails,
- globPipelineRunJobClone,
- globPipelineRunJobDetails,
- globPipelineVersionRuns,
- routePipelinesNamespace,
-} from '~/routes';
+ PipelineVersionCreateRunPage,
+ PipelineVersionCreateSchedulePage,
+} from '~/pages/pipelines/global/pipelines/PipelineVersionCreateRunPage';
+import PipelineVersionCloneSchedulePage from '~/pages/pipelines/global/pipelines/PipelineVersionCloneSchedulePage';
+import PipelineVersionCloneRunPage from '~/pages/pipelines/global/pipelines/PipelineVersionCloneRunPage';
import GlobalPipelines from './global/pipelines/GlobalPipelines';
-import GlobalPipelineVersionRuns from './global/runs/GlobalPipelineVersionRuns';
const GlobalPipelinesRoutes: React.FC = () => (
@@ -34,85 +32,93 @@ const GlobalPipelinesRoutes: React.FC = () => (
}
>
} />
- }>
+ }>
+
+ }
+ >
+ } />
+ }
+ />
+ }
+ />
+ }
+ />
+
+
+
+ }
+ />
+
+ }
+ />
+
+ }
+ />
+
+
+
+ }
+ />
+
+ }
+ />
+
+ }
+ />
+
+ }
/>
- }
- />
-
- }
- />
-
- }
- />
-
- }
- />
-
- }
- />
-
- }
- />
-
- }
- />
-
- } />
+ {/* All the other paths fall back to the pipeline version details view */}
+ } />
+
+
-
} />
);
diff --git a/frontend/src/pages/pipelines/global/GlobalPipelineCoreDetails.tsx b/frontend/src/pages/pipelines/global/GlobalPipelineCoreDetails.tsx
index fe7925f8e2..247ea7bc50 100644
--- a/frontend/src/pages/pipelines/global/GlobalPipelineCoreDetails.tsx
+++ b/frontend/src/pages/pipelines/global/GlobalPipelineCoreDetails.tsx
@@ -4,9 +4,8 @@ import { BreadcrumbItem } from '@patternfly/react-core';
import { usePipelinesAPI } from '~/concepts/pipelines/context';
import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
import EnsureAPIAvailability from '~/concepts/pipelines/EnsureAPIAvailability';
-import { experimentRunsRoute, experimentSchedulesRoute, experimentsBaseRoute } from '~/routes';
+import { experimentsBaseRoute, pipelinesBaseRoute } from '~/routes';
import EnsureCompatiblePipelineServer from '~/concepts/pipelines/EnsureCompatiblePipelineServer';
-import { ExperimentRunsContext } from '~/pages/pipelines/global/experiments/ExperimentRunsContext';
import { getDisplayNameFromK8sResource } from '~/concepts/k8s/utils';
type GlobalPipelineCoreDetailsProps = {
@@ -15,7 +14,15 @@ type GlobalPipelineCoreDetailsProps = {
BreadcrumbDetailsComponent: PipelineCoreDetailsPageComponent;
};
-const GlobalPipelineCoreDetails: React.FC = ({
+const GlobalPipelineCoreDetails: React.FC = (props) => (
+
+
+
+
+
+);
+
+const GlobalPipelineCoreDetailsInner: React.FC = ({
pageName,
redirectPath,
BreadcrumbDetailsComponent,
@@ -23,64 +30,79 @@ const GlobalPipelineCoreDetails: React.FC = ({
const { namespace, project } = usePipelinesAPI();
return (
-
-
- [
- (
-
- {pageName} - {getDisplayNameFromK8sResource(project)}
-
- )}
- />,
- ]}
- contextPath={redirectPath(namespace)}
- />
-
-
+ (
+
+ {pageName} - {getDisplayNameFromK8sResource(project)}
+
+ )}
+ />,
+ ]}
+ contextPath={redirectPath(namespace)}
+ />
);
};
-export const GlobalExperimentDetails: React.FC<
- Pick & {
- isSchedule?: boolean;
- }
-> = ({ BreadcrumbDetailsComponent, isSchedule }) => {
- const { experiment } = React.useContext(ExperimentRunsContext);
- const experimentId = experiment?.experiment_id;
- const { namespace, project } = usePipelinesAPI();
+export const PipelineVersionCoreDetails: React.FC<
+ Pick
+> = ({ BreadcrumbDetailsComponent }) => (
+
+);
- return (
-
-
- [
-
-
- Experiments - {getDisplayNameFromK8sResource(project)}
-
- ,
-
- {experiment?.display_name ? (
-
- {experiment.display_name}
-
- ) : (
- 'Loading...'
- )}
- ,
- ]}
- contextPath={
- isSchedule
- ? experimentSchedulesRoute(namespace, experimentId)
- : experimentRunsRoute(namespace, experimentId)
- }
- />
-
-
- );
-};
+export const ExperimentCoreDetails: React.FC<
+ Pick
+> = ({ BreadcrumbDetailsComponent }) => (
+
+);
+
+// export const ExperimentCoreDetails: React.FC<
+// Pick
+// > = ({ BreadcrumbDetailsComponent }) => {
+// const { experiment } = React.useContext(ExperimentContext);
+// const experimentId = experiment?.experiment_id;
+// const { namespace, project } = usePipelinesAPI();
+
+// return (
+//
+//
+// [
+//
+//
+// Experiments - {getDisplayNameFromK8sResource(project)}
+//
+// ,
+//
+// {experiment?.display_name ? (
+//
+// {experiment.display_name}
+//
+// ) : (
+// 'Loading...'
+// )}
+// ,
+// ]}
+// contextPath={experimentRunsRoute(namespace, experimentId)}
+// />
+//
+//
+// );
+// };
export default GlobalPipelineCoreDetails;
diff --git a/frontend/src/pages/pipelines/global/PipelineCoreNoProjects.tsx b/frontend/src/pages/pipelines/global/PipelineCoreNoProjects.tsx
index 700c8b1a51..dc78ebe0e6 100644
--- a/frontend/src/pages/pipelines/global/PipelineCoreNoProjects.tsx
+++ b/frontend/src/pages/pipelines/global/PipelineCoreNoProjects.tsx
@@ -9,7 +9,7 @@ import {
import { WrenchIcon } from '@patternfly/react-icons/dist/esm/icons/wrench-icon';
import { useNavigate } from 'react-router-dom';
import NewProjectButton from '~/pages/projects/screens/projects/NewProjectButton';
-import { routePipelinesNamespace } from '~/routes';
+import { pipelinesBaseRoute } from '~/routes';
const PipelineCoreNoProjects: React.FC = () => {
const navigate = useNavigate();
@@ -27,7 +27,7 @@ const PipelineCoreNoProjects: React.FC = () => {
navigate(routePipelinesNamespace(projectName))}
+ onProjectCreated={(projectName) => navigate(pipelinesBaseRoute(projectName))}
/>
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentCloneRunPage.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentCloneRunPage.tsx
new file mode 100644
index 0000000000..e4ff55678e
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/experiments/ExperimentCloneRunPage.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link } from 'react-router-dom';
+import { PathProps } from '~/concepts/pipelines/content/types';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import { ExperimentContext } from '~/pages/pipelines/global/experiments/ExperimentContext';
+import { experimentRunDetailsRoute, experimentRunsRoute } from '~/routes';
+import CloneRunPage from '~/concepts/pipelines/content/createRun/CloneRunPage';
+
+const ExperimentCloneRunPage: React.FC = ({ breadcrumbPath }) => {
+ const { experiment } = React.useContext(ExperimentContext);
+ const { namespace } = usePipelinesAPI();
+
+ return (
+
+ {experiment ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+ ]}
+ contextPath={experimentRunsRoute(namespace, experiment?.experiment_id)}
+ contextExperiment={experiment}
+ detailsRedirect={(runId) =>
+ experimentRunDetailsRoute(namespace, experiment?.experiment_id, runId)
+ }
+ />
+ );
+};
+
+export default ExperimentCloneRunPage;
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentCloneSchedulePage.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentCloneSchedulePage.tsx
new file mode 100644
index 0000000000..7f842a530f
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/experiments/ExperimentCloneSchedulePage.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link } from 'react-router-dom';
+import { PathProps } from '~/concepts/pipelines/content/types';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import { ExperimentContext } from '~/pages/pipelines/global/experiments/ExperimentContext';
+import { experimentScheduleDetailsRoute, experimentSchedulesRoute } from '~/routes';
+import CloneSchedulePage from '~/concepts/pipelines/content/createRun/CloneSchedulePage';
+
+const ExperimentCloneSchedulePage: React.FC = ({ breadcrumbPath }) => {
+ const { experiment } = React.useContext(ExperimentContext);
+ const { namespace } = usePipelinesAPI();
+
+ return (
+
+ {experiment ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+ ]}
+ contextPath={experimentSchedulesRoute(namespace, experiment?.experiment_id)}
+ contextExperiment={experiment}
+ detailsRedirect={(jobId) =>
+ experimentScheduleDetailsRoute(namespace, experiment?.experiment_id, jobId)
+ }
+ />
+ );
+};
+
+export default ExperimentCloneSchedulePage;
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentRunsContext.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentContext.tsx
similarity index 50%
rename from frontend/src/pages/pipelines/global/experiments/ExperimentRunsContext.tsx
rename to frontend/src/pages/pipelines/global/experiments/ExperimentContext.tsx
index 00d71c582f..f0d829f6d9 100644
--- a/frontend/src/pages/pipelines/global/experiments/ExperimentRunsContext.tsx
+++ b/frontend/src/pages/pipelines/global/experiments/ExperimentContext.tsx
@@ -3,19 +3,27 @@ import { Bullseye, Spinner } from '@patternfly/react-core';
import { Outlet } from 'react-router-dom';
import { ExperimentKFv2, StorageStateKF } from '~/concepts/pipelines/kfTypes';
import { useExperimentByParams } from '~/pages/pipelines/global/experiments/useExperimentByParams';
+import { experimentRoute } from '~/routes';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
-type ExperimentRunsContextState = {
+type ExperimentContextState = {
experiment: ExperimentKFv2 | null;
+ basePath: string;
};
-export const ExperimentRunsContext = React.createContext({
+export const ExperimentContext = React.createContext({
experiment: null,
+ basePath: '',
});
-const ExperimentRunsContextProvider: React.FC = () => {
+const ExperimentContextProvider: React.FC = () => {
const { experiment, isExperimentLoaded } = useExperimentByParams();
+ const { namespace } = usePipelinesAPI();
- const contextValue = React.useMemo(() => ({ experiment }), [experiment]);
+ const contextValue = React.useMemo(
+ () => ({ experiment, basePath: experimentRoute(namespace, experiment?.experiment_id) }),
+ [experiment, namespace],
+ );
if (!isExperimentLoaded) {
return (
@@ -26,15 +34,15 @@ const ExperimentRunsContextProvider: React.FC = () => {
}
return (
-
+
-
+
);
};
export const useContextExperimentArchived = (): boolean => {
- const { experiment } = React.useContext(ExperimentRunsContext);
+ const { experiment } = React.useContext(ExperimentContext);
return experiment?.storage_state === StorageStateKF.ARCHIVED;
};
-export default ExperimentRunsContextProvider;
+export default ExperimentContextProvider;
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentCreateRunPage.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentCreateRunPage.tsx
new file mode 100644
index 0000000000..645284f21c
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/experiments/ExperimentCreateRunPage.tsx
@@ -0,0 +1,50 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link } from 'react-router-dom';
+import CreateRunPage from '~/concepts/pipelines/content/createRun/CreateRunPage';
+import { RunTypeOption } from '~/concepts/pipelines/content/createRun/types';
+import { PathProps, PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import { ExperimentContext } from '~/pages/pipelines/global/experiments/ExperimentContext';
+import { experimentRunsRoute, experimentSchedulesRoute } from '~/routes';
+
+const ExperimentCreateRunPageInner: React.FC = ({
+ breadcrumbPath,
+ runType,
+}) => {
+ const { experiment } = React.useContext(ExperimentContext);
+ const { namespace } = usePipelinesAPI();
+
+ const redirectLink =
+ runType === RunTypeOption.SCHEDULED
+ ? experimentSchedulesRoute(namespace, experiment?.experiment_id)
+ : experimentRunsRoute(namespace, experiment?.experiment_id);
+ return (
+
+ {experiment ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+ ]}
+ contextPath={redirectLink}
+ runType={runType}
+ contextExperiment={experiment}
+ />
+ );
+};
+
+export const ExperimentCreateRunPage: PipelineCoreDetailsPageComponent = (props) => (
+
+);
+
+export const ExperimentCreateSchedulePage: PipelineCoreDetailsPageComponent = (props) => (
+
+);
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunDetails.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunDetails.tsx
new file mode 100644
index 0000000000..d81b4b8448
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunDetails.tsx
@@ -0,0 +1,46 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link, useParams } from 'react-router-dom';
+import PipelineRunDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunDetails';
+import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
+import { ExperimentContext } from '~/pages/pipelines/global/experiments/ExperimentContext';
+import { experimentArchivedRunsRoute, experimentRunsRoute } from '~/routes';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import usePipelineRunById from '~/concepts/pipelines/apiHooks/usePipelineRunById';
+import { StorageStateKF } from '~/concepts/pipelines/kfTypes';
+
+const ExperimentPipelineRunDetails: PipelineCoreDetailsPageComponent = ({ breadcrumbPath }) => {
+ const { runId } = useParams();
+ const fetchedRun = usePipelineRunById(runId, true);
+ const { experiment } = React.useContext(ExperimentContext);
+ const { namespace } = usePipelinesAPI();
+ const [run] = fetchedRun;
+ const isRunArchived = run?.storage_state === StorageStateKF.ARCHIVED;
+ return (
+
+ {experiment ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+ ]}
+ contextPath={experimentRunsRoute(namespace, experiment?.experiment_id)}
+ fetchedRun={fetchedRun}
+ />
+ );
+};
+
+export default ExperimentPipelineRunDetails;
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunJobDetails.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunJobDetails.tsx
new file mode 100644
index 0000000000..4e0aea7e42
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunJobDetails.tsx
@@ -0,0 +1,33 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link } from 'react-router-dom';
+import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
+import { ExperimentContext } from '~/pages/pipelines/global/experiments/ExperimentContext';
+import { experimentSchedulesRoute } from '~/routes';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import PipelineRunJobDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRunJob/PipelineRunJobDetails';
+
+const ExperimentPipelineRunJobDetails: PipelineCoreDetailsPageComponent = ({ breadcrumbPath }) => {
+ const { experiment } = React.useContext(ExperimentContext);
+ const { namespace } = usePipelinesAPI();
+ return (
+
+ {experiment ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+ ]}
+ contextPath={experimentSchedulesRoute(namespace, experiment?.experiment_id)}
+ />
+ );
+};
+
+export default ExperimentPipelineRunJobDetails;
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRuns.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRuns.tsx
new file mode 100644
index 0000000000..b2c477e861
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRuns.tsx
@@ -0,0 +1,49 @@
+import * as React from 'react';
+import { Breadcrumb, BreadcrumbItem, Label, Truncate } from '@patternfly/react-core';
+import { Outlet } from 'react-router';
+import { pipelineRunsPageTitle } from '~/pages/pipelines/global/runs/const';
+import PipelineCoreApplicationPage from '~/pages/pipelines/global/PipelineCoreApplicationPage';
+import PipelineRunVersionsContextProvider from '~/pages/pipelines/global/runs/PipelineRunVersionsContext';
+import { ProjectObjectType } from '~/concepts/design/utils';
+import TitleWithIcon from '~/concepts/design/TitleWithIcon';
+import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
+import {
+ ExperimentContext,
+ useContextExperimentArchived,
+} from '~/pages/pipelines/global/experiments/ExperimentContext';
+import { experimentsBaseRoute } from '~/routes';
+
+const ExperimentPipelineRuns: PipelineCoreDetailsPageComponent = ({ breadcrumbPath }) => {
+ const { experiment } = React.useContext(ExperimentContext);
+ const isArchived = useContextExperimentArchived();
+
+ return (
+
+ }
+ description="Manage your experiment runs and schedules."
+ getRedirectPath={experimentsBaseRoute}
+ overrideChildPadding
+ breadcrumb={
+
+ {breadcrumbPath}
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ {isArchived && }
+
+ }
+ >
+
+
+
+
+ );
+};
+
+export default ExperimentPipelineRuns;
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunsTabs.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunsTabs.tsx
new file mode 100644
index 0000000000..f1eaf40142
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/experiments/ExperimentPipelineRunsTabs.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+import { PipelineRunType } from '~/pages/pipelines/global/runs';
+import GlobalPipelineRunsTabs from '~/pages/pipelines/global/runs/GlobalPipelineRunsTabs';
+import { ExperimentContext } from '~/pages/pipelines/global/experiments/ExperimentContext';
+
+type ExperimentPipelineRunsTabsProps = {
+ tab: PipelineRunType;
+};
+
+const ExperimentPipelineRunsTabs: React.FC = ({ tab }) => {
+ const { basePath } = React.useContext(ExperimentContext);
+
+ return ;
+};
+
+export default ExperimentPipelineRunsTabs;
diff --git a/frontend/src/pages/pipelines/global/experiments/ExperimentRunsListBreadcrumb.tsx b/frontend/src/pages/pipelines/global/experiments/ExperimentRunsListBreadcrumb.tsx
deleted file mode 100644
index 1b99b7143d..0000000000
--- a/frontend/src/pages/pipelines/global/experiments/ExperimentRunsListBreadcrumb.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import React from 'react';
-import { Link } from 'react-router-dom';
-import { Breadcrumb, BreadcrumbItem, Label, Truncate } from '@patternfly/react-core';
-
-import { experimentsRootPath } from '~/routes';
-import { StorageStateKF } from '~/concepts/pipelines/kfTypes';
-import { ExperimentRunsContext } from '~/pages/pipelines/global/experiments/ExperimentRunsContext';
-
-export const ExperimentRunsListBreadcrumb: React.FC = () => {
- const { experiment } = React.useContext(ExperimentRunsContext);
-
- const displayName = experiment?.display_name || 'Loading...';
-
- return (
-
-
- Experiments
-
-
-
- {/* A hack solution to get rid of the minWidth set on PF Truncate component
- So we can show correct spacing between the title and the label
- The min width is set to 12 characters:
- https://github.com/patternfly/patternfly/blob/9499f0a70a18f51474285752a04928958d901829/src/patternfly/components/Truncate/truncate.scss#L4 */}
- {displayName.length > 12 ? : <>{displayName}>}
-
- {experiment?.storage_state === StorageStateKF.ARCHIVED && }
-
- );
-};
diff --git a/frontend/src/pages/pipelines/global/experiments/artifacts/ArtifactDetails/ArtifactDetails.tsx b/frontend/src/pages/pipelines/global/experiments/artifacts/ArtifactDetails/ArtifactDetails.tsx
index f43a652aab..1ae310c802 100644
--- a/frontend/src/pages/pipelines/global/experiments/artifacts/ArtifactDetails/ArtifactDetails.tsx
+++ b/frontend/src/pages/pipelines/global/experiments/artifacts/ArtifactDetails/ArtifactDetails.tsx
@@ -61,7 +61,7 @@ export const ArtifactDetails: PipelineCoreDetailsPageComponent = ({ breadcrumbPa
loadError={artifactError}
breadcrumb={
- {breadcrumbPath()}
+ {breadcrumbPath}
diff --git a/frontend/src/pages/pipelines/global/experiments/compareRuns/CompareRunsPage.tsx b/frontend/src/pages/pipelines/global/experiments/compareRuns/CompareRunsPage.tsx
index 5f48db21af..4493785d41 100644
--- a/frontend/src/pages/pipelines/global/experiments/compareRuns/CompareRunsPage.tsx
+++ b/frontend/src/pages/pipelines/global/experiments/compareRuns/CompareRunsPage.tsx
@@ -1,15 +1,21 @@
import React from 'react';
-import { Breadcrumb, BreadcrumbItem, Stack, StackItem } from '@patternfly/react-core';
+import { Breadcrumb, BreadcrumbItem, Stack, StackItem, Truncate } from '@patternfly/react-core';
+import { Link } from 'react-router-dom';
import ApplicationsPage from '~/pages/ApplicationsPage';
import { PathProps } from '~/concepts/pipelines/content/types';
import { useCompareRuns } from '~/concepts/pipelines/content/compareRuns/CompareRunsContext';
import { CompareRunsInvalidRunCount } from '~/concepts/pipelines/content/compareRuns/CompareRunInvalidRunCount';
import CompareRunsRunList from '~/concepts/pipelines/content/compareRuns/CompareRunsRunList';
-import { CompareRunParamsSection } from './CompareRunParamsSection';
+import { ExperimentContext } from '~/pages/pipelines/global/experiments/ExperimentContext';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import { experimentRunsRoute } from '~/routes';
import { CompareRunMetricsSection } from './CompareRunsMetricsSection';
+import { CompareRunParamsSection } from './CompareRunParamsSection';
const CompareRunsPage: React.FC = ({ breadcrumbPath }) => {
const { runs, loaded } = useCompareRuns();
+ const { experiment } = React.useContext(ExperimentContext);
+ const { namespace } = usePipelinesAPI();
if (loaded && (runs.length > 10 || runs.length === 0)) {
return ;
@@ -21,7 +27,17 @@ const CompareRunsPage: React.FC = ({ breadcrumbPath }) => {
title=""
breadcrumb={
- {breadcrumbPath()}
+ {breadcrumbPath}
+
+ {experiment?.display_name ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+
Compare runs
}
diff --git a/frontend/src/pages/pipelines/global/experiments/compareRuns/ManageRunsPage.tsx b/frontend/src/pages/pipelines/global/experiments/compareRuns/ManageRunsPage.tsx
index 3c508395b5..bd8a6c7d63 100644
--- a/frontend/src/pages/pipelines/global/experiments/compareRuns/ManageRunsPage.tsx
+++ b/frontend/src/pages/pipelines/global/experiments/compareRuns/ManageRunsPage.tsx
@@ -13,11 +13,12 @@ import {
Button,
Breadcrumb,
BreadcrumbItem,
+ Truncate,
} from '@patternfly/react-core';
import { ExclamationCircleIcon, PlusCircleIcon } from '@patternfly/react-icons';
import { usePipelineActiveRunsTable } from '~/concepts/pipelines/content/tables/pipelineRun/usePipelineRunTable';
-import { CompareRunsSearchParam, PipelineRunSearchParam } from '~/concepts/pipelines/content/types';
+import { CompareRunsSearchParam } from '~/concepts/pipelines/content/types';
import {
experimentRunsRoute,
experimentsBaseRoute,
@@ -30,9 +31,9 @@ import usePipelineFilter, {
FilterOptions,
} from '~/concepts/pipelines/content/tables/usePipelineFilter';
import { ExperimentKFv2 } from '~/concepts/pipelines/kfTypes';
-import { PipelineRunTabTitle, PipelineRunType } from '~/pages/pipelines/global/runs';
+import { PipelineRunTabTitle } from '~/pages/pipelines/global/runs';
import PipelineRunVersionsContextProvider from '~/pages/pipelines/global/runs/PipelineRunVersionsContext';
-import { ExperimentRunsContext } from '~/pages/pipelines/global/experiments/ExperimentRunsContext';
+import { ExperimentContext } from '~/pages/pipelines/global/experiments/ExperimentContext';
import { getDisplayNameFromK8sResource } from '~/concepts/k8s/utils';
import { ManageRunsTable } from './ManageRunsTable';
@@ -98,10 +99,7 @@ export const ManageRunsPageInternal: React.FC = ({
data-testid="create-run-button"
variant="primary"
onClick={() =>
- navigate({
- pathname: experimentsCreateRunRoute(namespace, experiment.experiment_id),
- search: `?${PipelineRunSearchParam.RunType}=${PipelineRunType.ACTIVE}`,
- })
+ navigate(experimentsCreateRunRoute(namespace, experiment.experiment_id))
}
>
Create run
@@ -128,7 +126,8 @@ export const ManageRunsPageInternal: React.FC = ({
{experiment.display_name ? (
- {experiment.display_name}
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
) : (
'Loading...'
@@ -165,6 +164,6 @@ export const ManageRunsPageInternal: React.FC = ({
};
export const ManageRunsPage: React.FC = () => {
- const { experiment } = React.useContext(ExperimentRunsContext);
+ const { experiment } = React.useContext(ExperimentContext);
return experiment ? : null;
};
diff --git a/frontend/src/pages/pipelines/global/experiments/executions/details/ExecutionDetails.tsx b/frontend/src/pages/pipelines/global/experiments/executions/details/ExecutionDetails.tsx
index 63a3c4533b..bfef24a9c8 100644
--- a/frontend/src/pages/pipelines/global/experiments/executions/details/ExecutionDetails.tsx
+++ b/frontend/src/pages/pipelines/global/experiments/executions/details/ExecutionDetails.tsx
@@ -19,7 +19,6 @@ import { useGetArtifactTypes } from '~/concepts/pipelines/apiHooks/mlmd/useGetAr
import { useGetEventsByExecutionId } from '~/concepts/pipelines/apiHooks/mlmd/useGetEventsByExecutionId';
import { useGetExecutionById } from '~/concepts/pipelines/apiHooks/mlmd/useGetExecutionById';
import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
-import { usePipelinesAPI } from '~/concepts/pipelines/context';
import ApplicationsPage from '~/pages/ApplicationsPage';
import { inputOutputSectionTitle } from '~/pages/pipelines/global/experiments/executions/const';
import ExecutionDetailsCustomPropertiesSection from '~/pages/pipelines/global/experiments/executions/details/ExecutionDetailsCustomPropertiesSection';
@@ -32,13 +31,11 @@ import {
getExecutionDisplayName,
parseEventsByType,
} from '~/pages/pipelines/global/experiments/executions/utils';
-import { executionsBaseRoute } from '~/routes';
import { Event } from '~/third_party/mlmd';
const ExecutionDetails: PipelineCoreDetailsPageComponent = ({ breadcrumbPath, contextPath }) => {
const { executionId } = useParams();
const navigate = useNavigate();
- const { namespace } = usePipelinesAPI();
const [execution, executionLoaded, executionError] = useGetExecutionById(executionId);
const [events, eventsLoaded, eventsError] = useGetEventsByExecutionId(Number(executionId));
const [artifactTypes, artifactTypesLoaded] = useGetArtifactTypes();
@@ -75,7 +72,7 @@ const ExecutionDetails: PipelineCoreDetailsPageComponent = ({ breadcrumbPath, co
}
if (!execution) {
- navigate(contextPath ?? executionsBaseRoute(namespace));
+ navigate(contextPath);
return;
}
@@ -96,7 +93,7 @@ const ExecutionDetails: PipelineCoreDetailsPageComponent = ({ breadcrumbPath, co
loaded
breadcrumb={
- {breadcrumbPath()}
+ {breadcrumbPath}
{displayName}
}
diff --git a/frontend/src/pages/pipelines/global/experiments/executions/details/ExecutionDetailsReferenceSection.tsx b/frontend/src/pages/pipelines/global/experiments/executions/details/ExecutionDetailsReferenceSection.tsx
index b291eb8531..5dd103662b 100644
--- a/frontend/src/pages/pipelines/global/experiments/executions/details/ExecutionDetailsReferenceSection.tsx
+++ b/frontend/src/pages/pipelines/global/experiments/executions/details/ExecutionDetailsReferenceSection.tsx
@@ -4,8 +4,9 @@ import { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table';
import { Link } from 'react-router-dom';
import { Execution } from '~/third_party/mlmd';
import { useGetPipelineRunContextByExecution } from '~/concepts/pipelines/apiHooks/mlmd/useGetMlmdContextByExecution';
-import { executionDetailsRoute, routePipelineRunDetailsNamespacePipelinesPage } from '~/routes';
+import { executionDetailsRoute, experimentRunDetailsRoute } from '~/routes';
import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import usePipelineRunById from '~/concepts/pipelines/apiHooks/usePipelineRunById';
type ExecutionDetailsReferenceSectionProps = {
execution: Execution;
@@ -15,7 +16,8 @@ const ExecutionDetailsReferenceSection: React.FC {
const { namespace } = usePipelinesAPI();
- const [context, contextLoaded] = useGetPipelineRunContextByExecution(execution);
+ const [context] = useGetPipelineRunContextByExecution(execution);
+ const [run, runLoaded, runError] = usePipelineRunById(context?.getName());
const originalExecutionId = execution
.getCustomPropertiesMap()
@@ -39,16 +41,13 @@ const ExecutionDetailsReferenceSection: React.FC
Pipeline run |
- {contextLoaded ? (
- context ? (
-
- {`runs/details/${context.getName()}`}
+ {runLoaded && !runError ? (
+ run ? (
+
+ {`runs/details/${run.run_id}`}
+ ) : context?.getName() ? (
+ `runs/details/${context.getName()}`
) : (
'Unknown'
)
diff --git a/frontend/src/pages/pipelines/global/experiments/useExperimentByParams.ts b/frontend/src/pages/pipelines/global/experiments/useExperimentByParams.ts
index e908e38332..90d5d969f5 100644
--- a/frontend/src/pages/pipelines/global/experiments/useExperimentByParams.ts
+++ b/frontend/src/pages/pipelines/global/experiments/useExperimentByParams.ts
@@ -14,10 +14,10 @@ export const useExperimentByParams = (): {
// Redirect users to the Experiments list page when failing to retrieve the experiment from route params.
React.useEffect(() => {
- if (isExperimentLoaded && experimentError) {
+ if (experimentError) {
navigate(experimentsRootPath);
}
- }, [experimentError, isExperimentLoaded, navigate]);
+ }, [experimentError, navigate]);
return { experiment, isExperimentLoaded };
};
diff --git a/frontend/src/pages/pipelines/global/pipelines/GlobalPipelines.tsx b/frontend/src/pages/pipelines/global/pipelines/GlobalPipelines.tsx
index c44e3ecfff..5a5c12e387 100644
--- a/frontend/src/pages/pipelines/global/pipelines/GlobalPipelines.tsx
+++ b/frontend/src/pages/pipelines/global/pipelines/GlobalPipelines.tsx
@@ -10,7 +10,7 @@ import PipelinesView from '~/pages/pipelines/global/pipelines/PipelinesView';
import EnsureAPIAvailability from '~/concepts/pipelines/EnsureAPIAvailability';
import PipelineAndVersionContextProvider from '~/concepts/pipelines/content/PipelineAndVersionContext';
import EnsureCompatiblePipelineServer from '~/concepts/pipelines/EnsureCompatiblePipelineServer';
-import { routePipelinesNamespace } from '~/routes';
+import { pipelinesBaseRoute } from '~/routes';
import { ProjectObjectType } from '~/concepts/design/utils';
import TitleWithIcon from '~/concepts/design/TitleWithIcon';
@@ -22,7 +22,7 @@ const GlobalPipelines: React.FC = () => {
title={}
description={pipelinesPageDescription}
headerAction={}
- getRedirectPath={routePipelinesNamespace}
+ getRedirectPath={pipelinesBaseRoute}
>
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineAvailabilityLoader.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineAvailabilityLoader.tsx
new file mode 100644
index 0000000000..e4ac711730
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineAvailabilityLoader.tsx
@@ -0,0 +1,14 @@
+import React from 'react';
+import { Outlet } from 'react-router-dom';
+import EnsureAPIAvailability from '~/concepts/pipelines/EnsureAPIAvailability';
+import EnsureCompatiblePipelineServer from '~/concepts/pipelines/EnsureCompatiblePipelineServer';
+
+const PipelineAvailabilityLoader: React.FC = () => (
+
+
+
+
+
+);
+
+export default PipelineAvailabilityLoader;
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCloneRunPage.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCloneRunPage.tsx
new file mode 100644
index 0000000000..2c869d4848
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCloneRunPage.tsx
@@ -0,0 +1,34 @@
+import React from 'react';
+import { PathProps } from '~/concepts/pipelines/content/types';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import { pipelineVersionRunDetailsRoute, pipelineVersionRunsRoute } from '~/routes';
+import CloneRunPage from '~/concepts/pipelines/content/createRun/CloneRunPage';
+import { PipelineVersionContext } from '~/pages/pipelines/global/pipelines/PipelineVersionContext';
+
+const PipelineVersionCloneRunPage: React.FC = ({ breadcrumbPath }) => {
+ const { pipeline, version } = React.useContext(PipelineVersionContext);
+ const { namespace } = usePipelinesAPI();
+
+ return (
+
+ pipelineVersionRunDetailsRoute(
+ namespace,
+ version?.pipeline_id,
+ version?.pipeline_version_id,
+ runId,
+ )
+ }
+ />
+ );
+};
+
+export default PipelineVersionCloneRunPage;
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCloneSchedulePage.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCloneSchedulePage.tsx
new file mode 100644
index 0000000000..c64f0cfb15
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCloneSchedulePage.tsx
@@ -0,0 +1,73 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link } from 'react-router-dom';
+import { PathProps } from '~/concepts/pipelines/content/types';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import {
+ pipelineVersionDetailsRoute,
+ pipelineVersionScheduleDetailsRoute,
+ pipelineVersionSchedulesRoute,
+} from '~/routes';
+import CloneSchedulePage from '~/concepts/pipelines/content/createRun/CloneSchedulePage';
+import { PipelineVersionContext } from '~/pages/pipelines/global/pipelines/PipelineVersionContext';
+
+const PipelineVersionCloneSchedulePage: React.FC = ({ breadcrumbPath }) => {
+ const { pipeline, version } = React.useContext(PipelineVersionContext);
+ const { namespace } = usePipelinesAPI();
+
+ return (
+
+ {version ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+
+ {version ? (
+
+ Runs
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+ ]}
+ contextPath={pipelineVersionSchedulesRoute(
+ namespace,
+ version?.pipeline_id,
+ version?.pipeline_version_id,
+ )}
+ contextPipeline={pipeline}
+ contextPipelineVersion={version}
+ detailsRedirect={(jobId) =>
+ pipelineVersionScheduleDetailsRoute(
+ namespace,
+ version?.pipeline_id,
+ version?.pipeline_version_id,
+ jobId,
+ )
+ }
+ />
+ );
+};
+
+export default PipelineVersionCloneSchedulePage;
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineVersionContext.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionContext.tsx
new file mode 100644
index 0000000000..27fa731fc4
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionContext.tsx
@@ -0,0 +1,53 @@
+import React from 'react';
+import { Bullseye, Spinner } from '@patternfly/react-core';
+import { Outlet } from 'react-router-dom';
+import { PipelineKFv2, PipelineVersionKFv2 } from '~/concepts/pipelines/kfTypes';
+import { usePipelineVersionByParams } from '~/pages/pipelines/global/pipelines/usePipelineVersionByParams';
+import { pipelineVersionsBaseRoute } from '~/routes';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+
+type PipelineVersionContextState = {
+ pipeline: PipelineKFv2 | null;
+ version: PipelineVersionKFv2 | null;
+ basePath: string;
+};
+
+export const PipelineVersionContext = React.createContext({
+ pipeline: null,
+ version: null,
+ basePath: '',
+});
+
+const PipelineVersionContextProvider: React.FC = () => {
+ const { namespace } = usePipelinesAPI();
+ const { pipeline, version, isLoaded } = usePipelineVersionByParams();
+
+ const contextValue = React.useMemo(
+ () => ({
+ pipeline,
+ version,
+ basePath: pipelineVersionsBaseRoute(
+ namespace,
+ version?.pipeline_id,
+ version?.pipeline_version_id,
+ ),
+ }),
+ [namespace, pipeline, version],
+ );
+
+ if (!isLoaded) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+
+
+ );
+};
+
+export default PipelineVersionContextProvider;
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCreateRunPage.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCreateRunPage.tsx
new file mode 100644
index 0000000000..8621586ad7
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionCreateRunPage.tsx
@@ -0,0 +1,64 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link } from 'react-router-dom';
+import CreateRunPage from '~/concepts/pipelines/content/createRun/CreateRunPage';
+import { RunTypeOption } from '~/concepts/pipelines/content/createRun/types';
+import { PathProps, PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import {
+ pipelineVersionDetailsRoute,
+ pipelineVersionRunsRoute,
+ pipelineVersionSchedulesRoute,
+} from '~/routes';
+import { PipelineVersionContext } from '~/pages/pipelines/global/pipelines/PipelineVersionContext';
+
+const PipelineVersionCreateRunPageInner: React.FC = ({
+ breadcrumbPath,
+ runType,
+}) => {
+ const { version, pipeline } = React.useContext(PipelineVersionContext);
+ const { namespace } = usePipelinesAPI();
+
+ const redirectLink =
+ runType === RunTypeOption.SCHEDULED
+ ? pipelineVersionSchedulesRoute(namespace, version?.pipeline_id, version?.pipeline_version_id)
+ : pipelineVersionRunsRoute(namespace, version?.pipeline_id, version?.pipeline_version_id);
+ return (
+
+ {version ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+
+ {version ? Runs : 'Loading...'}
+ ,
+ ]}
+ contextPath={redirectLink}
+ runType={runType}
+ contextPipeline={pipeline}
+ contextPipelineVersion={version}
+ />
+ );
+};
+
+export const PipelineVersionCreateRunPage: PipelineCoreDetailsPageComponent = (props) => (
+
+);
+
+export const PipelineVersionCreateSchedulePage: PipelineCoreDetailsPageComponent = (props) => (
+
+);
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunDetails.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunDetails.tsx
new file mode 100644
index 0000000000..1686f80e68
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunDetails.tsx
@@ -0,0 +1,77 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link, useParams } from 'react-router-dom';
+import PipelineRunDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunDetails';
+import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
+import {
+ pipelineVersionArchivedRunsRoute,
+ pipelineVersionDetailsRoute,
+ pipelineVersionRunsRoute,
+} from '~/routes';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import { PipelineVersionContext } from '~/pages/pipelines/global/pipelines/PipelineVersionContext';
+import usePipelineRunById from '~/concepts/pipelines/apiHooks/usePipelineRunById';
+import { StorageStateKF } from '~/concepts/pipelines/kfTypes';
+
+const PipelineVersionRunDetails: PipelineCoreDetailsPageComponent = ({ breadcrumbPath }) => {
+ const { runId } = useParams();
+ const fetchedRun = usePipelineRunById(runId, true);
+ const { version } = React.useContext(PipelineVersionContext);
+ const { namespace } = usePipelinesAPI();
+ const [run] = fetchedRun;
+ const isRunArchived = run?.storage_state === StorageStateKF.ARCHIVED;
+ return (
+
+ {version ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+
+ {version ? (
+
+ Runs
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+ ]}
+ contextPath={pipelineVersionRunsRoute(
+ namespace,
+ version?.pipeline_id,
+ version?.pipeline_version_id,
+ )}
+ fetchedRun={fetchedRun}
+ />
+ );
+};
+
+export default PipelineVersionRunDetails;
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunJobDetails.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunJobDetails.tsx
new file mode 100644
index 0000000000..545d467d69
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunJobDetails.tsx
@@ -0,0 +1,58 @@
+import React from 'react';
+import { BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Link } from 'react-router-dom';
+import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
+import { pipelineVersionDetailsRoute, pipelineVersionSchedulesRoute } from '~/routes';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+import { PipelineVersionContext } from '~/pages/pipelines/global/pipelines/PipelineVersionContext';
+import PipelineRunJobDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRunJob/PipelineRunJobDetails';
+
+const PipelineVersionRunJobDetails: PipelineCoreDetailsPageComponent = ({ breadcrumbPath }) => {
+ const { version } = React.useContext(PipelineVersionContext);
+ const { namespace } = usePipelinesAPI();
+ return (
+
+ {version ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+
+ {version ? (
+
+ Runs
+
+ ) : (
+ 'Loading...'
+ )}
+ ,
+ ]}
+ contextPath={pipelineVersionSchedulesRoute(
+ namespace,
+ version?.pipeline_id,
+ version?.pipeline_version_id,
+ )}
+ />
+ );
+};
+
+export default PipelineVersionRunJobDetails;
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRuns.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRuns.tsx
new file mode 100644
index 0000000000..23aa768dc9
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRuns.tsx
@@ -0,0 +1,56 @@
+import * as React from 'react';
+import { Breadcrumb, BreadcrumbItem, Truncate } from '@patternfly/react-core';
+import { Outlet, Link } from 'react-router-dom';
+import {
+ pipelineRunsPageDescription,
+ pipelineRunsPageTitle,
+} from '~/pages/pipelines/global/runs/const';
+import PipelineCoreApplicationPage from '~/pages/pipelines/global/PipelineCoreApplicationPage';
+import { pipelinesBaseRoute, pipelineVersionDetailsRoute } from '~/routes';
+import { ProjectObjectType } from '~/concepts/design/utils';
+import TitleWithIcon from '~/concepts/design/TitleWithIcon';
+import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
+import { PipelineVersionContext } from '~/pages/pipelines/global/pipelines/PipelineVersionContext';
+import { usePipelinesAPI } from '~/concepts/pipelines/context';
+
+const PipelineVersionRuns: PipelineCoreDetailsPageComponent = ({ breadcrumbPath }) => {
+ const { namespace } = usePipelinesAPI();
+ const { version } = React.useContext(PipelineVersionContext);
+
+ return (
+
+ }
+ description={pipelineRunsPageDescription}
+ getRedirectPath={pipelinesBaseRoute}
+ overrideChildPadding
+ breadcrumb={
+
+ {breadcrumbPath}
+
+ {version?.display_name ? (
+
+ {/* TODO: Remove the custom className after upgrading to PFv6 */}
+
+
+ ) : (
+ 'Loading...'
+ )}
+
+ Runs
+
+ }
+ >
+
+
+ );
+};
+
+export default PipelineVersionRuns;
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunsTabs.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunsTabs.tsx
new file mode 100644
index 0000000000..9c3eb909a8
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelineVersionRunsTabs.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+import { PipelineRunType } from '~/pages/pipelines/global/runs';
+import GlobalPipelineRunsTabs from '~/pages/pipelines/global/runs/GlobalPipelineRunsTabs';
+import { PipelineVersionContext } from '~/pages/pipelines/global/pipelines/PipelineVersionContext';
+
+type PipelineVersionRunsTabsProps = {
+ tab: PipelineRunType;
+};
+
+const PipelineVersionRunsTabs: React.FC = ({ tab }) => {
+ const { basePath } = React.useContext(PipelineVersionContext);
+
+ return ;
+};
+
+export default PipelineVersionRunsTabs;
diff --git a/frontend/src/pages/pipelines/global/pipelines/PipelinesView.tsx b/frontend/src/pages/pipelines/global/pipelines/PipelinesView.tsx
index 9f6a16e772..fde9c4edcb 100644
--- a/frontend/src/pages/pipelines/global/pipelines/PipelinesView.tsx
+++ b/frontend/src/pages/pipelines/global/pipelines/PipelinesView.tsx
@@ -11,7 +11,7 @@ import {
getTablePagingProps,
getTableSortProps,
} from '~/concepts/pipelines/content/tables/usePipelineTable';
-import { routePipelineDetailsNamespace } from '~/routes';
+import { pipelineVersionDetailsRoute } from '~/routes';
const PipelinesView: React.FC = () => {
const [
@@ -49,7 +49,7 @@ const PipelinesView: React.FC = () => {
pipelines={pipelines}
enablePagination="compact"
refreshPipelines={refresh}
- pipelineDetailsPath={routePipelineDetailsNamespace}
+ pipelineDetailsPath={pipelineVersionDetailsRoute}
toolbarContent={}
emptyTableView={
diff --git a/frontend/src/pages/pipelines/global/pipelines/usePipelineVersionByParams.ts b/frontend/src/pages/pipelines/global/pipelines/usePipelineVersionByParams.ts
new file mode 100644
index 0000000000..4c7b5d287f
--- /dev/null
+++ b/frontend/src/pages/pipelines/global/pipelines/usePipelineVersionByParams.ts
@@ -0,0 +1,29 @@
+import React from 'react';
+import { useNavigate, useParams } from 'react-router-dom';
+import usePipelineById from '~/concepts/pipelines/apiHooks/usePipelineById';
+import usePipelineVersionById from '~/concepts/pipelines/apiHooks/usePipelineVersionById';
+import { PipelineKFv2, PipelineVersionKFv2 } from '~/concepts/pipelines/kfTypes';
+import { pipelinesBaseRoute } from '~/routes';
+
+export const usePipelineVersionByParams = (): {
+ pipeline: PipelineKFv2 | null;
+ version: PipelineVersionKFv2 | null;
+ isLoaded: boolean;
+} => {
+ const navigate = useNavigate();
+ const { pipelineId, pipelineVersionId } = useParams();
+ const [pipeline, isPipelineLoaded, pipelineError] = usePipelineById(pipelineId);
+ const [version, isVersionLoaded, versionError] = usePipelineVersionById(
+ pipelineId,
+ pipelineVersionId,
+ );
+
+ // Redirect users to the Pipeline list page when failing to retrieve the version from route params.
+ React.useEffect(() => {
+ if (pipelineError || versionError) {
+ navigate(pipelinesBaseRoute());
+ }
+ }, [versionError, navigate, pipelineError]);
+
+ return { pipeline, version, isLoaded: isPipelineLoaded && isVersionLoaded };
+};
diff --git a/frontend/src/pages/pipelines/global/runs/ActiveRuns.tsx b/frontend/src/pages/pipelines/global/runs/ActiveRuns.tsx
index 1244f7a7a4..7857fcbae4 100644
--- a/frontend/src/pages/pipelines/global/runs/ActiveRuns.tsx
+++ b/frontend/src/pages/pipelines/global/runs/ActiveRuns.tsx
@@ -16,12 +16,9 @@ import { CubesIcon, ExclamationCircleIcon, PlusCircleIcon } from '@patternfly/re
import PipelineRunTable from '~/concepts/pipelines/content/tables/pipelineRun/PipelineRunTable';
import { usePipelineActiveRunsTable } from '~/concepts/pipelines/content/tables/pipelineRun/usePipelineRunTable';
-import { PipelineRunSearchParam } from '~/concepts/pipelines/content/types';
import { createRunRoute } from '~/routes';
import { SupportedArea, useIsAreaAvailable } from '~/concepts/areas';
-import { useContextExperimentArchived } from '~/pages/pipelines/global/experiments/ExperimentRunsContext';
-import usePipelineVersionById from '~/concepts/pipelines/apiHooks/usePipelineVersionById';
-import usePipelineById from '~/concepts/pipelines/apiHooks/usePipelineById';
+import { useContextExperimentArchived } from '~/pages/pipelines/global/experiments/ExperimentContext';
import { PipelineRunTabTitle, PipelineRunType } from './types';
export const ActiveRuns: React.FC = () => {
@@ -31,8 +28,6 @@ export const ActiveRuns: React.FC = () => {
usePipelineActiveRunsTable({ experimentId, pipelineVersionId });
const isExperimentsAvailable = useIsAreaAvailable(SupportedArea.PIPELINE_EXPERIMENTS).status;
const isExperimentArchived = useContextExperimentArchived();
- const [pipeline] = usePipelineById(pipelineId);
- const [pipelineVersion] = usePipelineVersionById(pipelineId, pipelineVersionId);
if (isExperimentArchived) {
return (
@@ -97,14 +92,12 @@ export const ActiveRuns: React.FC = () => {
variant="primary"
onClick={() =>
navigate(
- {
- pathname: createRunRoute(
- namespace,
- isExperimentsAvailable ? experimentId : undefined,
- ),
- search: `?${PipelineRunSearchParam.RunType}=${PipelineRunType.ACTIVE}`,
- },
- { state: { lastPipeline: pipeline, lastVersion: pipelineVersion } },
+ createRunRoute(
+ namespace,
+ isExperimentsAvailable ? experimentId : undefined,
+ pipelineId,
+ pipelineVersionId,
+ ),
)
}
>
diff --git a/frontend/src/pages/pipelines/global/runs/CreateScheduleButton.tsx b/frontend/src/pages/pipelines/global/runs/CreateScheduleButton.tsx
index 6c6d080c9b..54f09cbbb5 100644
--- a/frontend/src/pages/pipelines/global/runs/CreateScheduleButton.tsx
+++ b/frontend/src/pages/pipelines/global/runs/CreateScheduleButton.tsx
@@ -2,12 +2,8 @@ import React from 'react';
import { Button, Tooltip } from '@patternfly/react-core';
import { useNavigate, useParams } from 'react-router-dom';
import { SupportedArea, useIsAreaAvailable } from '~/concepts/areas';
-import { PipelineRunSearchParam } from '~/concepts/pipelines/content/types';
-import { PipelineRunType } from '~/pages/pipelines/global/runs/types';
-import { scheduleRunRoute } from '~/routes';
-import { useContextExperimentArchived } from '~/pages/pipelines/global/experiments/ExperimentRunsContext';
-import usePipelineById from '~/concepts/pipelines/apiHooks/usePipelineById';
-import usePipelineVersionById from '~/concepts/pipelines/apiHooks/usePipelineVersionById';
+import { createScheduleRoute } from '~/routes';
+import { useContextExperimentArchived } from '~/pages/pipelines/global/experiments/ExperimentContext';
const CreateScheduleButton: React.FC = () => {
const navigate = useNavigate();
@@ -15,8 +11,6 @@ const CreateScheduleButton: React.FC = () => {
const isExperimentsAvailable = useIsAreaAvailable(SupportedArea.PIPELINE_EXPERIMENTS).status;
const isExperimentArchived = useContextExperimentArchived();
const tooltipRef = React.useRef(null);
- const [pipeline] = usePipelineById(pipelineId);
- const [pipelineVersion] = usePipelineVersionById(pipelineId, pipelineVersionId);
return (
<>
@@ -31,14 +25,12 @@ const CreateScheduleButton: React.FC = () => {
variant="primary"
onClick={() =>
navigate(
- {
- pathname: scheduleRunRoute(
- namespace,
- isExperimentsAvailable ? experimentId : undefined,
- ),
- search: `?${PipelineRunSearchParam.RunType}=${PipelineRunType.SCHEDULED}`,
- },
- { state: { lastPipeline: pipeline, lastVersion: pipelineVersion } },
+ createScheduleRoute(
+ namespace,
+ isExperimentsAvailable ? experimentId : undefined,
+ pipelineId,
+ pipelineVersionId,
+ ),
)
}
isAriaDisabled={isExperimentArchived}
diff --git a/frontend/src/pages/pipelines/global/runs/GlobalPipelineRuns.tsx b/frontend/src/pages/pipelines/global/runs/GlobalPipelineRuns.tsx
deleted file mode 100644
index 85a2468218..0000000000
--- a/frontend/src/pages/pipelines/global/runs/GlobalPipelineRuns.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import * as React from 'react';
-import {
- pipelineRunsPageDescription,
- pipelineRunsPageTitle,
-} from '~/pages/pipelines/global/runs/const';
-import PipelineCoreApplicationPage from '~/pages/pipelines/global/PipelineCoreApplicationPage';
-import EnsureAPIAvailability from '~/concepts/pipelines/EnsureAPIAvailability';
-import PipelineRunVersionsContextProvider from '~/pages/pipelines/global/runs/PipelineRunVersionsContext';
-import EnsureCompatiblePipelineServer from '~/concepts/pipelines/EnsureCompatiblePipelineServer';
-import { routePipelineRunsNamespace } from '~/routes';
-import { ProjectObjectType } from '~/concepts/design/utils';
-import TitleWithIcon from '~/concepts/design/TitleWithIcon';
-import GlobalPipelineRunsTabs from './GlobalPipelineRunsTabs';
-
-type GlobalPipelineRunsProps = Partial<
- Pick<
- React.ComponentProps,
- 'breadcrumb' | 'description' | 'getRedirectPath'
- >
->;
-
-const GlobalPipelineRuns: React.FC = ({
- breadcrumb,
- description = pipelineRunsPageDescription,
- getRedirectPath = routePipelineRunsNamespace,
-}) => (
-
- }
- description={description}
- getRedirectPath={getRedirectPath}
- overrideChildPadding
- breadcrumb={breadcrumb}
- >
-
-
-
-
-
-
-
-
-);
-
-export default GlobalPipelineRuns;
diff --git a/frontend/src/pages/pipelines/global/runs/GlobalPipelineRunsTabs.tsx b/frontend/src/pages/pipelines/global/runs/GlobalPipelineRunsTabs.tsx
index 62ddbacdfd..f7593e9270 100644
--- a/frontend/src/pages/pipelines/global/runs/GlobalPipelineRunsTabs.tsx
+++ b/frontend/src/pages/pipelines/global/runs/GlobalPipelineRunsTabs.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { useSearchParams } from 'react-router-dom';
+import { useNavigate } from 'react-router-dom';
import { PageSection, Tab, Tabs, TabTitleText } from '@patternfly/react-core';
import { asEnumMember } from '~/utilities/utils';
import {
@@ -9,32 +9,27 @@ import {
PipelineRunType,
PipelineRunTabTitle,
} from '~/pages/pipelines/global/runs';
-import { PipelineRunSearchParam } from '~/concepts/pipelines/content/types';
import './GlobalPipelineRunsTabs.scss';
-const GlobalPipelineRunsTab: React.FC = () => {
- const [searchParams, setSearchParams] = useSearchParams();
- const runType = asEnumMember(
- searchParams.get(PipelineRunSearchParam.RunType),
- PipelineRunType,
- );
+type GlobalPipelineRunsTabsProps = {
+ basePath: string;
+ tab: PipelineRunType;
+};
- React.useEffect(() => {
- if (runType && !Object.values(PipelineRunType).includes(runType)) {
- searchParams.delete(PipelineRunSearchParam.RunType);
- setSearchParams(searchParams);
- }
- }, [runType, searchParams, setSearchParams]);
+const GlobalPipelineRunsTabs: React.FC = ({ tab, basePath }) => {
+ const navigate = useNavigate();
return (
{
const enumValue = asEnumMember(tabId, PipelineRunType);
- if (enumValue !== null) {
- setSearchParams({ runType: enumValue });
- }
+ navigate(
+ `${basePath}/${
+ enumValue === PipelineRunType.SCHEDULED ? 'schedules' : `runs/${enumValue}`
+ }`,
+ );
}}
aria-label="Pipeline run page tabs"
role="region"
@@ -80,4 +75,4 @@ const GlobalPipelineRunsTab: React.FC = () => {
);
};
-export default GlobalPipelineRunsTab;
+export default GlobalPipelineRunsTabs;
diff --git a/frontend/src/pages/pipelines/global/runs/GlobalPipelineVersionRuns.tsx b/frontend/src/pages/pipelines/global/runs/GlobalPipelineVersionRuns.tsx
deleted file mode 100644
index 7a756cd3fc..0000000000
--- a/frontend/src/pages/pipelines/global/runs/GlobalPipelineVersionRuns.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import * as React from 'react';
-import { Link, useParams } from 'react-router-dom';
-import { Breadcrumb, BreadcrumbItem, Truncate } from '@patternfly/react-core';
-import ApplicationsPage from '~/pages/ApplicationsPage';
-import { usePipelinesAPI } from '~/concepts/pipelines/context';
-import { PipelineCoreDetailsPageComponent } from '~/concepts/pipelines/content/types';
-import usePipelineVersionById from '~/concepts/pipelines/apiHooks/usePipelineVersionById';
-import PipelineNotFound from '~/concepts/pipelines/content/pipelinesDetails/pipeline/PipelineNotFound';
-import { routePipelineDetailsNamespace } from '~/routes';
-import { ProjectObjectType } from '~/concepts/design/utils';
-import TitleWithIcon from '~/concepts/design/TitleWithIcon';
-import GlobalPipelineRunsTab from './GlobalPipelineRunsTabs';
-import { pipelineRunsPageDescription, pipelineRunsPageTitle } from './const';
-
-const GlobalPipelineVersionRuns: PipelineCoreDetailsPageComponent = ({ breadcrumbPath }) => {
- const { namespace } = usePipelinesAPI();
-
- // get pipeline and version from url
- const { pipelineId, pipelineVersionId } = useParams();
- const [pipelineVersion, pipelineVersionLoaded, pipelineVersionLoadError] = usePipelineVersionById(
- pipelineId,
- pipelineVersionId,
- );
-
- if (pipelineVersionLoadError || !pipelineVersionId || !pipelineId) {
- const title = 'Pipeline version not found';
-
- return (
-
- {breadcrumbPath()}
- {title}
-
- }
- title={title}
- empty={false}
- loaded
- >
-
-
- );
- }
-
- return (
-
- {breadcrumbPath()}
-
-
- {/* TODO: Remove the custom className after upgrading to PFv6 */}
-
-
-
- Runs
-
- }
- title={
-
- }
- description={pipelineRunsPageDescription}
- empty={false}
- loaded={pipelineVersionLoaded}
- >
-
-
- );
-};
-
-export default GlobalPipelineVersionRuns;
diff --git a/frontend/src/pages/projects/ProjectViewRoutes.tsx b/frontend/src/pages/projects/ProjectViewRoutes.tsx
index 494af7b340..308bf5fc64 100644
--- a/frontend/src/pages/projects/ProjectViewRoutes.tsx
+++ b/frontend/src/pages/projects/ProjectViewRoutes.tsx
@@ -6,21 +6,11 @@ import useModelMetricsEnabled from '~/pages/modelServing/useModelMetricsEnabled'
import ProjectsRoutes from '~/concepts/projects/ProjectsRoutes';
import ProjectPipelineBreadcrumbPage from '~/pages/projects/screens/detail/pipelines/ProjectPipelineBreadcrumbPage';
import PipelineDetails from '~/concepts/pipelines/content/pipelinesDetails/pipeline/PipelineDetails';
-import PipelineRunDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRun/PipelineRunDetails';
-import CreateRunPage from '~/concepts/pipelines/content/createRun/CreateRunPage';
-import CloneRunPage from '~/concepts/pipelines/content/createRun/CloneRunPage';
-import PipelineRunJobDetails from '~/concepts/pipelines/content/pipelinesDetails/pipelineRunJob/PipelineRunJobDetails';
import ProjectModelMetricsConfigurationPage from '~/pages/modelServing/screens/projects/ProjectModelMetricsConfigurationPage';
import ProjectModelMetricsPage from '~/pages/modelServing/screens/projects/ProjectModelMetricsPage';
import ProjectInferenceExplainabilityWrapper from '~/pages/modelServing/screens/projects/ProjectInferenceExplainabilityWrapper';
import { SupportedArea, useIsAreaAvailable } from '~/concepts/areas';
-import {
- globPipelineDetails,
- globPipelineRunClone,
- globPipelineRunCreate,
- globPipelineRunDetails,
- globPipelineRunJobDetails,
-} from '~/routes';
+import { globPipelineDetails } from '~/routes';
import ProjectDetails from './screens/detail/ProjectDetails';
import ProjectView from './screens/projects/ProjectView';
import ProjectDetailsContextProvider from './ProjectDetailsContext';
@@ -65,27 +55,6 @@ const ProjectViewRoutes: React.FC = () => {
path={globPipelineDetails}
element={}
/>
-
- }
- />
-
- }
- />
- }
- />
- }
- />
-
} />
} />
diff --git a/frontend/src/pages/projects/screens/detail/pipelines/PipelinesList.tsx b/frontend/src/pages/projects/screens/detail/pipelines/PipelinesList.tsx
index 3f648cec39..4db55c3b21 100644
--- a/frontend/src/pages/projects/screens/detail/pipelines/PipelinesList.tsx
+++ b/frontend/src/pages/projects/screens/detail/pipelines/PipelinesList.tsx
@@ -8,7 +8,7 @@ import { usePipelinesAPI } from '~/concepts/pipelines/context';
import EmptyStateErrorMessage from '~/components/EmptyStateErrorMessage';
import { TABLE_CONTENT_LIMIT } from '~/concepts/pipelines/const';
import usePipelinesTable from '~/concepts/pipelines/content/tables/pipeline/usePipelinesTable';
-import { routePipelinesNamespace, routeProjectPipelineDetailsNamespace } from '~/routes';
+import { pipelinesBaseRoute, routeProjectPipelineDetailsNamespace } from '~/routes';
import NoPipelineServer from '~/concepts/pipelines/NoPipelineServer';
type PipelinesListProps = {
@@ -64,7 +64,7 @@ const PipelinesList: React.FC = ({ setIsPipelinesEmpty }) =>
{totalSize > TABLE_CONTENT_LIMIT && (
-
diff --git a/frontend/src/pages/projects/screens/detail/pipelines/ProjectPipelineBreadcrumbPage.tsx b/frontend/src/pages/projects/screens/detail/pipelines/ProjectPipelineBreadcrumbPage.tsx
index 4f51b1606d..86057f3a3b 100644
--- a/frontend/src/pages/projects/screens/detail/pipelines/ProjectPipelineBreadcrumbPage.tsx
+++ b/frontend/src/pages/projects/screens/detail/pipelines/ProjectPipelineBreadcrumbPage.tsx
@@ -19,7 +19,7 @@ const ProjectPipelineBreadcrumbPage: React.FC = ({
return (
[
+ breadcrumbPath={[
Data Science Projects}
diff --git a/frontend/src/routes/pipelines/experiments.ts b/frontend/src/routes/pipelines/experiments.ts
index 56c8566320..5224b0f999 100644
--- a/frontend/src/routes/pipelines/experiments.ts
+++ b/frontend/src/routes/pipelines/experiments.ts
@@ -1,9 +1,7 @@
-import { PipelineRunType } from '~/pages/pipelines/global/runs';
-
export const experimentsRootPath = '/experiments';
export const globExperimentsAll = `${experimentsRootPath}/*`;
-export const experimentsBaseRoute = (namespace: string | undefined): string =>
+export const experimentsBaseRoute = (namespace?: string): string =>
!namespace ? experimentsRootPath : `${experimentsRootPath}/${namespace}`;
export const experimentsTabRoute = (
@@ -16,7 +14,7 @@ export const experimentsCreateRunRoute = (
experimentId: string,
): string => `${experimentRunsRoute(namespace, experimentId)}/create`;
-export const experimentsScheduleRunRoute = (
+export const experimentsCreateScheduleRoute = (
namespace: string | undefined,
experimentId: string,
): string => `${experimentSchedulesRoute(namespace, experimentId)}/create`;
@@ -33,16 +31,23 @@ export const experimentsCloneScheduleRoute = (
recurringRunId: string,
): string => `${experimentSchedulesRoute(namespace, experimentId)}/clone/${recurringRunId}`;
-export const experimentRunsRoute = (
+export const experimentRoute = (
namespace: string | undefined,
experimentId: string | undefined,
- runType?: PipelineRunType | null,
): string =>
!experimentId
? experimentsBaseRoute(namespace)
- : `${experimentsBaseRoute(namespace)}/${experimentId}/runs${
- runType ? `?runType=${runType}` : ''
- }`;
+ : `${experimentsBaseRoute(namespace)}/${experimentId}`;
+
+export const experimentRunsRoute = (
+ namespace: string | undefined,
+ experimentId: string | undefined,
+): string => `${experimentRoute(namespace, experimentId)}/runs`;
+
+export const experimentArchivedRunsRoute = (
+ namespace: string | undefined,
+ experimentId: string | undefined,
+): string => `${experimentRunsRoute(namespace, experimentId)}/archived`;
export const experimentSchedulesRoute = (
namespace: string | undefined,
diff --git a/frontend/src/routes/pipelines/global.ts b/frontend/src/routes/pipelines/global.ts
index 32fa3276b2..5621694f86 100644
--- a/frontend/src/routes/pipelines/global.ts
+++ b/frontend/src/routes/pipelines/global.ts
@@ -1,92 +1,99 @@
-import { PipelineRunType } from '~/pages/pipelines/global/runs';
-
const globNamespace = ':namespace';
export const globNamespaceAll = `/${globNamespace}?/*`;
+export const pipelinesRootPath = '/pipelines';
const globPipelineId = ':pipelineId';
const globPipelineVersionId = ':pipelineVersionId';
-const globPipelineRunId = ':runId';
-const globPipelineRunJobId = ':recurringRunId';
// pipelines and versions
-const globPipeline = 'pipeline';
-const globPipelines = `${globPipeline}s`;
export const routePipelineDetails = (pipelineId: string, versionId: string): string =>
- `${globPipeline}/view/${pipelineId}/${versionId}`;
+ `${pipelineId}/${versionId}/view`;
export const routePipelineVersionRuns = (pipelineId: string, versionId: string): string =>
- `${globPipeline}/runs/${pipelineId}/${versionId}`;
-export const routePipelines = (): string => `/${globPipelines}`;
-export const globPipelinesAll = `${routePipelines()}/*`;
-export const globPipelineDetails = routePipelineDetails(globPipelineId, globPipelineVersionId);
-export const globPipelineVersionRuns = routePipelineVersionRuns(
+ `${pipelineId}/${versionId}/runs`;
+export const globPipelinesAll = `${pipelinesRootPath}/*`;
+export const globPipelineDetails = `pipelines/${routePipelineDetails(
globPipelineId,
globPipelineVersionId,
-);
-export const routePipelinesNamespace = (namespace?: string): string =>
- namespace ? `/${globPipelines}/${namespace}` : routePipelines();
-export const routePipelineDetailsNamespace = (
- namespace: string,
- pipelineId: string,
- versionId: string,
-): string => `${routePipelinesNamespace(namespace)}/${routePipelineDetails(pipelineId, versionId)}`;
-export const routePipelineVersionRunsNamespace = (
- namespace: string,
- pipelineId: string,
- versionId: string,
- runType?: PipelineRunType,
+)}`;
+
+export const pipelinesBaseRoute = (namespace?: string): string =>
+ !namespace ? pipelinesRootPath : `${pipelinesRootPath}/${namespace}`;
+
+export const pipelineVersionsBaseRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
): string =>
- `${routePipelinesNamespace(namespace)}/${routePipelineVersionRuns(pipelineId, versionId)}${
- runType ? `?runType=${runType}` : ''
- }`;
-export const routePipelineRunCreateNamespacePipelinesPage = (namespace?: string): string =>
- `${routePipelinesNamespace(namespace)}/${globPipelineRunCreate}`;
-export const routePipelineRunCloneNamespacePipelinesPage = (
- namespace: string,
+ !pipelineId || !pipelineVersionId
+ ? pipelinesBaseRoute(namespace)
+ : `${pipelinesBaseRoute(namespace)}/${pipelineId}/${pipelineVersionId}`;
+
+export const pipelineVersionRunsRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
+): string => `${pipelineVersionsBaseRoute(namespace, pipelineId, pipelineVersionId)}/runs`;
+
+export const pipelineVersionArchivedRunsRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
+): string => `${pipelineVersionRunsRoute(namespace, pipelineId, pipelineVersionId)}/archived`;
+
+export const pipelineVersionSchedulesRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
+): string => `${pipelineVersionsBaseRoute(namespace, pipelineId, pipelineVersionId)}/schedules`;
+
+export const pipelineVersionDetailsRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
+): string => `${pipelineVersionsBaseRoute(namespace, pipelineId, pipelineVersionId)}/view`;
+
+export const pipelineVersionCreateRunRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId?: string,
+): string => `${pipelineVersionRunsRoute(namespace, pipelineId, pipelineVersionId)}/create`;
+
+export const pipelineVersionCreateScheduleRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId?: string,
+): string => `${pipelineVersionSchedulesRoute(namespace, pipelineId, pipelineVersionId)}/create`;
+
+export const pipelineVersionCloneRunRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
runId: string,
-): string => `${routePipelinesNamespace(namespace)}/${routePipelineRunClone(runId)}`;
-export const routePipelineRunJobCloneNamespacePipelinesPage = (
- namespace: string,
- jobId: string,
-): string => `${routePipelinesNamespace(namespace)}/${routePipelineRunJobClone(jobId)}`;
-export const routePipelineRunDetailsNamespacePipelinesPage = (
+): string => `${pipelineVersionRunsRoute(namespace, pipelineId, pipelineVersionId)}/clone/${runId}`;
+
+export const pipelineVersionCloneScheduleRoute = (
+ namespace: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
+ recurringRunId: string,
+): string =>
+ `${pipelineVersionSchedulesRoute(
+ namespace,
+ pipelineId,
+ pipelineVersionId,
+ )}/clone/${recurringRunId}`;
+
+export const pipelineVersionRunDetailsRoute = (
namespace: string,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
runId: string,
-): string => `${routePipelinesNamespace(namespace)}/${routePipelineRunDetails(runId)}`;
-export const routePipelineRunJobDetailsNamespacePipelinesPage = (
- namespace: string,
- jobId: string,
-): string => `${routePipelinesNamespace(namespace)}/${routePipelineRunJobDetails(jobId)}`;
-
-// pipeline runs
-const globPipelineRun = 'pipelineRun';
-const globPipelineRuns = `${globPipelineRun}s`;
-export const routePipelineRuns = (): string => `/${globPipelineRuns}`;
-export const globPipelineRunsAll = `${routePipelineRuns()}/*`;
-export const routePipelineRunDetails = (runId: string): string =>
- `${globPipelineRun}/view/${runId}`;
-export const routePipelineRunsNamespace = (namespace?: string): string =>
- namespace ? `${routePipelineRuns()}/${namespace}` : routePipelineRuns();
-export const globPipelineRunDetails = routePipelineRunDetails(globPipelineRunId);
-export const routePipelineRunDetailsNamespace = (namespace: string, runId: string): string =>
- `${routePipelineRunsNamespace(namespace)}/${routePipelineRunDetails(runId)}`;
-export const globPipelineRunCreate = `${globPipelineRun}/create`;
-export const routePipelineRunCreateNamespace = (namespace?: string): string =>
- namespace
- ? `${routePipelineRunsNamespace(namespace)}/${globPipelineRunCreate}`
- : routePipelineRunsNamespace(namespace);
-const routePipelineRunClone = (runId: string): string => `${globPipelineRun}/clone/${runId}`;
-export const globPipelineRunClone = routePipelineRunClone(globPipelineRunId);
-export const routePipelineRunCloneNamespace = (namespace: string, runId: string): string =>
- `${routePipelineRunsNamespace(namespace)}/${routePipelineRunClone(runId)}`;
+): string => `${pipelineVersionRunsRoute(namespace, pipelineId, pipelineVersionId)}/${runId}`;
-// pipeline run jobs
-const globPipelineRunJob = 'pipelineRunJob';
-export const routePipelineRunJobDetails = (jobId: string): string =>
- `${globPipelineRunJob}/view/${jobId}`;
-export const globPipelineRunJobDetails = routePipelineRunJobDetails(globPipelineRunJobId);
-export const routePipelineRunJobDetailsNamespace = (namespace: string, jobId: string): string =>
- `${routePipelineRunsNamespace(namespace)}/${routePipelineRunJobDetails(jobId)}`;
-const routePipelineRunJobClone = (jobId: string): string => `${globPipelineRun}/cloneJob/${jobId}`;
-export const globPipelineRunJobClone = routePipelineRunJobClone(globPipelineRunJobId);
-export const routePipelineRunJobCloneNamespace = (namespace: string, jobId: string): string =>
- `${routePipelineRunsNamespace(namespace)}/${routePipelineRunJobClone(jobId)}`;
+export const pipelineVersionScheduleDetailsRoute = (
+ namespace: string,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
+ recurringRunId: string,
+): string =>
+ `${pipelineVersionSchedulesRoute(namespace, pipelineId, pipelineVersionId)}/${recurringRunId}`;
diff --git a/frontend/src/routes/pipelines/project.ts b/frontend/src/routes/pipelines/project.ts
index 7c3f8054bc..7892b9bef7 100644
--- a/frontend/src/routes/pipelines/project.ts
+++ b/frontend/src/routes/pipelines/project.ts
@@ -5,4 +5,5 @@ export const routeProjectPipelineDetailsNamespace = (
namespace: string,
pipelineId: string,
versionId: string,
-): string => `${routeProjectsNamespace(namespace)}/${routePipelineDetails(pipelineId, versionId)}`;
+): string =>
+ `${routeProjectsNamespace(namespace)}/pipelines/${routePipelineDetails(pipelineId, versionId)}`;
diff --git a/frontend/src/routes/pipelines/runs.ts b/frontend/src/routes/pipelines/runs.ts
index d86f555e1a..f57ff1ed45 100644
--- a/frontend/src/routes/pipelines/runs.ts
+++ b/frontend/src/routes/pipelines/runs.ts
@@ -1,9 +1,10 @@
import {
- routePipelineRunCloneNamespacePipelinesPage,
- routePipelineRunCreateNamespacePipelinesPage,
- routePipelineRunDetailsNamespacePipelinesPage,
- routePipelineRunJobCloneNamespacePipelinesPage,
- routePipelineRunJobDetailsNamespacePipelinesPage,
+ pipelineVersionCloneRunRoute,
+ pipelineVersionCloneScheduleRoute,
+ pipelineVersionCreateRunRoute,
+ pipelineVersionCreateScheduleRoute,
+ pipelineVersionRunDetailsRoute,
+ pipelineVersionScheduleDetailsRoute,
} from './global';
import {
experimentRunDetailsRoute,
@@ -11,57 +12,69 @@ import {
experimentsCloneRunRoute,
experimentsCloneScheduleRoute,
experimentsCreateRunRoute,
- experimentsScheduleRunRoute,
+ experimentsCreateScheduleRoute,
} from './experiments';
export const cloneScheduleRoute = (
namespace: string,
recurringRunId: string,
experimentId: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
): string =>
experimentId
? experimentsCloneScheduleRoute(namespace, experimentId, recurringRunId)
- : routePipelineRunJobCloneNamespacePipelinesPage(namespace, recurringRunId);
+ : pipelineVersionCloneScheduleRoute(namespace, pipelineId, pipelineVersionId, recurringRunId);
-export const scheduleRunRoute = (
+export const createScheduleRoute = (
namespace: string | undefined,
experimentId: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
): string =>
experimentId
- ? experimentsScheduleRunRoute(namespace, experimentId)
- : routePipelineRunCreateNamespacePipelinesPage(namespace);
+ ? experimentsCreateScheduleRoute(namespace, experimentId)
+ : pipelineVersionCreateScheduleRoute(namespace, pipelineId, pipelineVersionId);
export const createRunRoute = (
namespace: string | undefined,
experimentId: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
): string =>
experimentId
? experimentsCreateRunRoute(namespace, experimentId)
- : routePipelineRunCreateNamespacePipelinesPage(namespace);
+ : pipelineVersionCreateRunRoute(namespace, pipelineId, pipelineVersionId);
export const scheduleDetailsRoute = (
namespace: string,
recurringRunId: string,
experimentId: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
): string =>
experimentId
? experimentScheduleDetailsRoute(namespace, experimentId, recurringRunId)
- : routePipelineRunJobDetailsNamespacePipelinesPage(namespace, recurringRunId);
+ : pipelineVersionScheduleDetailsRoute(namespace, pipelineId, pipelineVersionId, recurringRunId);
export const runDetailsRoute = (
namespace: string,
runId: string,
experimentId: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
): string =>
experimentId
? experimentRunDetailsRoute(namespace, experimentId, runId)
- : routePipelineRunDetailsNamespacePipelinesPage(namespace, runId);
+ : pipelineVersionRunDetailsRoute(namespace, pipelineId, pipelineVersionId, runId);
export const cloneRunRoute = (
namespace: string,
runId: string,
experimentId: string | undefined,
+ pipelineId: string | undefined,
+ pipelineVersionId: string | undefined,
): string =>
experimentId
? experimentsCloneRunRoute(namespace, experimentId, runId)
- : routePipelineRunCloneNamespacePipelinesPage(namespace, runId);
+ : pipelineVersionCloneRunRoute(namespace, pipelineId, pipelineVersionId, runId);
diff --git a/frontend/src/utilities/NavData.tsx b/frontend/src/utilities/NavData.tsx
index d8522e0b59..c26ea93ee8 100644
--- a/frontend/src/utilities/NavData.tsx
+++ b/frontend/src/utilities/NavData.tsx
@@ -5,8 +5,7 @@ import {
artifactsRootPath,
executionsRootPath,
experimentsRootPath,
- routePipelineRuns,
- routePipelines,
+ pipelinesRootPath,
} from '~/routes';
type NavDataCommon = {
@@ -67,18 +66,7 @@ const useDSPipelinesNav = (): NavDataItem[] => {
}
return [
- ...(isExperimentsAvailable
- ? [{ id: 'pipelines', label: 'Data Science Pipelines', href: routePipelines() }]
- : [
- {
- id: 'pipelines',
- group: { id: 'pipelines', title: 'Data Science Pipelines' },
- children: [
- { id: 'global-pipelines', label: 'Pipelines', href: routePipelines() },
- { id: 'global-pipeline-runs', label: 'Runs', href: routePipelineRuns() },
- ],
- },
- ]),
+ { id: 'pipelines', label: 'Data Science Pipelines', href: pipelinesRootPath },
...(isExperimentsAvailable
? [
{
| |