diff --git a/src/Controller/OrganizationController.php b/src/Controller/OrganizationController.php index fadafc46..9107026b 100644 --- a/src/Controller/OrganizationController.php +++ b/src/Controller/OrganizationController.php @@ -131,6 +131,7 @@ public function packageDetails(Organization $organization, Package $package, Req 'filter' => $filter, 'count' => $this->packageQuery->versionCount($package->id()), 'versions' => $this->packageQuery->getVersions($package->id(), $filter), + 'installs' => $this->packageQuery->getInstalls($package->id(), 0), ]); } diff --git a/src/Query/User/PackageQuery/DbalPackageQuery.php b/src/Query/User/PackageQuery/DbalPackageQuery.php index 85214d73..c5639dc9 100644 --- a/src/Query/User/PackageQuery/DbalPackageQuery.php +++ b/src/Query/User/PackageQuery/DbalPackageQuery.php @@ -116,7 +116,22 @@ public function count(string $organizationId, Filter $filter): int public function getById(string $id): Option { $data = $this->connection->fetchAssoc( - 'SELECT id, organization_id, type, repository_url, name, latest_released_version, latest_release_date, description, last_sync_at, last_sync_error, webhook_created_at, keep_last_releases + 'SELECT + id, + organization_id, + type, + repository_url, + name, + latest_released_version, + latest_release_date, + description, + last_sync_at, + last_sync_error, + webhook_created_at, + last_scan_date, + last_scan_status, + last_scan_result, + keep_last_releases FROM "organization_package" WHERE id = :id', [ ':id' => $id, diff --git a/templates/admin/proxy/dist.html.twig b/templates/admin/proxy/dist.html.twig index 9cf014ee..ee25e2f9 100644 --- a/templates/admin/proxy/dist.html.twig +++ b/templates/admin/proxy/dist.html.twig @@ -17,7 +17,7 @@ {% for package in packages %} {{ package }} - {{ downloads[package].downloads ?? 0 }} + {{ downloads[package].downloads ?? 0 }} {% if downloads[package] is defined %} diff --git a/templates/base.html.twig b/templates/base.html.twig index 05930b7f..1a7f0ffe 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -106,7 +106,7 @@

{% block header %}{% endblock %}

-
+
{% block header_btn %}{% endblock %}
diff --git a/templates/component/js/base.js b/templates/component/js/base.js index 923f5e77..70187571 100644 --- a/templates/component/js/base.js +++ b/templates/component/js/base.js @@ -28,4 +28,8 @@ }); $('[data-toggle="tooltip"]').tooltip(); + + $('.number-format').each(function() { + $(this).text(parseInt($(this).text()).toLocaleString()); + }); })(); diff --git a/templates/component/js/stats.js.twig b/templates/component/js/stats.js.twig index a32b1de1..4b6bb4c8 100644 --- a/templates/component/js/stats.js.twig +++ b/templates/component/js/stats.js.twig @@ -35,6 +35,13 @@ xaxis: { type: 'datetime', }, + yaxis: { + labels: { + formatter: function (value) { + return value.toLocaleString(); + }, + }, + }, labels: [{{ installs.days | map(day => "'#{day.date}'") | join(',') | raw }}], colors: ["#206bc4"], legend: { diff --git a/templates/component/js/statsVersions.js.twig b/templates/component/js/statsVersions.js.twig index 83b1453e..14adc430 100644 --- a/templates/component/js/statsVersions.js.twig +++ b/templates/component/js/statsVersions.js.twig @@ -28,6 +28,13 @@ xaxis: { type: 'datetime', }, + yaxis: { + labels: { + formatter: function (value) { + return value.toLocaleString(); + }, + }, + }, colors: ["#206bc4"], noData: { text: 'Loading...' diff --git a/templates/component/packageActions.html.twig b/templates/component/packageActions.html.twig new file mode 100644 index 00000000..8b1a85aa --- /dev/null +++ b/templates/component/packageActions.html.twig @@ -0,0 +1,56 @@ +{% set currentPath = app.request.get('_route') %} + + + + diff --git a/templates/organization/package/details.html.twig b/templates/organization/package/details.html.twig index 81c8b957..ad927643 100644 --- a/templates/organization/package/details.html.twig +++ b/templates/organization/package/details.html.twig @@ -1,10 +1,16 @@ {% extends 'base.html.twig' %} -{% block header %}{{ package.name }} details{% endblock %} -{% block header_btn %} - - {% include 'svg/package.svg' %} Package list +{% block header %} + + « + {% include 'svg/package.svg' %} + + {{ package.name }} details +{% endblock %} +{% block header_btn %} + {% include 'component/packageActions.html.twig' %} {% endblock %} {% block content %} @@ -21,15 +27,46 @@ +
+
+

Total Installs

+

+ + {{ installs.total }} + +

+
+ +
+ {% if package.latestReleaseDate %}

Latest version

{{ package.latestReleasedVersion }} (released: - - {{ package.latestReleaseDate|date_time_utc|time_diff }} - ) + + {{ package.latestReleaseDate|date_time_utc|time_diff }})

diff --git a/templates/organization/package/scanResults.html.twig b/templates/organization/package/scanResults.html.twig index ac5762dc..b4708cae 100644 --- a/templates/organization/package/scanResults.html.twig +++ b/templates/organization/package/scanResults.html.twig @@ -1,10 +1,18 @@ {% extends 'base.html.twig' %} -{% block header %}Package: {{ package.name }} security scan results{% endblock %} +{% block header %} + + « + {% include 'svg/package.svg' %} + + + {{ package.name }} + security scan results +{% endblock %} + {% block header_btn %} - - {% include 'svg/package.svg' %} Package list - + {% include 'component/packageActions.html.twig' %} {% endblock %} {% block content %} diff --git a/templates/organization/package/stats.html.twig b/templates/organization/package/stats.html.twig index 4c9bc9f7..ec080d46 100644 --- a/templates/organization/package/stats.html.twig +++ b/templates/organization/package/stats.html.twig @@ -1,6 +1,20 @@ {% extends 'organization/stats.html.twig' %} -{% block header %}{{ package.name }} installs (last {{ days }} days){% endblock %} +{% block header %} + + « + {% include 'svg/package.svg' %} + + + {{ package.name }} + installs (last {{ days }} days) +{% endblock %} + +{% block header_btn %} + {{ parent() }} + {% include 'component/packageActions.html.twig' %} +{% endblock %} {% block content %}

Daily installs

@@ -10,9 +24,9 @@

Summary

- Today installs: {{ (installs.days | last).installs }} - Last {{ days ?? 30 }} days installs: {{ installs.daysTotal }} - Total installs: {{ installs.total }} + Today installs: {{ (installs.days | last).installs }} + Last {{ days ?? 30 }} days installs: {{ installs.daysTotal }} + Total installs: {{ installs.total }}


diff --git a/templates/organization/package/webhook.html.twig b/templates/organization/package/webhook.html.twig index a3c2b975..14cefb27 100644 --- a/templates/organization/package/webhook.html.twig +++ b/templates/organization/package/webhook.html.twig @@ -1,10 +1,17 @@ {% extends 'base.html.twig' %} -{% block header %}Package: {{ package.name }} webhook{% endblock %} -{% block header_btn %} - - {% include 'svg/package.svg' %} Package list +{% block header %} + + « + {% include 'svg/package.svg' %} + + {{ package.name }} + webhook +{% endblock %} +{% block header_btn %} + {% include 'component/packageActions.html.twig' %} {% endblock %} {% block content %} diff --git a/templates/organization/packages.html.twig b/templates/organization/packages.html.twig index 3beececd..12447859 100644 --- a/templates/organization/packages.html.twig +++ b/templates/organization/packages.html.twig @@ -111,55 +111,7 @@ {% endif %} - - - - + {% include 'component/packageActions.html.twig' %} {% endif %} diff --git a/templates/organization/stats.html.twig b/templates/organization/stats.html.twig index 4bd5bd01..9fa1b5c0 100644 --- a/templates/organization/stats.html.twig +++ b/templates/organization/stats.html.twig @@ -20,9 +20,9 @@

Summary:

- Today installs: {{ (installs.days | last).installs }}
- Last {{ days ?? 30 }} days installs: {{ installs.daysTotal }}
- Total installs: {{ installs.total }} + Today installs: {{ (installs.days | last).installs }}
+ Last {{ days ?? 30 }} days installs: {{ installs.daysTotal }}
+ Total installs: {{ installs.total }}

{% endblock %} diff --git a/tests/Functional/Controller/Admin/OrganizationControllerTest.php b/tests/Functional/Controller/Admin/OrganizationControllerTest.php index cd6f9fee..97920d34 100644 --- a/tests/Functional/Controller/Admin/OrganizationControllerTest.php +++ b/tests/Functional/Controller/Admin/OrganizationControllerTest.php @@ -44,9 +44,9 @@ public function testStats(): void $orgId = $this->fixtures->createOrganization('buddy', $this->userId); $packageId = $this->fixtures->addPackage($orgId, 'https://some.url'); $this->fixtures->addPackageDownload(1, $packageId); - $this->client->request('GET', $this->urlTo('admin_stats')); + $crawler = $this->client->request('GET', $this->urlTo('admin_stats')); self::assertTrue($this->client->getResponse()->isOk()); - self::assertStringContainsString('Total installs: 1', $this->lastResponseBody()); + self::assertStringContainsString('Total installs: 1', $crawler->text(null, true)); } } diff --git a/tests/Functional/Controller/Admin/ProxyControllerTest.php b/tests/Functional/Controller/Admin/ProxyControllerTest.php index c827e9d5..5ac2a527 100644 --- a/tests/Functional/Controller/Admin/ProxyControllerTest.php +++ b/tests/Functional/Controller/Admin/ProxyControllerTest.php @@ -33,10 +33,10 @@ public function testStats(): void [new Package('buddy-works/repman', '1.0.0.0')], new \DateTimeImmutable('2020-04-27 19:34:00') ); - $this->client->request('GET', $this->urlTo('admin_proxy_stats')); + $crawler = $this->client->request('GET', $this->urlTo('admin_proxy_stats')); self::assertTrue($this->client->getResponse()->isOk()); - self::assertStringContainsString('Total installs: 1', $this->lastResponseBody()); + self::assertStringContainsString('Total installs: 1', $crawler->text(null, true)); } public function testRemoveDistPackage(): void diff --git a/tests/Functional/Controller/OrganizationControllerTest.php b/tests/Functional/Controller/OrganizationControllerTest.php index 3b0829a5..d49dfe22 100644 --- a/tests/Functional/Controller/OrganizationControllerTest.php +++ b/tests/Functional/Controller/OrganizationControllerTest.php @@ -428,13 +428,13 @@ public function testPackageStats(): void $packageId = $this->fixtures->addPackage($buddyId, 'https://buddy.com'); $this->fixtures->addPackageDownload(3, $packageId, $version = '1.2.3'); - $this->client->request('GET', $this->urlTo('organization_package_stats', [ + $crawler = $this->client->request('GET', $this->urlTo('organization_package_stats', [ 'organization' => 'buddy', 'package' => $packageId, ])); self::assertTrue($this->client->getResponse()->isOk()); - self::assertStringContainsString('Total installs: 3', $this->lastResponseBody()); + self::assertStringContainsString('Total installs: 3', $crawler->text(null, true)); $this->client->request('GET', $this->urlTo('organization_package_version_stats', [ 'organization' => 'buddy', @@ -469,12 +469,12 @@ public function testOrganizationStats(): void $packageId = $this->fixtures->addPackage($buddyId, 'https://buddy.com'); $this->fixtures->addPackageDownload(3, $packageId); - $this->client->request('GET', $this->urlTo('organizations_stats', [ + $crawler = $this->client->request('GET', $this->urlTo('organizations_stats', [ 'organization' => 'buddy', ])); self::assertTrue($this->client->getResponse()->isOk()); - self::assertStringContainsString('Total installs: 3', $this->lastResponseBody()); + self::assertStringContainsString('Total installs: 3', $crawler->text(null, true)); } public function testGenerateNewToken(): void @@ -710,13 +710,13 @@ public function testPackageScanResultsWithWarningStatus(): void 'sub-dir/composer.lock' => [], ]); - $this->client->request('GET', $this->urlTo('organization_package_scan_results', [ + $crawler = $this->client->request('GET', $this->urlTo('organization_package_scan_results', [ 'organization' => $organization, 'package' => $packageId, ])); self::assertStringContainsString($version, $this->lastResponseBody()); - self::assertStringContainsString('Package: buddy-works/repman security scan results', $this->lastResponseBody()); + self::assertStringContainsString('buddy-works/repman security scan results', $crawler->text(null, true)); self::assertStringContainsString('warning', $this->lastResponseBody()); self::assertStringContainsString('vendor/some-dependency', $this->lastResponseBody()); self::assertStringContainsString('6.6.6', $this->lastResponseBody());