diff --git a/server/application-server/openapi.yaml b/server/application-server/openapi.yaml index a193b0d2..1e0fb315 100644 --- a/server/application-server/openapi.yaml +++ b/server/application-server/openapi.yaml @@ -465,6 +465,9 @@ components: rank: type: integer format: int32 + numberOfReviewedPRs: + type: integer + format: int32 changesRequested: type: array items: diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/leaderboard/LeaderboardEntry.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/leaderboard/LeaderboardEntry.java index 28115cf1..a0dafb54 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/leaderboard/LeaderboardEntry.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/leaderboard/LeaderboardEntry.java @@ -21,6 +21,7 @@ public class LeaderboardEntry { private UserType type; private int score; private int rank; + private int numberOfReviewedPRs; private PullRequestReviewDTO[] changesRequested; private PullRequestReviewDTO[] approvals; private PullRequestReviewDTO[] comments; diff --git a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/leaderboard/LeaderboardService.java b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/leaderboard/LeaderboardService.java index fbb495f6..a031c407 100644 --- a/server/application-server/src/main/java/de/tum/in/www1/hephaestus/leaderboard/LeaderboardService.java +++ b/server/application-server/src/main/java/de/tum/in/www1/hephaestus/leaderboard/LeaderboardService.java @@ -56,6 +56,7 @@ public List createLeaderboard(Optional after, Optio return null; } AtomicInteger score = new AtomicInteger(0); + Set reviewedPRs = new HashSet<>(); Set changesRequestedSet = new HashSet<>(); Set approvedSet = new HashSet<>(); Set commentSet = new HashSet<>(); @@ -69,6 +70,7 @@ public List createLeaderboard(Optional after, Optio PullRequestReviewDTO reviewDTO = new PullRequestReviewDTO(review.getId(), review.getCreatedAt(), review.getUpdatedAt(), review.getSubmittedAt(), review.getState()); + reviewedPRs.add(review.getPullRequest().getNumber()); switch (review.getState()) { case CHANGES_REQUESTED: changesRequestedSet.add(reviewDTO); @@ -88,6 +90,7 @@ public List createLeaderboard(Optional after, Optio return new LeaderboardEntry(user.getLogin(), user.getAvatarUrl(), user.getName(), user.getType(), score.get(), 0, // preliminary rank + reviewedPRs.size(), changesRequestedSet.toArray(new PullRequestReviewDTO[changesRequestedSet.size()]), approvedSet.toArray(new PullRequestReviewDTO[approvedSet.size()]), commentSet.toArray(new PullRequestReviewDTO[commentSet.size()])); diff --git a/webapp/src/app/core/modules/openapi/model/leaderboard-entry.ts b/webapp/src/app/core/modules/openapi/model/leaderboard-entry.ts index eeb83ebf..e65a9c77 100644 --- a/webapp/src/app/core/modules/openapi/model/leaderboard-entry.ts +++ b/webapp/src/app/core/modules/openapi/model/leaderboard-entry.ts @@ -19,6 +19,7 @@ export interface LeaderboardEntry { type?: LeaderboardEntry.TypeEnum; score?: number; rank?: number; + numberOfReviewedPRs?: number; changesRequested?: Array; approvals?: Array; comments?: Array; diff --git a/webapp/src/app/home/leaderboard/leaderboard.component.html b/webapp/src/app/home/leaderboard/leaderboard.component.html index 8eab294a..59cd9368 100644 --- a/webapp/src/app/home/leaderboard/leaderboard.component.html +++ b/webapp/src/app/home/leaderboard/leaderboard.component.html @@ -25,6 +25,13 @@ {{ entry.score }}
+
+ + {{ entry.numberOfReviewedPRs }} +
+
+ +
@if (entry.changesRequested && entry.changesRequested.length > 0) {
diff --git a/webapp/src/app/home/leaderboard/leaderboard.component.ts b/webapp/src/app/home/leaderboard/leaderboard.component.ts index 3feb3dc8..5a05d903 100644 --- a/webapp/src/app/home/leaderboard/leaderboard.component.ts +++ b/webapp/src/app/home/leaderboard/leaderboard.component.ts @@ -1,6 +1,6 @@ import { Component, input } from '@angular/core'; import { NgIconComponent } from '@ng-icons/core'; -import { octFileDiff, octCheck, octComment } from '@ng-icons/octicons'; +import { octFileDiff, octCheck, octComment, octGitPullRequest, octChevronRight } from '@ng-icons/octicons'; import { LeaderboardEntry } from 'app/core/modules/openapi'; import { AvatarFallbackComponent } from 'app/ui/avatar/avatar-fallback.component'; import { AvatarImageComponent } from 'app/ui/avatar/avatar-image.component'; @@ -37,6 +37,8 @@ export class LeaderboardComponent { protected octFileDiff = octFileDiff; protected octCheck = octCheck; protected octComment = octComment; + protected octGitPullRequest = octGitPullRequest; + protected octChevronRight = octChevronRight; leaderboard = input(); }