diff --git a/frontend/packages/shipwright-plugin/console-extensions.json b/frontend/packages/shipwright-plugin/console-extensions.json index e873707a6bc..a57c6a06f2e 100644 --- a/frontend/packages/shipwright-plugin/console-extensions.json +++ b/frontend/packages/shipwright-plugin/console-extensions.json @@ -110,75 +110,87 @@ } }, { - "type": "console.navigation/resource-ns", + "type": "console.flag/model", "properties": { - "perspective": "admin", - "section": "builds", - "id": "shipwright-builds", - "name": "%shipwright-plugin~Shipwright Builds%", "model": { "group": "shipwright.io", "version": "v1alpha1", - "kind": "Build" - } - }, - "flags": { - "required": ["SHIPWRIGHT_BUILD_V1ALPHA1"], - "disallowed": ["SHIPWRIGHT_BUILD"] + "kind": "BuildStrategy" + }, + "flag": "SHIPWRIGHT_BUILDSTRATEGY_V1ALPHA1" } }, { - "type": "console.navigation/resource-ns", + "type": "console.flag/model", + "properties": { + "model": { + "group": "shipwright.io", + "version": "v1beta1", + "kind": "BuildStrategy" + }, + "flag": "SHIPWRIGHT_BUILDSTRATEGY" + } + }, + { + "type": "console.flag/model", "properties": { - "perspective": "admin", - "section": "builds", - "id": "shipwright-buildruns", - "insertAfter": "shipwright-buildruns", - "name": "%shipwright-plugin~Shipwright BuildRuns%", "model": { "group": "shipwright.io", "version": "v1alpha1", - "kind": "BuildRun" - } - }, - "flags": { - "required": ["SHIPWRIGHT_BUILDRUN_V1ALPHA1"], - "disallowed": ["SHIPWRIGHT_BUILDRUN"] + "kind": "ClusterBuildStrategy" + }, + "flag": "SHIPWRIGHT_CLUSTERBUILDSTRATEGY_V1ALPHA1" } }, { - "type": "console.navigation/resource-ns", + "type": "console.flag/model", "properties": { - "perspective": "admin", - "section": "builds", - "id": "shipwright-builds", - "name": "%shipwright-plugin~Shipwright Builds%", "model": { "group": "shipwright.io", "version": "v1beta1", - "kind": "Build" - } + "kind": "ClusterBuildStrategy" + }, + "flag": "SHIPWRIGHT_CLUSTERBUILDSTRATEGY" + } + }, + { + "type": "console.navigation/href", + "properties": { + "id": "shipwright-tablistpage", + "section": "builds", + "perspective": "admin", + "prefixNamespaced": true, + "href": "/shipwright.io", + "name": "%shipwright-plugin~Shipwright%" }, "flags": { "required": ["SHIPWRIGHT_BUILD"] } }, { - "type": "console.navigation/resource-ns", + "type": "console.navigation/href", "properties": { - "perspective": "admin", + "id": "shipwright-tablistpage-2", "section": "builds", - "id": "shipwright-buildruns", - "insertAfter": "shipwright-buildruns", - "name": "%shipwright-plugin~Shipwright BuildRuns%", - "model": { - "group": "shipwright.io", - "version": "v1beta1", - "kind": "BuildRun" - } + "perspective": "admin", + "prefixNamespaced": true, + "href": "/shipwright.io", + "name": "%shipwright-plugin~Shipwright%" }, "flags": { - "required": ["SHIPWRIGHT_BUILDRUN"] + "required": ["SHIPWRIGHT_BUILD_V1ALPHA1"], + "disallowed": ["SHIPWRIGHT_BUILD"] + } + }, + { + "type": "console.page/route", + "properties": { + "exact": false, + "path": ["/k8s/all-namespaces/shipwright.io", "/k8s/ns/:ns/shipwright.io"], + "perspective": "admin", + "component": { + "$codeRef": "pages.ShipwrightTabListPage" + } } }, { @@ -225,6 +237,58 @@ "component": { "$codeRef": "pages.BuildDetailsPage" } } }, + { + "type": "console.page/resource/details", + "properties": { + "model": { + "group": "shipwright.io", + "version": "v1alpha1", + "kind": "BuildStrategy" + }, + "component": { + "$codeRef": "pages.BuildStrategyDetailsPage" + } + } + }, + { + "type": "console.page/resource/details", + "properties": { + "model": { + "group": "shipwright.io", + "version": "v1beta1", + "kind": "BuildStrategy" + }, + "component": { + "$codeRef": "pages.BuildStrategyDetailsPage" + } + } + }, + { + "type": "console.page/resource/details", + "properties": { + "model": { + "group": "shipwright.io", + "version": "v1alpha1", + "kind": "ClusterBuildStrategy" + }, + "component": { + "$codeRef": "pages.ClusterBuildStrategyDetailsPage" + } + } + }, + { + "type": "console.page/resource/details", + "properties": { + "model": { + "group": "shipwright.io", + "version": "v1beta1", + "kind": "ClusterBuildStrategy" + }, + "component": { + "$codeRef": "pages.ClusterBuildStrategyDetailsPage" + } + } + }, { "type": "console.page/resource/list", "properties": { diff --git a/frontend/packages/shipwright-plugin/integration-tests/features/e2e/shipwright-ci.feature b/frontend/packages/shipwright-plugin/integration-tests/features/e2e/shipwright-ci.feature index 00aa42970aa..ef6d81dc3f9 100644 --- a/frontend/packages/shipwright-plugin/integration-tests/features/e2e/shipwright-ci.feature +++ b/frontend/packages/shipwright-plugin/integration-tests/features/e2e/shipwright-ci.feature @@ -6,7 +6,6 @@ Feature: Shipwright build details page Given user has installed Shipwright Operator And user is at developer perspective And user has created or selected namespace "aut-shipwright-build-details" - And user is at Add page And user has created shipwright builds @smoke @@ -17,11 +16,14 @@ Feature: Shipwright build details page @smoke - Scenario: Shipwright build page in admin perspective: SWB-01-TC02 + Scenario: Shipwright page in admin perspective: SWB-01-TC02 When user switches to Administrative perspective And user clicks on Builds navigation in Administrative perspective - Then user will see "Shipwright Builds" tab - Then user will see "Shipwright BuildRuns" tab + And user clicks on "Shipwright" tab in the Administrator perspective + Then user will see "Builds" horizontal link tab + And user will see "BuildRuns" horizontal link tab + And user will see "BuildStrategies" horizontal link tab + And user will see "ClusterBuildStrategies" horizontal link tab @regression @@ -42,7 +44,7 @@ Feature: Shipwright build details page @regression Scenario: Filter in Shipwright build runs page: SWB-01-TC05 Given user is at Shipwright Builds details page for build "buildpack-nodejs-build-heroku" - When user clicks on "BuildRuns" tab + When user clicks on "BuildRuns" tab in the Developer perspective And user clicks on Filter Then user will see "Pending", "Running", "Succeeded", "Failed" and "Unknown" options @@ -50,7 +52,7 @@ Feature: Shipwright build details page @regression Scenario: Shipwright build runs details page: SWB-01-TC06 Given user is at Shipwright Builds details page for build "buildpack-nodejs-build-heroku" - When user clicks on "BuildRuns" tab + When user clicks on "BuildRuns" tab in the Developer perspective And user clicks on build run "buildpack-nodejs-build-heroku-1" Then user will see "BuildRun details" section And user will see "Conditions" section @@ -60,7 +62,7 @@ Feature: Shipwright build details page @regression Scenario: Event tab in build details page: SWB-01-TC07 Given user is at Shipwright Builds details page for build "buildpack-nodejs-build-heroku" - When user clicks on "BuildRuns" tab + When user clicks on "BuildRuns" tab in the Developer perspective And user clicks on build run "buildpack-nodejs-build-heroku-1" And user clicks on Event tab Then user will see events steaming diff --git a/frontend/packages/shipwright-plugin/integration-tests/features/shipwright-table.feature b/frontend/packages/shipwright-plugin/integration-tests/features/shipwright-table.feature index 36e5370530a..a021e7ac552 100644 --- a/frontend/packages/shipwright-plugin/integration-tests/features/shipwright-table.feature +++ b/frontend/packages/shipwright-plugin/integration-tests/features/shipwright-table.feature @@ -13,7 +13,7 @@ Feature: Shipwright builds table view @smoke Scenario: Shipwright Builds Table should contain all the required headers: SWB-03-TC01 Given user is at Builds page - When user clicks on "Shipwright Builds" tab + When user clicks on "Shipwright Builds" tab in the Developer perspective Then user will see "Name" And user will see "Output" And user will see "Last run" diff --git a/frontend/packages/shipwright-plugin/integration-tests/support/step-definitions/builds/shipwright-build-detail-page.ts b/frontend/packages/shipwright-plugin/integration-tests/support/step-definitions/builds/shipwright-build-detail-page.ts index c109c4ae91c..83a46ab1fbb 100644 --- a/frontend/packages/shipwright-plugin/integration-tests/support/step-definitions/builds/shipwright-build-detail-page.ts +++ b/frontend/packages/shipwright-plugin/integration-tests/support/step-definitions/builds/shipwright-build-detail-page.ts @@ -48,10 +48,14 @@ Then('user will see {string}, {string} and {string} in Filter list', (el1, el2, cy.get(buildPO.filterList).should('contain', el1).and('contain', el2).and('contain', el3); }); -When('user clicks on {string} tab', (tab: string) => { +When('user clicks on {string} tab in the Developer perspective', (tab: string) => { cy.byLegacyTestID(`horizontal-link-${tab}`).should('be.visible').click(); }); +When('user clicks on {string} tab in the Administrator perspective', (tab: string) => { + cy.byTestID(`nav`).contains(tab).should('be.visible').click(); +}); + When('user clicks on Event tab', () => { cy.get(buildPO.eventTab).should('be.visible').click(); }); @@ -96,6 +100,14 @@ When( }, ); +Then('user will see {string} horizontal link tab', (tab: string) => { + cy.get(`[data-test-id='horizontal-link-${tab}']`).should('be.visible'); +}); + +When('user clicks on {string} horizontal link tab', (tab: string) => { + cy.get(`[data-test-id='horizontal-link-${tab}']`).should('be.visible').click(); +}); + When('user clicks on build run {string}', (buildRun: string) => { cy.byLegacyTestID(`${buildRun}`).click(); }); diff --git a/frontend/packages/shipwright-plugin/locales/en/shipwright-plugin.json b/frontend/packages/shipwright-plugin/locales/en/shipwright-plugin.json index cd5baf61079..c39b6d2682f 100644 --- a/frontend/packages/shipwright-plugin/locales/en/shipwright-plugin.json +++ b/frontend/packages/shipwright-plugin/locales/en/shipwright-plugin.json @@ -3,8 +3,7 @@ "Builds": "Builds", "BuildRun": "BuildRun", "BuildRuns": "BuildRuns", - "Shipwright Builds": "Shipwright Builds", - "Shipwright BuildRuns": "Shipwright BuildRuns", + "Shipwright": "Shipwright", "Start": "Start", "Start last run": "Start last run", "Rerun": "Rerun", @@ -60,9 +59,9 @@ "{{count}} second_other": "{{count}} seconds", "{{sec}}s": "{{sec}}s", "Started": "Started", + "BuildStrategy": "BuildStrategy", "ClusterBuildStrategy": "ClusterBuildStrategy", "ClusterBuildStrategies": "ClusterBuildStrategies", - "BuildStrategy": "BuildStrategy", "BuildStrategies": "BuildStrategies", "Buildah": "Buildah", "Source-to-Image": "Source-to-Image" diff --git a/frontend/packages/shipwright-plugin/src/components/build-details/BuildDetailsPage.tsx b/frontend/packages/shipwright-plugin/src/components/build-details/BuildDetailsPage.tsx index d8a5b8e8cb8..4006d9663c2 100644 --- a/frontend/packages/shipwright-plugin/src/components/build-details/BuildDetailsPage.tsx +++ b/frontend/packages/shipwright-plugin/src/components/build-details/BuildDetailsPage.tsx @@ -7,6 +7,7 @@ import { ActionMenuVariant, ActionServiceProvider, } from '@console/shared/src/components/actions'; +import { useShipwrightBreadcrumbsFor } from '../../utils'; import BuildDetailsTab from './BuildDetailsTab'; import BuildEventsTab from './BuildEventsTab'; import BuildRunsTab from './BuildRunsTab'; @@ -38,7 +39,14 @@ const BuildDetailsPage: React.FC = (props) => { navFactory.events(BuildEventsTab), ]; - return ; + return ( + + ); }; export default BuildDetailsPage; diff --git a/frontend/packages/shipwright-plugin/src/components/build-list/BuildListPage.tsx b/frontend/packages/shipwright-plugin/src/components/build-list/BuildListPage.tsx index 128164b6f7e..a766915b0f0 100644 --- a/frontend/packages/shipwright-plugin/src/components/build-list/BuildListPage.tsx +++ b/frontend/packages/shipwright-plugin/src/components/build-list/BuildListPage.tsx @@ -1,11 +1,10 @@ import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { useFlag } from '@console/dynamic-plugin-sdk/src/lib-core'; import { ListPage, ListPageProps } from '@console/internal/components/factory'; import { RowFilter } from '@console/internal/components/filter-toolbar'; import { referenceForModel } from '@console/internal/module/k8s'; -import { BuildModel, BuildModelV1Alpha1 } from '../../models'; import { Build } from '../../types'; +import { useBuildModel } from '../../utils'; import { getBuildRunStatus } from '../buildrun-status/BuildRunStatus'; import { BuildTable } from './BuildTable'; @@ -43,14 +42,12 @@ const BuildListPage: React.FC = (props) => { }, ]; + const buildModel = useBuildModel(); + return ( = (props) => { getResourceStatus={getBuildRunStatus} customActionMenu={customActionMenu} pages={pages} + breadcrumbsFor={useShipwrightBreadcrumbsFor} /> ); }; diff --git a/frontend/packages/shipwright-plugin/src/components/buildrun-list/BuildRunListPage.tsx b/frontend/packages/shipwright-plugin/src/components/buildrun-list/BuildRunListPage.tsx index e4158fe334b..ecc71a1171e 100644 --- a/frontend/packages/shipwright-plugin/src/components/buildrun-list/BuildRunListPage.tsx +++ b/frontend/packages/shipwright-plugin/src/components/buildrun-list/BuildRunListPage.tsx @@ -1,11 +1,10 @@ import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { useFlag } from '@console/dynamic-plugin-sdk/src/lib-core'; import { ListPage } from '@console/internal/components/factory'; import { RowFilter } from '@console/internal/components/filter-toolbar'; import { referenceForModel } from '@console/internal/module/k8s'; -import { BuildRunModel, BuildRunModelV1Alpha1 } from '../../models'; import { BuildRun, ComputedBuildRunStatus } from '../../types'; +import { useBuildRunModel } from '../../utils'; import { getBuildRunStatus } from '../buildrun-status/BuildRunStatus'; import { BuildRunTable } from './BuildRunTable'; @@ -35,14 +34,12 @@ const BuildRunListPage: React.FC = (props) => { }, ]; + const buildRunModel = useBuildRunModel(); + return ( = (props) => { + const pages: Page[] = [navFactory.details(DetailsForKind), navFactory.editYaml()]; + + return ; +}; + +export default BuildStrategyPage; diff --git a/frontend/packages/shipwright-plugin/src/components/clusterbuildstrategy-details/ClusterBuildStrategyDetailsPage.tsx b/frontend/packages/shipwright-plugin/src/components/clusterbuildstrategy-details/ClusterBuildStrategyDetailsPage.tsx new file mode 100644 index 00000000000..2867c9ee958 --- /dev/null +++ b/frontend/packages/shipwright-plugin/src/components/clusterbuildstrategy-details/ClusterBuildStrategyDetailsPage.tsx @@ -0,0 +1,13 @@ +import * as React from 'react'; +import { DetailsForKind } from '@console/internal/components/default-resource'; +import { DetailsPage, DetailsPageProps } from '@console/internal/components/factory'; +import { Page, navFactory } from '@console/internal/components/utils'; +import { useShipwrightBreadcrumbsFor } from '../../utils'; + +const ClusterBuildStrategyPage: React.FC = (props) => { + const pages: Page[] = [navFactory.details(DetailsForKind), navFactory.editYaml()]; + + return ; +}; + +export default ClusterBuildStrategyPage; diff --git a/frontend/packages/shipwright-plugin/src/components/shipwright-tablistpage/ShipwrightTabListPage.tsx b/frontend/packages/shipwright-plugin/src/components/shipwright-tablistpage/ShipwrightTabListPage.tsx new file mode 100644 index 00000000000..e7688b3c6bc --- /dev/null +++ b/frontend/packages/shipwright-plugin/src/components/shipwright-tablistpage/ShipwrightTabListPage.tsx @@ -0,0 +1,152 @@ +import * as React from 'react'; +import { useTranslation } from 'react-i18next'; +import { useNavigate, useParams } from 'react-router-dom-v5-compat'; +import { K8sModel } from '@console/dynamic-plugin-sdk/src/api/common-types'; +import { DefaultPage } from '@console/internal/components/default-resource'; +import { Page } from '@console/internal/components/utils'; +import { referenceForModel } from '@console/internal/module/k8s'; +import { MenuActions, MultiTabListPage } from '@console/shared'; +import { + useBuildModel, + useBuildRunModel, + useBuildStrategyModel, + useClusterBuildStrategyModel, +} from '../../utils'; +import BuildListPage from '../build-list/BuildListPage'; +import BuildRunListPage from '../buildrun-list/BuildRunListPage'; + +const commonPageProps = { + showTitle: false, + canCreate: false, + hideBadge: true, +}; + +const buildListTab = (model: K8sModel): Page => { + return { + href: 'builds', + component: BuildListPage, + nameKey: 'shipwright-plugin~Builds', + pageData: { + ...commonPageProps, + kind: referenceForModel(model), + }, + }; +}; + +const buildRunListTab = (model: K8sModel): Page => { + return { + href: 'buildruns', + component: BuildRunListPage, + nameKey: 'shipwright-plugin~BuildRuns', + pageData: { + ...commonPageProps, + kind: referenceForModel(model), + }, + }; +}; + +const buildStrategyTab = (model: K8sModel): Page => { + return { + href: 'buildstrategies', + component: DefaultPage, + nameKey: 'shipwright-plugin~BuildStrategies', + pageData: { + ...commonPageProps, + kind: referenceForModel(model), + }, + }; +}; + +const clusterBuildStrategyTab = (model: K8sModel): Page => { + return { + href: 'clusterbuildstrategies', + component: DefaultPage, + nameKey: 'shipwright-plugin~ClusterBuildStrategies', + pageData: { + ...commonPageProps, + kind: referenceForModel(model), + }, + }; +}; + +const ShipwrightTabListPage: React.FC = () => { + const { t } = useTranslation(); + const { '*': currentTab } = useParams(); + const navigate = useNavigate(); + + const buildModel = useBuildModel(); + const buildRunModel = useBuildRunModel(); + const buildStrategyModel = useBuildStrategyModel(); + const clusterBuildStrategyModel = useClusterBuildStrategyModel(); + + /* Use feature flags to determine which pages to show */ + const pages: Page[] = []; + const menuActions: MenuActions = {}; + + if (buildModel) { + pages.push(buildListTab(buildModel)); + menuActions.build = { + model: buildModel, + label: t('shipwright-plugin~Build'), + }; + } + + if (buildRunModel) { + pages.push(buildRunListTab(buildRunModel)); + menuActions.buildRun = { + model: buildRunModel, + label: t('shipwright-plugin~BuildRun'), + }; + } + + if (buildStrategyModel) { + pages.push(buildStrategyTab(buildStrategyModel)); + menuActions.buildStrategy = { + model: buildStrategyModel, + label: t('shipwright-plugin~BuildStrategy'), + }; + } + + if (clusterBuildStrategyModel) { + pages.push(clusterBuildStrategyTab(clusterBuildStrategyModel)); + menuActions.clusterBuildStrategy = { + model: clusterBuildStrategyModel, + label: t('shipwright-plugin~ClusterBuildStrategy'), + }; + } + + /* Do not show empty page when no tab is selected */ + React.useEffect(() => { + if (currentTab !== '') { + return; + } + + if (buildModel) { + navigate('builds'); + } else if (buildRunModel) { + navigate('buildruns'); + } else if (buildStrategyModel) { + navigate('buildstrategies'); + } else if (clusterBuildStrategyModel) { + navigate('clusterbuildstrategies'); + } + }, [ + currentTab, + navigate, + buildModel, + buildRunModel, + buildStrategyModel, + clusterBuildStrategyModel, + ]); + + return ( + + ); +}; + +export default ShipwrightTabListPage; diff --git a/frontend/packages/shipwright-plugin/src/pages.ts b/frontend/packages/shipwright-plugin/src/pages.ts index 49d83d82983..284ea683f4d 100644 --- a/frontend/packages/shipwright-plugin/src/pages.ts +++ b/frontend/packages/shipwright-plugin/src/pages.ts @@ -2,3 +2,6 @@ export { default as BuildListPage } from './components/build-list/BuildListPage' export { default as BuildRunListPage } from './components/buildrun-list/BuildRunListPage'; export { default as BuildDetailsPage } from './components/build-details/BuildDetailsPage'; export { default as BuildRunDetailsPage } from './components/buildrun-details/BuildRunDetailsPage'; +export { default as BuildStrategyDetailsPage } from './components/buildstrategy-details/BuildStrategyDetailsPage'; +export { default as ClusterBuildStrategyDetailsPage } from './components/clusterbuildstrategy-details/ClusterBuildStrategyDetailsPage'; +export { default as ShipwrightTabListPage } from './components/shipwright-tablistpage/ShipwrightTabListPage'; diff --git a/frontend/packages/shipwright-plugin/src/utils.ts b/frontend/packages/shipwright-plugin/src/utils.ts index f03c1824915..5c31a2aec18 100644 --- a/frontend/packages/shipwright-plugin/src/utils.ts +++ b/frontend/packages/shipwright-plugin/src/utils.ts @@ -1,8 +1,23 @@ import { IBuild as IBuildV1Alpha1 } from '@kubernetes-models/shipwright/shipwright.io/v1alpha1/Build'; import { IBuildRun as IBuildRunV1Alpha1 } from '@kubernetes-models/shipwright/shipwright.io/v1alpha1/BuildRun'; +import { useLocation, useParams } from 'react-router-dom-v5-compat'; +import { useActivePerspective } from '@console/dynamic-plugin-sdk'; +import { K8sModel } from '@console/dynamic-plugin-sdk/src/api/common-types'; +import { useFlag } from '@console/dynamic-plugin-sdk/src/lib-core'; import { K8sResourceCondition, K8sResourceKind } from '@console/internal/module/k8s'; +import { useTabbedTableBreadcrumbsFor } from '@console/shared'; import { getBuildRunStatus } from './components/buildrun-status/BuildRunStatus'; import { BUILDRUN_TO_RESOURCE_MAP_LABEL } from './const'; +import { + BuildModel, + BuildModelV1Alpha1, + BuildRunModel, + BuildRunModelV1Alpha1, + BuildStrategyModel, + BuildStrategyModelV1Alpha1, + ClusterBuildStrategyModel, + ClusterBuildStrategyModelV1Alpha1, +} from './models'; import { Build, BuildRun, ComputedBuildRunStatus } from './types'; export type LatestBuildRunStatus = { @@ -97,3 +112,128 @@ export const getBuildNameFromBuildRun = (buildRun: BuildRun) => { } return buildRun.spec?.build?.name; }; + +/** + * Given two flags that determine the presence of two versions of a CRD, + * determine which version is enabled. + * + * If both flags are enabled, the first model gets priority. + * + * @return the K8s model of the CRD that is enabled, or null if neither are enabled + */ +const useDetermineModelVersion = ( + modelOne: K8sModel, + modelTwo: K8sModel, + modelFlagOne: string, + modelFlagTwo: string, +) => { + const flagTwo = useFlag(modelFlagTwo); + const flagOne = useFlag(modelFlagOne); + + if (!flagTwo && !flagOne) { + return null; + } + + return flagOne ? modelOne : modelTwo; +}; + +/** + * @returns latest `BuildModel` model if exists, otherwise v1Alpha1 if it exists, otherwise null + */ +export const useBuildModel = () => + useDetermineModelVersion( + BuildModel, + BuildModelV1Alpha1, + 'SHIPWRIGHT_BUILD', + 'SHIPWRIGHT_BUILD_V1ALPHA1', + ); + +/** + * @returns latest `BuildRunModel` model if exists, otherwise v1Alpha1 if it exists, otherwise null + */ +export const useBuildRunModel = () => + useDetermineModelVersion( + BuildRunModel, + BuildRunModelV1Alpha1, + 'SHIPWRIGHT_BUILDRUN', + 'SHIPWRIGHT_BUILDRUN_V1ALPHA1', + ); + +/** + * @returns latest `BuildStrategyModel` model if exists, otherwise v1Alpha1 if it exists, otherwise null + */ +export const useBuildStrategyModel = () => + useDetermineModelVersion( + BuildStrategyModel, + BuildStrategyModelV1Alpha1, + 'SHIPWRIGHT_BUILDSTRATEGY', + 'SHIPWRIGHT_BUILDSTRATEGY_V1ALPHA1', + ); + +/** + * @returns latest `ClusterBuildStrategyModel` model if exists, otherwise v1Alpha1 if it exists, otherwise null + */ +export const useClusterBuildStrategyModel = () => + useDetermineModelVersion( + ClusterBuildStrategyModel, + ClusterBuildStrategyModelV1Alpha1, + 'SHIPWRIGHT_CLUSTERBUILDSTRATEGY', + 'SHIPWRIGHT_CLUSTERBUILDSTRATEGY_V1ALPHA1', + ); + +/** map of shipwright kinds to tab names */ +const kindToTabMap = { + [BuildModel.kind]: 'builds', + [BuildModelV1Alpha1.kind]: 'builds', + [BuildRunModel.kind]: 'buildruns', + [BuildRunModelV1Alpha1.kind]: 'buildruns', + [BuildStrategyModel.kind]: 'buildstrategies', + [BuildStrategyModelV1Alpha1.kind]: 'buildstrategies', + [ClusterBuildStrategyModel.kind]: 'clusterbuildstrategies', + [ClusterBuildStrategyModelV1Alpha1.kind]: 'clusterbuildstrategies', +}; + +/** convert a resource using a shipwright model to its corresponding k8s model */ +const resourceToModel = (obj: K8sResourceKind): K8sModel => { + if (obj?.apiVersion === 'shipwright.io/v1alpha1') { + switch (obj?.kind) { + case 'Build': + return BuildModelV1Alpha1; + case 'BuildRun': + return BuildRunModelV1Alpha1; + case 'BuildStrategy': + return BuildStrategyModelV1Alpha1; + case 'ClusterBuildStrategy': + return ClusterBuildStrategyModelV1Alpha1; + default: + return null; + } + } + switch (obj?.kind) { + case 'Build': + return BuildModel; + case 'BuildRun': + return BuildRunModel; + case 'BuildStrategy': + return BuildStrategyModel; + case 'ClusterBuildStrategy': + return ClusterBuildStrategyModel; + default: + return null; + } +}; + +export const useShipwrightBreadcrumbsFor = (obj: K8sResourceKind) => { + const isAdminPerspective = useActivePerspective()[0] === 'admin'; + const params = useParams(); + const location = useLocation(); + return useTabbedTableBreadcrumbsFor( + resourceToModel(obj), + location, + params, + 'k8s', + `shipwright.io/${kindToTabMap[obj.kind]}`, + undefined, + isAdminPerspective, + ); +}; diff --git a/frontend/public/components/default-resource.tsx b/frontend/public/components/default-resource.tsx index 1e9e878cb16..89dae391d99 100644 --- a/frontend/public/components/default-resource.tsx +++ b/frontend/public/components/default-resource.tsx @@ -168,7 +168,9 @@ export const DefaultList: React.FC = (props) = }; DefaultList.displayName = 'DefaultList'; -export const DefaultPage: React.FC> = (props) => ( +export const DefaultPage: React.FC, 'ListComponent'>> = ( + props, +) => (