diff --git a/src/AppRoutes.tsx b/src/AppRoutes.tsx index db54df99..e1d68d7f 100644 --- a/src/AppRoutes.tsx +++ b/src/AppRoutes.tsx @@ -34,7 +34,9 @@ import { BuildPages } from 'components/BuildPages/BuildPages'; import { BuildsPage } from 'components/BuildsPage/BuildsPage'; import { DashboardPage } from 'components/DashboardPage/DashboardPage'; import { DeliverableAnalysesPage } from 'components/DeliverableAnalysesPage/DeliverableAnalysesPage'; +import { DeliverableAnalysisDeliveredArtifactsPage } from 'components/DeliverableAnalysisDeliveredArtifactsPage/DeliverableAnalysisDeliveredArtifactsPage'; import { DeliverableAnalysisDetailPage } from 'components/DeliverableAnalysisDetailPage/DeliverableAnalysisDetailPage'; +import { DeliverableAnalysisPages } from 'components/DeliverableAnalysisPages/DeliverableAnalysisPages'; import { DemoPage } from 'components/DemoPage/DemoPage'; import { ErrorPage } from 'components/ErrorPage/ErrorPage'; import { ExperimentalContent } from 'components/ExperimentalContent/ExperimentalContent'; @@ -385,8 +387,12 @@ export const AppRoutes = ( } - /> + element={} + > + } /> + } /> + } /> + {/* special pages */} diff --git a/src/components/DeliverableAnalysisDeliveredArtifactsPage/DeliverableAnalysisDeliveredArtifactsPage.tsx b/src/components/DeliverableAnalysisDeliveredArtifactsPage/DeliverableAnalysisDeliveredArtifactsPage.tsx new file mode 100644 index 00000000..f5693aab --- /dev/null +++ b/src/components/DeliverableAnalysisDeliveredArtifactsPage/DeliverableAnalysisDeliveredArtifactsPage.tsx @@ -0,0 +1,50 @@ +import { Text, TextContent } from '@patternfly/react-core'; +import { useCallback } from 'react'; + +import { useParamsRequired } from 'hooks/useParamsRequired'; +import { useQueryParamsEffect } from 'hooks/useQueryParamsEffect'; +import { useServiceContainer } from 'hooks/useServiceContainer'; + +import { ArtifactsList } from 'components/ArtifactsList/ArtifactsList'; +import { Toolbar } from 'components/Toolbar/Toolbar'; +import { ToolbarItem } from 'components/Toolbar/ToolbarItem'; + +import * as deliverableAnalysisApi from 'services/deliverableAnalysisApi'; + +interface IDeliverableAnalysisDeliveredArtifactsPageProps { + componentId?: string; +} + +export const DeliverableAnalysisDeliveredArtifactsPage = ({ + componentId = 'd2', +}: IDeliverableAnalysisDeliveredArtifactsPageProps) => { + const { deliverableAnalysisId } = useParamsRequired(); + + const serviceContainerArtifacts = useServiceContainer(deliverableAnalysisApi.getAnalyzedArtifacts); + const serviceContainerArtifactsRunner = serviceContainerArtifacts.run; + + useQueryParamsEffect( + useCallback( + ({ requestConfig } = {}) => serviceContainerArtifactsRunner({ serviceData: { id: deliverableAnalysisId }, requestConfig }), + [serviceContainerArtifactsRunner, deliverableAnalysisId] + ), + { componentId } + ); + + return ( + <> + + + + Delivered Artifacts + + This list contains Artifacts analyzed in the current Deliverable Analysis. Each Artifact is represented by a PNC + Identifier. + + + + + ; + > + ); +}; diff --git a/src/components/DeliverableAnalysisDetailPage/DeliverableAnalysisDetailPage.tsx b/src/components/DeliverableAnalysisDetailPage/DeliverableAnalysisDetailPage.tsx index e159c37b..2bb2a900 100644 --- a/src/components/DeliverableAnalysisDetailPage/DeliverableAnalysisDetailPage.tsx +++ b/src/components/DeliverableAnalysisDetailPage/DeliverableAnalysisDetailPage.tsx @@ -3,7 +3,6 @@ import { useCallback, useEffect, useMemo } from 'react'; import { DeliverableAnalyzerOperation } from 'pnc-api-types-ts'; -import { breadcrumbData } from 'common/breadcrumbData'; import { EntityTitles } from 'common/constants'; import { deliverableAnalysisOperationEntityAttributes } from 'common/deliverableAnalysisOperationEntityAttributes'; import { deliverableAnalysisReportEntityAttributes } from 'common/deliverableAnalysisReportEntityAttributes'; @@ -17,7 +16,6 @@ import { useDataBuffer } from 'hooks/useDataBuffer'; import { useParamsRequired } from 'hooks/useParamsRequired'; import { hasDeliverableAnalysisChanged, usePncWebSocketEffect } from 'hooks/usePncWebSocketEffect'; import { useServiceContainer } from 'hooks/useServiceContainer'; -import { useTitle } from 'hooks/useTitle'; import { Attributes } from 'components/Attributes/Attributes'; import { AttributesItem } from 'components/Attributes/AttributesItem'; @@ -27,7 +25,6 @@ import { DeliverableAnalysisLabelLabelMapper } from 'components/LabelMapper/Deli import { DeliverableAnalysisProgressStatusLabelMapper } from 'components/LabelMapper/DeliverableAnalysisProgressStatusLabelMapper'; import { DeliverableAnalysisResultLabelMapper } from 'components/LabelMapper/DeliverableAnalysisResultLabelMapper'; import { LogViewer } from 'components/LogViewer/LogViewer'; -import { PageLayout } from 'components/PageLayout/PageLayout'; import { ProductMilestoneReleaseLabel } from 'components/ProductMilestoneReleaseLabel/ProductMilestoneReleaseLabel'; import { ServiceContainerLoading } from 'components/ServiceContainers/ServiceContainerLoading'; import { Toolbar } from 'components/Toolbar/Toolbar'; @@ -39,7 +36,6 @@ import * as productMilestoneApi from 'services/productMilestoneApi'; import * as productVersionApi from 'services/productVersionApi'; import { timestampHiglighter } from 'utils/preprocessorHelper'; -import { generatePageTitle } from 'utils/titleHelper'; export const DeliverableAnalysisDetailPage = () => { const { deliverableAnalysisId } = useParamsRequired(); @@ -109,104 +105,77 @@ export const DeliverableAnalysisDetailPage = () => { ) ); - useTitle( - generatePageTitle({ - serviceContainer: serviceContainerDeliverableAnalysisOperation, - firstLevelEntity: 'Deliverable Analysis', - entityName: `Deliverable Analysis ${deliverableAnalysis?.id}`, - }) - ); - return ( - - - - - - {deliverableAnalysis?.id} - - - {deliverableAnalysis?.productMilestone && ( - - - - + + + + {deliverableAnalysis?.id} + + {deliverableAnalysis?.productMilestone && ( + + + - )} - - - {deliverableAnalysis?.user?.username} - - - {deliverableAnalysis?.progressStatus && ( - - )} - - - {deliverableAnalysis?.result && } - - - {deliverableAnalysis?.submitTime && } - - - {deliverableAnalysis?.startTime && } - - - {deliverableAnalysis?.endTime && } - - - {deliverableAnalysis?.parameters && - Object.values(deliverableAnalysis.parameters).map((parameter, index) => {parameter})} - - - {(serviceContainerDeliverableAnalysisReport.loading || - serviceContainerDeliverableAnalysisReport.error || - !!serviceContainerDeliverableAnalysisReport.data?.labels?.length) && ( - - - {serviceContainerDeliverableAnalysisReport.data?.labels?.map((label) => ( - - ))} - - - )} - - - + + )} + + + {deliverableAnalysis?.user?.username} + + + {deliverableAnalysis?.progressStatus && ( + + )} + + + {deliverableAnalysis?.result && } + + + {deliverableAnalysis?.submitTime && } + + + {deliverableAnalysis?.startTime && } + + + {deliverableAnalysis?.endTime && } + + + {deliverableAnalysis?.parameters && + Object.values(deliverableAnalysis.parameters).map((parameter, index) => {parameter})} + + + {(serviceContainerDeliverableAnalysisReport.loading || + serviceContainerDeliverableAnalysisReport.error || + !!serviceContainerDeliverableAnalysisReport.data?.labels?.length) && ( + + + {serviceContainerDeliverableAnalysisReport.data?.labels?.map((label) => ( + + ))} + + + )} + + + - - + ); }; diff --git a/src/components/DeliverableAnalysisPages/DeliverableAnalysisPages.tsx b/src/components/DeliverableAnalysisPages/DeliverableAnalysisPages.tsx new file mode 100644 index 00000000..a03fbb92 --- /dev/null +++ b/src/components/DeliverableAnalysisPages/DeliverableAnalysisPages.tsx @@ -0,0 +1,72 @@ +import { PropsWithChildren, useEffect } from 'react'; +import { Outlet } from 'react-router-dom'; + +import { breadcrumbData } from 'common/breadcrumbData'; +import { TOTAL_COUNT_REQUEST_CONFIG } from 'common/constants'; + +import { useParamsRequired } from 'hooks/useParamsRequired'; +import { useServiceContainer } from 'hooks/useServiceContainer'; +import { useTitle } from 'hooks/useTitle'; + +import { PageLayout } from 'components/PageLayout/PageLayout'; +import { PageTabs } from 'components/PageTabs/PageTabs'; +import { PageTabsItem } from 'components/PageTabs/PageTabsItem'; +import { PageTabsLabel } from 'components/PageTabs/PageTabsLabel'; + +import * as deliverableAnalysisApi from 'services/deliverableAnalysisApi'; +import * as operationsApi from 'services/operationsApi'; + +import { generatePageTitle } from 'utils/titleHelper'; + +interface IDeliverableAnalysisPagesProps {} + +export const DeliverableAnalysisPages = ({ children }: PropsWithChildren) => { + const { deliverableAnalysisId } = useParamsRequired(); + + const serviceContainerDeliverableAnalysis = useServiceContainer(operationsApi.getDeliverableAnalysis); + + const serviceContainerArtifacts = useServiceContainer(deliverableAnalysisApi.getAnalyzedArtifacts); + const serviceContainerArtifactsRunner = serviceContainerArtifacts.run; + + useEffect(() => { + serviceContainerArtifactsRunner({ + serviceData: { id: deliverableAnalysisId }, + requestConfig: TOTAL_COUNT_REQUEST_CONFIG, + }); + }, [deliverableAnalysisId, serviceContainerArtifactsRunner]); + + useTitle( + generatePageTitle({ + serviceContainer: serviceContainerDeliverableAnalysis, + firstLevelEntity: 'Deliverable Analysis', + entityName: `Deliverable Analysis ${deliverableAnalysisId}`, + }) + ); + + const pageTabs = ( + + Details + + Delivered Artifacts + + {serviceContainerArtifacts.data?.totalHits} + + + + ); + + return ( + + + + ); +}; diff --git a/src/components/ProductMilestoneDeliveredArtifactsPage/ProductMilestoneDeliveredArtifactsPage.tsx b/src/components/ProductMilestoneDeliveredArtifactsPage/ProductMilestoneDeliveredArtifactsPage.tsx index b32904bd..f9c39bb2 100644 --- a/src/components/ProductMilestoneDeliveredArtifactsPage/ProductMilestoneDeliveredArtifactsPage.tsx +++ b/src/components/ProductMilestoneDeliveredArtifactsPage/ProductMilestoneDeliveredArtifactsPage.tsx @@ -1,3 +1,4 @@ +import { Text, TextContent } from '@patternfly/react-core'; import { useCallback } from 'react'; import { useParamsRequired } from 'hooks/useParamsRequired'; @@ -5,6 +6,8 @@ import { useQueryParamsEffect } from 'hooks/useQueryParamsEffect'; import { useServiceContainer } from 'hooks/useServiceContainer'; import { ArtifactsList } from 'components/ArtifactsList/ArtifactsList'; +import { Toolbar } from 'components/Toolbar/Toolbar'; +import { ToolbarItem } from 'components/Toolbar/ToolbarItem'; import * as productMilestoneApi from 'services/productMilestoneApi'; @@ -26,5 +29,19 @@ export const ProductMilestoneDeliveredArtifactsPage = ({ componentId = 'd1' }: I { componentId } ); - return ; + return ( + <> + + + + Delivered Artifacts + + This list contains Artifacts delivered in the current Milestone. Each Artifact is represented by a PNC Identifier. + + + + + ; + > + ); }; diff --git a/src/services/deliverableAnalysisApi.ts b/src/services/deliverableAnalysisApi.ts index a1848444..6904eb3f 100644 --- a/src/services/deliverableAnalysisApi.ts +++ b/src/services/deliverableAnalysisApi.ts @@ -1,6 +1,6 @@ import { AxiosRequestConfig } from 'axios'; -import { DeliverableAnalyzerReport } from 'pnc-api-types-ts'; +import { ArtifactPage, DeliverableAnalyzerReport } from 'pnc-api-types-ts'; import { pncClient } from 'services/pncClient'; @@ -21,3 +21,14 @@ export const getDeliverableAnalysisReport = ( ) => { return pncClient.getHttpClient().get(`/deliverable-analyses/${id}`, requestConfig); }; + +/** + * Gets analyzed artifacts of a Deliverable Analysis report. + * + * @param serviceData - object containing: + * - id - Deliverable Analysis ID + * @param requestConfig - Axios based request config + */ +export const getAnalyzedArtifacts = ({ id }: IDeliverableAnalysisReportApiData, requestConfig: AxiosRequestConfig = {}) => { + return pncClient.getHttpClient().get(`/deliverable-analyses/${id}/analyzed-artifacts`, requestConfig); +};