diff --git a/web/src/layout/package/Details.test.tsx b/web/src/layout/package/Details.test.tsx index 237b3e2f..7571bda1 100644 --- a/web/src/layout/package/Details.test.tsx +++ b/web/src/layout/package/Details.test.tsx @@ -33,6 +33,16 @@ const defaultProps = { }; describe('Details', () => { + let dateNowSpy: any; + + beforeEach(() => { + dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1634969145000); + }); + + afterAll(() => { + dateNowSpy.mockRestore(); + }); + afterEach(() => { jest.resetAllMocks(); }); @@ -73,6 +83,7 @@ describe('Details', () => { expect(screen.getByText('Type')).toBeInTheDocument(); expect(screen.getByText('Kubernetes version')).toBeInTheDocument(); expect(screen.getByText('Chart versions')).toBeInTheDocument(); + expect(screen.getByText('Last year activity')).toBeInTheDocument(); expect(screen.queryByText('Links')).toBeNull(); expect(screen.getByText('License')).toBeInTheDocument(); expect(screen.getByText('Maintainers')).toBeInTheDocument(); diff --git a/web/src/layout/package/Details.tsx b/web/src/layout/package/Details.tsx index 4abca2ba..ecdf62ec 100644 --- a/web/src/layout/package/Details.tsx +++ b/web/src/layout/package/Details.tsx @@ -20,6 +20,7 @@ import ContainersImages from './ContainersImages'; import Dependencies from './Dependencies'; import styles from './Details.module.css'; import Keywords from './Keywords'; +import LastYearActivity from './LastYearActivity'; import License from './License'; import Links from './Links'; import Maintainers from './Maintainers'; @@ -170,6 +171,10 @@ const Details = (props: Props) => { )} +
+ +
+ {(() => { switch (props.package.repository.kind) { case RepositoryKind.Helm: diff --git a/web/src/layout/package/LastYearActivity.module.css b/web/src/layout/package/LastYearActivity.module.css new file mode 100644 index 00000000..6d044b0b --- /dev/null +++ b/web/src/layout/package/LastYearActivity.module.css @@ -0,0 +1,87 @@ +.heatMap { + max-width: 250px; +} + +.heatMapCell { + height: 16px; + width: 16px; + border-radius: 2px; + border: 1px solid var(--color-black-25); +} + +.level0 { + background-color: var(--color-activity-0); + border: 1px solid var(--color-black-15); +} + +.level1 { + background-color: var(--color-activity-1); +} + +.level2 { + background-color: var(--color-activity-2); +} + +.level3 { + background-color: var(--color-activity-3); +} + +.level4 { + background-color: var(--color-activity-4); +} + +.legend { + font-size: 0.8rem; +} + +.popover { + opacity: 0; + right: 0; + left: auto; + top: 18px; + font-size: 0.8rem; + z-index: -1; +} + +.marker { + width: 12px; + height: 12px; + top: 0px; + margin-right: 10px; + border-radius: 50%; + border: 1px solid var(--color-black-25); +} + +.popoverHeader { + font-size: 0.8rem; + padding: 0.5rem; + line-height: 1; +} + +@media only screen and (max-width: 767.98px) { + .popover { + display: none; + } +} + +@media only screen and (min-width: 768px) and (max-width: 1920px) { + .heatMapCell { + height: 13px; + width: 13px; + } + + .popover { + top: 15px; + } +} + +@media (hover: hover) and (min-width: 768px) { + .heatMapCell { + cursor: pointer; + } + + .heatMapCell:hover + .popover { + opacity: 1; + z-index: 1; + } +} diff --git a/web/src/layout/package/LastYearActivity.test.tsx b/web/src/layout/package/LastYearActivity.test.tsx new file mode 100644 index 00000000..0f99277c --- /dev/null +++ b/web/src/layout/package/LastYearActivity.test.tsx @@ -0,0 +1,144 @@ +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { Version } from '../../types'; +import LastYearActivity from './LastYearActivity'; + +const getMockVersions = (fixtureId: string): Version[] => { + return require(`./__fixtures__/LastYearActivity/${fixtureId}.json`) as Version[]; +}; + +describe('LastYearActivity', () => { + let dateNowSpy: any; + + beforeEach(() => { + dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1634969145000); + }); + + afterAll(() => { + dateNowSpy.mockRestore(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('creates snapshot', () => { + const mockVersions = getMockVersions('1'); + const { asFragment } = render(); + expect(asFragment()).toMatchSnapshot(); + }); + + describe('Render', () => { + it('renders component', () => { + const mockVersions = getMockVersions('2'); + render(); + + expect(screen.getByText('Last year activity')).toBeInTheDocument(); + expect(screen.getAllByText("Oct'21")).toHaveLength(2); + expect(screen.getAllByText("Apr'21")).toHaveLength(2); + expect(screen.getAllByText("Nov'20")).toHaveLength(2); + expect(screen.getByTestId('lastYearActivity')).toBeInTheDocument(); + + const cells = screen.getAllByTestId('heatMapCell'); + expect(cells).toHaveLength(12); + expect(cells[0]).toHaveClass('level3'); + expect(cells[1]).toHaveClass('level1'); + expect(cells[2]).toHaveClass('level3'); + expect(cells[3]).toHaveClass('level2'); + expect(cells[4]).toHaveClass('level3'); + expect(cells[5]).toHaveClass('level1'); + expect(cells[6]).toHaveClass('level3'); + expect(cells[7]).toHaveClass('level1'); + expect(cells[8]).toHaveClass('level0'); + expect(cells[9]).toHaveClass('level1'); + expect(cells[10]).toHaveClass('level1'); + expect(cells[11]).toHaveClass('level0'); + + const popovers = screen.getAllByTestId('heatMapPopover'); + expect(popovers).toHaveLength(12); + expect(popovers[0]).toHaveTextContent("Nov'20Releases: 3"); + expect(popovers[1]).toHaveTextContent("Dec'20Releases: 1"); + expect(popovers[2]).toHaveTextContent("Jan'21Releases: 3"); + expect(popovers[3]).toHaveTextContent("Feb'21Releases: 2"); + expect(popovers[4]).toHaveTextContent("Mar'21Releases: 3"); + expect(popovers[5]).toHaveTextContent("Apr'21Releases: 1"); + expect(popovers[6]).toHaveTextContent("May'21Releases: 4"); + expect(popovers[7]).toHaveTextContent("Jun'21Releases: 1"); + expect(popovers[8]).toHaveTextContent("Jul'21Releases: 0"); + expect(popovers[9]).toHaveTextContent("Aug'21Releases: 1"); + expect(popovers[10]).toHaveTextContent("Sep'21Releases: 1"); + expect(popovers[11]).toHaveTextContent("Oct'21Releases: 0"); + }); + + it('renders only level0 cells when versions are elder than 1 year', () => { + const mockVersions = getMockVersions('3'); + render(); + + const cells = screen.getAllByTestId('heatMapCell'); + expect(cells).toHaveLength(12); + expect(cells[0]).toHaveClass('level0'); + expect(cells[1]).toHaveClass('level0'); + expect(cells[2]).toHaveClass('level0'); + expect(cells[3]).toHaveClass('level0'); + expect(cells[4]).toHaveClass('level0'); + expect(cells[5]).toHaveClass('level0'); + expect(cells[6]).toHaveClass('level0'); + expect(cells[7]).toHaveClass('level0'); + expect(cells[8]).toHaveClass('level0'); + expect(cells[9]).toHaveClass('level0'); + expect(cells[10]).toHaveClass('level0'); + expect(cells[11]).toHaveClass('level0'); + + const popovers = screen.getAllByTestId('heatMapPopover'); + expect(popovers).toHaveLength(12); + expect(popovers[0]).toHaveTextContent("Nov'20Releases: 0"); + expect(popovers[1]).toHaveTextContent("Dec'20Releases: 0"); + expect(popovers[2]).toHaveTextContent("Jan'21Releases: 0"); + expect(popovers[3]).toHaveTextContent("Feb'21Releases: 0"); + expect(popovers[4]).toHaveTextContent("Mar'21Releases: 0"); + expect(popovers[5]).toHaveTextContent("Apr'21Releases: 0"); + expect(popovers[6]).toHaveTextContent("May'21Releases: 0"); + expect(popovers[7]).toHaveTextContent("Jun'21Releases: 0"); + expect(popovers[8]).toHaveTextContent("Jul'21Releases: 0"); + expect(popovers[9]).toHaveTextContent("Aug'21Releases: 0"); + expect(popovers[10]).toHaveTextContent("Sep'21Releases: 0"); + expect(popovers[11]).toHaveTextContent("Oct'21Releases: 0"); + }); + + it('renders all level3 cells', () => { + const mockVersions = getMockVersions('4'); + render(); + + const cells = screen.getAllByTestId('heatMapCell'); + expect(cells).toHaveLength(12); + expect(cells[0]).toHaveClass('level4'); + expect(cells[1]).toHaveClass('level4'); + expect(cells[2]).toHaveClass('level4'); + expect(cells[3]).toHaveClass('level4'); + expect(cells[4]).toHaveClass('level4'); + expect(cells[5]).toHaveClass('level4'); + expect(cells[6]).toHaveClass('level4'); + expect(cells[7]).toHaveClass('level4'); + expect(cells[8]).toHaveClass('level4'); + expect(cells[9]).toHaveClass('level4'); + expect(cells[10]).toHaveClass('level4'); + expect(cells[11]).toHaveClass('level3'); + + const popovers = screen.getAllByTestId('heatMapPopover'); + expect(popovers).toHaveLength(12); + expect(popovers[0]).toHaveTextContent("Nov'20Releases: 28"); + expect(popovers[1]).toHaveTextContent("Dec'20Releases: 8"); + expect(popovers[2]).toHaveTextContent("Jan'21Releases: 27"); + expect(popovers[3]).toHaveTextContent("Feb'21Releases: 13"); + expect(popovers[4]).toHaveTextContent("Mar'21Releases: 9"); + expect(popovers[5]).toHaveTextContent("Apr'21Releases: 23"); + expect(popovers[6]).toHaveTextContent("May'21Releases: 12"); + expect(popovers[7]).toHaveTextContent("Jun'21Releases: 22"); + expect(popovers[8]).toHaveTextContent("Jul'21Releases: 10"); + expect(popovers[9]).toHaveTextContent("Aug'21Releases: 10"); + expect(popovers[10]).toHaveTextContent("Sep'21Releases: 14"); + expect(popovers[11]).toHaveTextContent("Oct'21Releases: 5"); + }); + }); +}); diff --git a/web/src/layout/package/LastYearActivity.tsx b/web/src/layout/package/LastYearActivity.tsx new file mode 100644 index 00000000..2f6d0da6 --- /dev/null +++ b/web/src/layout/package/LastYearActivity.tsx @@ -0,0 +1,96 @@ +import { groupBy, isUndefined, rangeRight } from 'lodash'; +import moment from 'moment'; +import React, { useEffect, useState } from 'react'; + +import { Version } from '../../types'; +import SmallTitle from '../common/SmallTitle'; +import styles from './LastYearActivity.module.css'; + +interface Props { + versions: Version[]; +} + +interface SortedVersions { + [key: string]: Version[]; +} + +const LastYearActivity = (props: Props) => { + const prepareMonths = (): string[] => { + return rangeRight(12).map((n: number) => { + return moment().subtract(n, 'months').startOf('month').format('MM/YY'); + }); + }; + + const [versions, setVersions] = useState(); + const [months] = useState(prepareMonths()); + useEffect(() => { + const prepareVersionsList = () => { + const sortedVersions = groupBy(props.versions, (v) => moment.unix(v.ts).startOf('month').format('MM/YY')); + setVersions(sortedVersions); + }; + + prepareVersionsList(); + }, [props.versions]); + + const getLevel = (releases: Version[] | undefined): number => { + if (isUndefined(releases)) { + return 0; + } else { + const releasesNumber = releases.length; + if (releasesNumber > 5) { + return 4; + } else if (releasesNumber >= 3 && releasesNumber <= 5) { + return 3; + } + return releasesNumber; + } + }; + + if (isUndefined(versions)) return null; + + return ( + <> + +
+
+ {months.map((month: string) => { + const level = getLevel(versions[month]); + return ( +
+
+
+
+ {moment(month, 'MM/YY').format("MMM'YY")} +
+
+
+
+ Releases:{' '} + {versions[month] ? versions[month].length : 0} +
+
+
+
+ ); + })} +
+
+
+ {moment(months[0], 'MM/YY').format("MMM'YY")} +
+
+ {moment(months[5], 'MM/YY').format("MMM'YY")} +
+
+ {moment(months[months.length - 1], 'MM/YY').format("MMM'YY")} +
+
+
+ + ); +}; + +export default LastYearActivity; diff --git a/web/src/layout/package/__fixtures__/LastYearActivity/1.json b/web/src/layout/package/__fixtures__/LastYearActivity/1.json new file mode 100644 index 00000000..e3a7e3c7 --- /dev/null +++ b/web/src/layout/package/__fixtures__/LastYearActivity/1.json @@ -0,0 +1,260 @@ +[ + { + "version": "2.3.6", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1629760922 + }, + { + "version": "1.10.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613826911 + }, + { + "version": "1.8.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611164780 + }, + { + "version": "0.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.1.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605701000 + }, + { + "version": "0.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.3.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605028294 + }, + { + "version": "2.3.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1624474653 + }, + { + "version": "1.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1608633566 + }, + { + "version": "0.5.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606746676 + }, + { + "version": "1.3.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1599636560 + }, + { + "version": "2.3.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1621598944 + }, + { + "version": "0.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.6.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.7", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632363289 + }, + { + "version": "1.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1597923014 + }, + { + "version": "1.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1610801666 + }, + { + "version": "1.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1621583115 + }, + { + "version": "0.6.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618627407 + }, + { + "version": "0.7.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.7.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616176461 + }, + { + "version": "2.3.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622341938 + }, + { + "version": "1.9.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613162029 + }, + { + "version": "0.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620767898 + }, + { + "version": "1.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.9.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611621849 + }, + { + "version": "0.6.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616049399 + }, + { + "version": "0.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1615120916 + }, + { + "version": "1.3.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1600298432 + } +] diff --git a/web/src/layout/package/__fixtures__/LastYearActivity/2.json b/web/src/layout/package/__fixtures__/LastYearActivity/2.json new file mode 100644 index 00000000..e3a7e3c7 --- /dev/null +++ b/web/src/layout/package/__fixtures__/LastYearActivity/2.json @@ -0,0 +1,260 @@ +[ + { + "version": "2.3.6", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1629760922 + }, + { + "version": "1.10.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613826911 + }, + { + "version": "1.8.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611164780 + }, + { + "version": "0.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.1.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605701000 + }, + { + "version": "0.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.3.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605028294 + }, + { + "version": "2.3.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1624474653 + }, + { + "version": "1.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1608633566 + }, + { + "version": "0.5.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606746676 + }, + { + "version": "1.3.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1599636560 + }, + { + "version": "2.3.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1621598944 + }, + { + "version": "0.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.6.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.7", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632363289 + }, + { + "version": "1.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1597923014 + }, + { + "version": "1.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1610801666 + }, + { + "version": "1.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1621583115 + }, + { + "version": "0.6.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618627407 + }, + { + "version": "0.7.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.7.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616176461 + }, + { + "version": "2.3.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622341938 + }, + { + "version": "1.9.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613162029 + }, + { + "version": "0.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620767898 + }, + { + "version": "1.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.9.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611621849 + }, + { + "version": "0.6.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616049399 + }, + { + "version": "0.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1615120916 + }, + { + "version": "1.3.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1600298432 + } +] diff --git a/web/src/layout/package/__fixtures__/LastYearActivity/3.json b/web/src/layout/package/__fixtures__/LastYearActivity/3.json new file mode 100644 index 00000000..71496091 --- /dev/null +++ b/web/src/layout/package/__fixtures__/LastYearActivity/3.json @@ -0,0 +1,32 @@ +[ + { + "version": "1.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1526545924 + }, + { + "version": "1.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1532307998 + }, + { + "version": "0.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1505208997 + }, + { + "version": "1.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1533705963 + }, + { + "version": "1.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1533703991 + } +] diff --git a/web/src/layout/package/__fixtures__/LastYearActivity/4.json b/web/src/layout/package/__fixtures__/LastYearActivity/4.json new file mode 100644 index 00000000..98b95f99 --- /dev/null +++ b/web/src/layout/package/__fixtures__/LastYearActivity/4.json @@ -0,0 +1,1232 @@ +[ + { + "version": "12.12.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1610993596 + }, + { + "version": "12.8.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1608661585 + }, + { + "version": "12.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606753865 + }, + { + "version": "15.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619731423 + }, + { + "version": "13.7.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1612975609 + }, + { + "version": "18.0.13", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632469532 + }, + { + "version": "16.12.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1625171797 + }, + { + "version": "14.9.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618431211 + }, + { + "version": "18.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632821219 + }, + { + "version": "13.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611005324 + }, + { + "version": "11.1.7", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605612605 + }, + { + "version": "10.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1602272264 + }, + { + "version": "16.6.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623406599 + }, + { + "version": "10.3.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604329633 + }, + { + "version": "16.15.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1626784141 + }, + { + "version": "18.0.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1630236898 + }, + { + "version": "16.7.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623688716 + }, + { + "version": "19.2.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1634650701 + }, + { + "version": "15.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620086847 + }, + { + "version": "10.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1602609870 + }, + { + "version": "19.0.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1633366914 + }, + { + "version": "18.0.9", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1631871926 + }, + { + "version": "13.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611927215 + }, + { + "version": "17.0.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1627046024 + }, + { + "version": "10.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1603904386 + }, + { + "version": "16.9.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623941556 + }, + { + "version": "14.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1617986809 + }, + { + "version": "13.11.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1614064446 + }, + { + "version": "15.4.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620157958 + }, + { + "version": "11.0.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604669875 + }, + { + "version": "16.9.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1624015170 + }, + { + "version": "13.5.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1612809188 + }, + { + "version": "9.4.9", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1602000768 + }, + { + "version": "10.3.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604251662 + }, + { + "version": "18.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1629832172 + }, + { + "version": "12.2.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606550470 + }, + { + "version": "9.4.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601490018 + }, + { + "version": "12.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606943464 + }, + { + "version": "14.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1617388769 + }, + { + "version": "9.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1599738765 + }, + { + "version": "13.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1612461408 + }, + { + "version": "16.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623168998 + }, + { + "version": "15.4.6", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620833902 + }, + { + "version": "12.0.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605710514 + }, + { + "version": "16.6.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623310723 + }, + { + "version": "13.9.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613582983 + }, + { + "version": "16.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623255036 + }, + { + "version": "12.10.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609785051 + }, + { + "version": "14.7.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618417853 + }, + { + "version": "16.12.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1624730097 + }, + { + "version": "14.6.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618001159 + }, + { + "version": "19.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632827022 + }, + { + "version": "13.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1612895608 + }, + { + "version": "18.0.11", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632131243 + }, + { + "version": "18.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632502940 + }, + { + "version": "16.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622125487 + }, + { + "version": "11.0.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604685634 + }, + { + "version": "10.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1602271737 + }, + { + "version": "15.4.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620095269 + }, + { + "version": "16.9.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1624029013 + }, + { + "version": "17.1.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1628345805 + }, + { + "version": "14.6.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1617998895 + }, + { + "version": "16.8.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623755844 + }, + { + "version": "13.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611757026 + }, + { + "version": "14.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616086589 + }, + { + "version": "9.4.6", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601727189 + }, + { + "version": "15.2.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619635012 + }, + { + "version": "11.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604945884 + }, + { + "version": "12.11.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1610296681 + }, + { + "version": "16.1.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622391448 + }, + { + "version": "12.10.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609787626 + }, + { + "version": "9.3.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1599666746 + }, + { + "version": "18.0.8", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1631705491 + }, + { + "version": "12.8.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1607676926 + }, + { + "version": "17.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1628621205 + }, + { + "version": "16.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622220065 + }, + { + "version": "11.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604583724 + }, + { + "version": "12.2.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606152415 + }, + { + "version": "10.1.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1603704985 + }, + { + "version": "13.8.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613580860 + }, + { + "version": "9.4.8", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601912021 + }, + { + "version": "12.9.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609483889 + }, + { + "version": "9.4.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1599877100 + }, + { + "version": "13.0.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611175278 + }, + { + "version": "15.4.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620092689 + }, + { + "version": "16.13.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1626129611 + }, + { + "version": "11.0.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604602529 + }, + { + "version": "9.4.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1600266101 + }, + { + "version": "15.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618964455 + }, + { + "version": "12.12.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1610640514 + }, + { + "version": "16.14.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1626342562 + }, + { + "version": "13.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1612970338 + }, + { + "version": "19.2.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1634647554 + }, + { + "version": "13.4.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611943164 + }, + { + "version": "12.10.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609794038 + }, + { + "version": "13.13.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1614098752 + }, + { + "version": "18.0.6", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1631282518 + }, + { + "version": "19.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1634191220 + }, + { + "version": "14.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1615218006 + }, + { + "version": "12.9.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609537582 + }, + { + "version": "18.0.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1630573223 + }, + { + "version": "17.0.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1627540604 + }, + { + "version": "17.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1627037412 + }, + { + "version": "16.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623423833 + }, + { + "version": "11.1.6", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605549996 + }, + { + "version": "16.11.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1624524532 + }, + { + "version": "15.1.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619044596 + }, + { + "version": "11.1.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605539183 + }, + { + "version": "14.7.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618417011 + }, + { + "version": "10.1.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1603815142 + }, + { + "version": "18.0.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1630825199 + }, + { + "version": "12.12.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1610553454 + }, + { + "version": "10.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1603296848 + }, + { + "version": "19.0.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1634022926 + }, + { + "version": "18.0.10", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1631894315 + }, + { + "version": "13.0.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611171347 + }, + { + "version": "13.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611178600 + }, + { + "version": "14.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616085872 + }, + { + "version": "10.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1603837475 + }, + { + "version": "16.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622995573 + }, + { + "version": "16.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622927073 + }, + { + "version": "16.12.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1625946632 + }, + { + "version": "14.8.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618420411 + }, + { + "version": "12.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605802638 + }, + { + "version": "15.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618929044 + }, + { + "version": "13.13.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1614620149 + }, + { + "version": "10.1.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1603380232 + }, + { + "version": "9.4.10", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1602102095 + }, + { + "version": "16.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1621521291 + }, + { + "version": "17.2.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1628700414 + }, + { + "version": "18.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1629236474 + }, + { + "version": "11.1.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605453434 + }, + { + "version": "12.9.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609355682 + }, + { + "version": "10.3.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604077338 + }, + { + "version": "17.2.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1629038273 + }, + { + "version": "16.6.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623423395 + }, + { + "version": "14.1.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616089260 + }, + { + "version": "17.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1626951176 + }, + { + "version": "13.1.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611240144 + }, + { + "version": "18.0.12", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632153131 + }, + { + "version": "13.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611261211 + }, + { + "version": "16.14.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1626354206 + }, + { + "version": "12.10.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609790322 + }, + { + "version": "12.4.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1607330001 + }, + { + "version": "10.3.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604008434 + }, + { + "version": "10.0.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1602438089 + }, + { + "version": "12.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1607330534 + }, + { + "version": "14.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618416163 + }, + { + "version": "14.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1615260043 + }, + { + "version": "13.0.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611085528 + }, + { + "version": "15.2.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619722862 + }, + { + "version": "18.0.7", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1631613271 + }, + { + "version": "15.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619732214 + }, + { + "version": "15.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618936514 + }, + { + "version": "13.9.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613582364 + }, + { + "version": "12.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1607363377 + }, + { + "version": "15.4.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620175479 + }, + { + "version": "16.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1621607963 + }, + { + "version": "14.8.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618419651 + }, + { + "version": "16.3.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623078102 + }, + { + "version": "15.4.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620767826 + }, + { + "version": "12.2.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606129353 + }, + { + "version": "13.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611083799 + }, + { + "version": "12.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605620999 + }, + { + "version": "9.4.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1600105826 + }, + { + "version": "11.0.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604942333 + }, + { + "version": "9.4.7", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601868951 + }, + { + "version": "12.10.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609786358 + }, + { + "version": "12.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1607380032 + }, + { + "version": "17.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1628110286 + }, + { + "version": "14.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616277863 + }, + { + "version": "12.0.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605689340 + }, + { + "version": "13.12.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1614067067 + }, + { + "version": "16.6.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623340000 + }, + { + "version": "12.0.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605700831 + }, + { + "version": "12.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605614448 + }, + { + "version": "16.4.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623080345 + }, + { + "version": "15.2.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619652262 + }, + { + "version": "12.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605991548 + }, + { + "version": "16.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623078899 + }, + { + "version": "13.2.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611289625 + }, + { + "version": "17.1.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1628344077 + }, + { + "version": "15.2.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619414321 + }, + { + "version": "12.2.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606231378 + }, + { + "version": "16.10.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1624041660 + }, + { + "version": "11.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604335489 + }, + { + "version": "15.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619119887 + }, + { + "version": "13.7.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1612978261 + }, + { + "version": "12.10.6", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609865558 + }, + { + "version": "14.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616868904 + }, + { + "version": "14.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616182482 + }, + { + "version": "12.10.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1609857494 + }, + { + "version": "14.8.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618425896 + }, + { + "version": "12.11.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1610310707 + }, + { + "version": "11.1.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605408757 + }, + { + "version": "9.4.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1600718156 + }, + { + "version": "19.0.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632959902 + }, + { + "version": "13.10.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613662898 + }, + { + "version": "16.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622996097 + }, + { + "version": "15.1.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1619033900 + }, + { + "version": "17.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1627917612 + }, + { + "version": "16.9.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1623851804 + }, + { + "version": "13.0.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611162469 + }, + { + "version": "11.1.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605548401 + }, + { + "version": "11.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1604943384 + } +] diff --git a/web/src/layout/package/__fixtures__/LastYearActivity/5.json b/web/src/layout/package/__fixtures__/LastYearActivity/5.json new file mode 100644 index 00000000..e3a7e3c7 --- /dev/null +++ b/web/src/layout/package/__fixtures__/LastYearActivity/5.json @@ -0,0 +1,260 @@ +[ + { + "version": "2.3.6", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1629760922 + }, + { + "version": "1.10.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613826911 + }, + { + "version": "1.8.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611164780 + }, + { + "version": "0.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.1.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.4.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605701000 + }, + { + "version": "0.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.3.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1605028294 + }, + { + "version": "2.3.5", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1624474653 + }, + { + "version": "1.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1608633566 + }, + { + "version": "0.5.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1606746676 + }, + { + "version": "1.3.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1599636560 + }, + { + "version": "2.3.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1621598944 + }, + { + "version": "0.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.6.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.7", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1632363289 + }, + { + "version": "1.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1597923014 + }, + { + "version": "1.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1610801666 + }, + { + "version": "1.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1621583115 + }, + { + "version": "0.6.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1618627407 + }, + { + "version": "0.7.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.7.2", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616176461 + }, + { + "version": "2.3.4", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1622341938 + }, + { + "version": "1.9.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1613162029 + }, + { + "version": "0.5.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.7.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.3.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1620767898 + }, + { + "version": "1.1.1", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.9.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1611621849 + }, + { + "version": "0.6.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "1.3.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.1.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1616049399 + }, + { + "version": "0.6.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "0.2.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1601199105 + }, + { + "version": "2.0.0", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1615120916 + }, + { + "version": "1.3.3", + "containsSecurityUpdates": false, + "prerelease": false, + "ts": 1600298432 + } +] diff --git a/web/src/layout/package/__snapshots__/Details.test.tsx.snap b/web/src/layout/package/__snapshots__/Details.test.tsx.snap index f9400929..640ee927 100644 --- a/web/src/layout/package/__snapshots__/Details.test.tsx.snap +++ b/web/src/layout/package/__snapshots__/Details.test.tsx.snap @@ -101,6 +101,489 @@ exports[`Details renders correctly 1`] = `
+
+
+ + + Last year activity + + +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + Nov'20 + +
+
+ + Apr'21 + +
+
+ + Oct'21 + +
+
+
+
+
+ + + Last year activity + + +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + Nov'20 + +
+
+ + Apr'21 + +
+
+ + Oct'21 + +
+
+
+ +`; diff --git a/web/src/layout/package/index.test.tsx b/web/src/layout/package/index.test.tsx index c341049c..f18f5e36 100644 --- a/web/src/layout/package/index.test.tsx +++ b/web/src/layout/package/index.test.tsx @@ -39,6 +39,16 @@ const defaultProps = { }; describe('Package index', () => { + let dateNowSpy: any; + + beforeEach(() => { + dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1634969145000); + }); + + afterAll(() => { + dateNowSpy.mockRestore(); + }); + afterEach(() => { jest.resetAllMocks(); }); diff --git a/web/src/themes/dark.scss b/web/src/themes/dark.scss index 5378f84d..a05b22d0 100644 --- a/web/src/themes/dark.scss +++ b/web/src/themes/dark.scss @@ -43,6 +43,12 @@ --mid-gray: #495057; --badge-bg: #1a1c1f; + --color-activity-0: #161b22; + --color-activity-1: #0e4429; + --color-activity-2: #006d32; + --color-activity-3: #26a641; + --color-activity-4: #39d353; + $border-solid: #737475; body { diff --git a/web/src/themes/default.scss b/web/src/themes/default.scss index 5f589f68..b47afdd1 100644 --- a/web/src/themes/default.scss +++ b/web/src/themes/default.scss @@ -204,3 +204,19 @@ button, background-color: #686868; border: 2px solid var(--white); } + +/* Popover */ +.popover { + background-color: var(--white); + color: var(--color-font); + border-color: var(--mid-gray); +} + +.popover-header { + background-color: var(--light-gray); + border-color: var(--mid-gray); +} + +.popover-body { + color: var(--color-font); +} diff --git a/web/src/themes/light.scss b/web/src/themes/light.scss index 1045f71d..b7cdc656 100644 --- a/web/src/themes/light.scss +++ b/web/src/themes/light.scss @@ -26,6 +26,12 @@ --mid-gray: #6c757d; --badge-bg: #f3f6f9; + --color-activity-0: #ebedf0; + --color-activity-1: #9be9a8; + --color-activity-2: #40c463; + --color-activity-3: #30a14e; + --color-activity-4: #216e39; + // $theme-colors for Bootstrap $color1: #417598; $color2: #2d4857;