From 477c9b74a44f90e922a30f8cf18a539acf6289b9 Mon Sep 17 00:00:00 2001 From: "Dusan Mijatovic (PC2020)" Date: Mon, 11 Nov 2024 17:07:16 +0100 Subject: [PATCH] feat: show archived repo status, start and forks count --- .../category/CategoriesWithHeadlines.tsx | 2 +- .../charts/d3LineChart/drawLineChart.tsx | 2 +- .../charts/d3LineChart/formatData.ts | 5 +- .../components/software/CommitsChart.test.tsx | 105 +++++++++++++++--- frontend/components/software/CommitsChart.tsx | 59 +++++++++- .../components/software/GetStartedSection.tsx | 23 ++-- frontend/pages/software/[slug]/index.tsx | 4 +- frontend/types/SoftwareTypes.ts | 5 + 8 files changed, 168 insertions(+), 37 deletions(-) diff --git a/frontend/components/category/CategoriesWithHeadlines.tsx b/frontend/components/category/CategoriesWithHeadlines.tsx index 0bd4f739c..b09983c4b 100644 --- a/frontend/components/category/CategoriesWithHeadlines.tsx +++ b/frontend/components/category/CategoriesWithHeadlines.tsx @@ -23,7 +23,7 @@ export const CategoriesWithHeadlines = ({categories}: CategoriesWithHeadlinesPro const category = node.getValue() const children = node.children() - return + return
diff --git a/frontend/components/charts/d3LineChart/drawLineChart.tsx b/frontend/components/charts/d3LineChart/drawLineChart.tsx index d290bef5f..82f7695d5 100644 --- a/frontend/components/charts/d3LineChart/drawLineChart.tsx +++ b/frontend/components/charts/d3LineChart/drawLineChart.tsx @@ -24,7 +24,7 @@ type LineChartConfig = { const margin = { // minimal margins to host first/last year label 'overflow' left: 12, right: 12, - top: 4, bottom: 16 + top: 4, bottom: 24 } function findMax(data:LineData[]) { diff --git a/frontend/components/charts/d3LineChart/formatData.ts b/frontend/components/charts/d3LineChart/formatData.ts index 54b115e69..1c746f71d 100644 --- a/frontend/components/charts/d3LineChart/formatData.ts +++ b/frontend/components/charts/d3LineChart/formatData.ts @@ -1,5 +1,7 @@ // SPDX-FileCopyrightText: 2022 Dusan Mijatovic (dv4all) // SPDX-FileCopyrightText: 2022 dv4all +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -37,10 +39,11 @@ export function formatUnixDateData(data: Data) { } export function prepareDataForSoftwarePage(data: Data) { + console.log('prepareDataForSoftwarePage...',data) // format unix time in seconds to ms for js const {lineData,lastUpdateInMs} = formatUnixDateData(data) // calculate total number of commits - const totalCountY = lineData.reduce((acc: any, point) => { + const totalCountY:number = lineData.reduce((acc: any, point) => { return acc+=point.y }, 0) // extract last commit date diff --git a/frontend/components/software/CommitsChart.test.tsx b/frontend/components/software/CommitsChart.test.tsx index 43c1cc478..7c0033916 100644 --- a/frontend/components/software/CommitsChart.test.tsx +++ b/frontend/components/software/CommitsChart.test.tsx @@ -1,6 +1,6 @@ -// SPDX-FileCopyrightText: 2023 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2023 - 2024 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) -// SPDX-FileCopyrightText: 2023 Netherlands eScience Center // SPDX-FileCopyrightText: 2023 dv4all // // SPDX-License-Identifier: Apache-2.0 @@ -8,7 +8,7 @@ import {render, screen} from '@testing-library/react' import {WithAppContext} from '~/utils/jest/WithAppContext' -import CommitsChart, {CommitsChartProps} from './CommitsChart' +import CommitsChart, {CommitsChartProps,ArchivedRepo,StarCount,ForkCount} from './CommitsChart' // MOCK useResizeObserver jest.mock('~/components/charts/d3LineChart/useResizeObserver') @@ -21,20 +21,18 @@ jest.mock('~/components/charts/d3LineChart/NoDataAvailableChart', () => ({ default: jest.fn(({text}) =>
{text}
) })) -// const mockPrepareDataForSoftwarePage = jest.fn(props => ({ -// lineData: [], -// totalCountY:0, -// lastCommitDate: null -// })) -// jest.mock('~/components/charts/d3LineChart/formatData', () => ({ -// prepareDataForSoftwarePage: jest.fn(props=>mockPrepareDataForSoftwarePage(props)) -// })) +type MutableProps = { + -readonly [key in keyof CommitsChartProps]: CommitsChartProps[key] +} -const mockProps:CommitsChartProps = { +const mockProps:MutableProps = { repository_url: null, commit_history: undefined, commit_history_scraped_at: undefined, - className: undefined + className: undefined, + archived: null, + star_count: null, + fork_count: null } it('renders "missing repository_url" message', () => { @@ -70,7 +68,7 @@ it('renders "did not scrape repo yet" message', () => { // screen.debug() }) -it('renders "reposotory is empty" message', () => { +it('renders "repository is empty" message', () => { mockProps.repository_url = 'https://some.repo.url.com' mockProps.commit_history_scraped_at = new Date().toISOString() mockProps.commit_history = {} @@ -105,3 +103,82 @@ it('renders "we cannot read the commit history" message', () => { expect(message).toHaveTextContent(expectMessage) // screen.debug() }) + +it('renders "archived repository" message', () => { + // render + render( + + + + ) + + screen.getByTestId('archived-repository') +}) + +it('renders "0 stars" message', () => { + // render + render( + + + + ) + + screen.getByText('0 stars') +}) + +it('does NOT render the stars message on null', async() => { + // render + render( + + + + ) + const stars = screen.queryByTestId('star-count') + expect(stars).not.toBeInTheDocument() + // screen.debug(stars) +}) + +it('does NOT render the stars message on undefined', async() => { + // render + render( + + + + ) + const stars = screen.queryByTestId('star-count') + expect(stars).not.toBeInTheDocument() +}) + +it('renders "0 forks" message', () => { + // render + render( + + + + ) + + screen.getByText('0 forks') +}) + +it('does NOT render forks message on null', async() => { + // render + render( + + + + ) + const forks = screen.queryByTestId('fork-count') + expect(forks).not.toBeInTheDocument() +}) + +it('does NOT render forks message on undefined', async() => { + // render + render( + + + + ) + const stars = screen.queryByTestId('fork-count') + expect(stars).not.toBeInTheDocument() +}) + diff --git a/frontend/components/software/CommitsChart.tsx b/frontend/components/software/CommitsChart.tsx index d3f8f9681..a80e908b7 100644 --- a/frontend/components/software/CommitsChart.tsx +++ b/frontend/components/software/CommitsChart.tsx @@ -3,6 +3,8 @@ // SPDX-FileCopyrightText: 2022 Christian Meeßen (GFZ) // SPDX-FileCopyrightText: 2022 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences // SPDX-FileCopyrightText: 2023 Dusan Mijatovic (dv4all) (dv4all) +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 @@ -12,14 +14,58 @@ import {prepareDataForSoftwarePage} from '~/components/charts/d3LineChart/format import NoDataAvailableChart from '~/components/charts/d3LineChart/NoDataAvailableChart' import SingleLineChart from '~/components/charts/d3LineChart/SingleLineChart' -export type CommitsChartProps = { +export type CommitsChartProps = Readonly<{ repository_url: string | null, + archived: boolean | null, + star_count: number | null, + fork_count: number | null, commit_history?: CommitHistory commit_history_scraped_at?: string className?: string +}> + +export function ArchivedRepo({archived}:Readonly<{archived:boolean|null}>){ + if (!archived) return null + return ( + + archived repository + + ) +} + +export function StarCount({star_count}:Readonly<{star_count:number|null}>){ + if (star_count===null || star_count===undefined) return null + return ( + + {star_count===1 ? `${star_count} star`:`${star_count} stars`} + + ) +} + +export function ForkCount({fork_count}:Readonly<{fork_count:number|null}>){ + if (fork_count===null || fork_count===undefined) return null + return ( + + {fork_count===1 ? `${fork_count} fork` : `${fork_count} forks`} + + ) +} + +export function Commits({commits,lastCommitDate}:Readonly<{commits:number|null,lastCommitDate?:Date}>){ + return ( + <> + {commits===1 ? `${commits} commit` : `${commits} commits`} + Last commit ≈ { + getTimeAgoSince(new Date(), lastCommitDate?.toISOString() ?? null) + } + + ) } -export default function CommitsChart({repository_url, commit_history, commit_history_scraped_at, className}: CommitsChartProps) { +export default function CommitsChart({ + repository_url, commit_history, commit_history_scraped_at, + archived, star_count, fork_count, className +}: CommitsChartProps) { // if there is commit_history if (commit_history && Object.keys(commit_history).length > 0) { // format commits data for chart and calculate other stats @@ -28,10 +74,11 @@ export default function CommitsChart({repository_url, commit_history, commit_his return (
-
- {totalCountY} commits | Last commit ≈ { - getTimeAgoSince(new Date(), lastCommitDate?.toISOString() ?? null) - } +
+ + + +
) diff --git a/frontend/components/software/GetStartedSection.tsx b/frontend/components/software/GetStartedSection.tsx index a09e1b3df..241873c6a 100644 --- a/frontend/components/software/GetStartedSection.tsx +++ b/frontend/components/software/GetStartedSection.tsx @@ -2,25 +2,23 @@ // SPDX-FileCopyrightText: 2021 - 2022 dv4all // SPDX-FileCopyrightText: 2022 Christian Meeßen (GFZ) // SPDX-FileCopyrightText: 2022 Helmholtz Centre Potsdam - GFZ German Research Centre for Geosciences +// SPDX-FileCopyrightText: 2024 Dusan Mijatovic (Netherlands eScience Center) +// SPDX-FileCopyrightText: 2024 Netherlands eScience Center // // SPDX-License-Identifier: Apache-2.0 import LinkIcon from '@mui/icons-material/Link' import CommitsChart from './CommitsChart' -import {CommitHistory} from '../../types/SoftwareTypes' +import {RepositoryInfo} from '../../types/SoftwareTypes' type GetStartedSectionProps = { get_started_url: string | null, - repository_url: string | null, - commit_history: CommitHistory, - commit_history_scraped_at: string + repositoryInfo: RepositoryInfo } -export default function GetStartedSection(props:GetStartedSectionProps) { - const {repository_url, get_started_url, commit_history, commit_history_scraped_at} = props - +export default function GetStartedSection({get_started_url,repositoryInfo}:GetStartedSectionProps) { // if no get_started_url and repository_url we do not render this section - if (!get_started_url && !repository_url) return null + if (!get_started_url && !repositoryInfo?.url) return null function renderGetStartedUrl() { if (get_started_url) { @@ -45,9 +43,12 @@ export default function GetStartedSection(props:GetStartedSectionProps) { return ( ) } diff --git a/frontend/pages/software/[slug]/index.tsx b/frontend/pages/software/[slug]/index.tsx index 3e13d70fb..500817ede 100644 --- a/frontend/pages/software/[slug]/index.tsx +++ b/frontend/pages/software/[slug]/index.tsx @@ -166,9 +166,7 @@ export default function SoftwareIndexPage(props:SoftwareIndexData) { />