fix: resolve linting issues and add dropdown tabindex
Node.js CI / CI (pull_request) Successful in 1m22s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m26s

Fixed ESLint error in header component:
- Added tabindex="-1" to dropdown menu for keyboard accessibility
- Ensures dropdown is focusable for screen readers

Auto-fixed formatting issues:
- Ran ESLint --fix to auto-correct stylistic issues
- Fixed key spacing in achievement constants
- Fixed object key ordering

Test Results:
-  All 123 tests passing (1 API + 122 shared-types)
-  Frontend linting passes
-  Only non-critical warnings remain in e2e and shared-types
This commit is contained in:
2026-02-20 01:49:10 -08:00
committed by Naomi Carrigan
parent abb39c67f2
commit 544c090ff3
8 changed files with 642 additions and 608 deletions
@@ -58,6 +58,7 @@ import { ApiService } from '../../services/api.service';
class="dropdown-menu" class="dropdown-menu"
role="menu" role="menu"
aria-label="User menu" aria-label="User menu"
tabindex="-1"
(keydown.escape)="closeDropdown()" (keydown.escape)="closeDropdown()"
> >
<a [routerLink]="['/profile', user.slug || user.id]" class="dropdown-item" role="menuitem" (click)="closeDropdown()">My Profile</a> <a [routerLink]="['/profile', user.slug || user.id]" class="dropdown-item" role="menuitem" (click)="closeDropdown()">My Profile</a>
File diff suppressed because it is too large Load Diff
+29 -29
View File
@@ -21,50 +21,50 @@ export enum AchievementTier {
} }
export interface AchievementRequirements { export interface AchievementRequirements {
count?: number; count?: number;
rate?: number; rate?: number;
streak?: number; streak?: number;
diversity?: boolean; diversity?: boolean;
uniqueItems?: number; uniqueItems?: number;
dayRange?: number; dayRange?: number;
} }
export interface AchievementDefinition { export interface AchievementDefinition {
key: string; key: string;
title: string; title: string;
description: string; description: string;
category: AchievementCategory; category: AchievementCategory;
tier: AchievementTier; tier: AchievementTier;
icon: string; icon: string;
points: number; points: number;
requirements: AchievementRequirements; requirements: AchievementRequirements;
} }
export interface UserAchievement { export interface UserAchievement {
id: string; id: string;
userId: string; userId: string;
achievementKey: string; achievementKey: string;
progress: number; progress: number;
earned: boolean; earned: boolean;
earnedAt?: Date; earnedAt?: Date;
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;
} }
export interface AchievementProgress { export interface AchievementProgress {
definition: AchievementDefinition; definition: AchievementDefinition;
progress: number; progress: number;
earned: boolean; earned: boolean;
earnedAt?: Date; earnedAt?: Date;
} }
export interface UserAchievementSummary { export interface UserAchievementSummary {
totalPoints: number; totalPoints: number;
totalEarned: number; totalEarned: number;
recentAchievements: AchievementProgress[]; recentAchievements: Array<AchievementProgress>;
progressByCategory: { progressByCategory: Array<{
category: AchievementCategory; category: AchievementCategory;
earned: number; earned: number;
total: number; total: number;
}[]; }>;
} }
+15 -15
View File
@@ -30,39 +30,39 @@ interface BaseActivity {
} }
interface SuggestionActivity extends BaseActivity { interface SuggestionActivity extends BaseActivity {
type: ActivityType.suggestion; type: ActivityType.suggestion;
entityType: string; entityType: string;
suggestionTitle: string; suggestionTitle: string;
status: string; status: string;
} }
interface LikeActivity extends BaseActivity { interface LikeActivity extends BaseActivity {
type: ActivityType.like; type: ActivityType.like;
entityType: string; entityType: string;
entityId: string; entityId: string;
entityTitle: string; entityTitle: string;
} }
interface CommentActivity extends BaseActivity { interface CommentActivity extends BaseActivity {
type: ActivityType.comment; type: ActivityType.comment;
entityType: string; entityType: string;
entityId: string; entityId: string;
entityTitle: string; entityTitle: string;
commentPreview: string; commentPreview: string;
} }
interface AchievementActivity extends BaseActivity { interface AchievementActivity extends BaseActivity {
type: ActivityType.achievement; type: ActivityType.achievement;
achievementKey: string; achievementKey: string;
achievementName: string; achievementName: string;
achievementIcon: string; achievementIcon: string;
achievementPoints: number; achievementPoints: number;
} }
type Activity = SuggestionActivity | LikeActivity | CommentActivity | AchievementActivity; type Activity = SuggestionActivity | LikeActivity | CommentActivity | AchievementActivity;
interface ActivityFeedResponse { interface ActivityFeedResponse {
activities: Activity[]; activities: Array<Activity>;
total: number; total: number;
hasMore: boolean; hasMore: boolean;
} }
+3 -3
View File
@@ -34,9 +34,9 @@ interface User {
isAdmin: boolean; isAdmin: boolean;
isBanned: boolean; isBanned: boolean;
inDiscord: boolean; inDiscord: boolean;
isVip: boolean; isVip: boolean;
isMod: boolean; isMod: boolean;
isStaff: boolean; isStaff: boolean;
} }
interface JwtPayload { interface JwtPayload {
+22 -22
View File
@@ -4,34 +4,34 @@
* @author Naomi Carrigan * @author Naomi Carrigan
*/ */
import { PrimaryBadge } from "./auth.types"; import type { PrimaryBadge } from "./auth.types";
interface CommentUser { interface CommentUser {
id: string; id: string;
username: string; username: string;
avatar?: string; avatar?: string;
primaryBadge?: PrimaryBadge; primaryBadge?: PrimaryBadge;
inDiscord?: boolean; inDiscord?: boolean;
isVip?: boolean; isVip?: boolean;
isMod?: boolean; isMod?: boolean;
isStaff?: boolean; isStaff?: boolean;
} }
interface Comment { interface Comment {
id: string; id: string;
content: string; content: string;
rawContent?: string; rawContent?: string;
userId: string; userId: string;
user: CommentUser; user: CommentUser;
gameId?: string; gameId?: string;
bookId?: string; bookId?: string;
musicId?: string; musicId?: string;
artId?: string; artId?: string;
showId?: string; showId?: string;
mangaId?: string; mangaId?: string;
hasPendingReports?: boolean; hasPendingReports?: boolean;
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;
} }
interface CreateCommentDto { interface CreateCommentDto {
+20 -20
View File
@@ -5,21 +5,21 @@
*/ */
interface LeaderboardUser { interface LeaderboardUser {
id: string; id: string;
username: string; username: string;
slug: string | null; slug: string | null;
avatar: string | null; avatar: string | null;
primaryBadge: string | null; primaryBadge: string | null;
isVip: boolean; isVip: boolean;
isMod: boolean; isMod: boolean;
isStaff: boolean; isStaff: boolean;
createdAt: Date; createdAt: Date;
} }
interface SuggestionsLeaderboard extends LeaderboardUser { interface SuggestionsLeaderboard extends LeaderboardUser {
totalSuggestions: number; totalSuggestions: number;
acceptedSuggestions: number; acceptedSuggestions: number;
acceptanceRate: number; acceptanceRate: number;
} }
interface LikesLeaderboard extends LeaderboardUser { interface LikesLeaderboard extends LeaderboardUser {
@@ -31,20 +31,20 @@ interface CommentsLeaderboard extends LeaderboardUser {
} }
interface OverallLeaderboard extends LeaderboardUser { interface OverallLeaderboard extends LeaderboardUser {
totalSuggestions: number; totalSuggestions: number;
totalLikes: number; totalLikes: number;
totalComments: number; totalComments: number;
achievementCount: number; achievementCount: number;
achievementPoints: number; achievementPoints: number;
currentStreak: number; currentStreak: number;
diversityScore: number; diversityScore: number;
} }
interface LeaderboardResponse { interface LeaderboardResponse {
topSuggestions: SuggestionsLeaderboard[]; topSuggestions: Array<SuggestionsLeaderboard>;
topLikes: LikesLeaderboard[]; topLikes: Array<LikesLeaderboard>;
topComments: CommentsLeaderboard[]; topComments: Array<CommentsLeaderboard>;
topOverall: OverallLeaderboard[]; topOverall: Array<OverallLeaderboard>;
} }
export { export {
+3 -3
View File
@@ -74,10 +74,10 @@ export interface CommentReport {
export interface CommentReportWithDetails extends CommentReport { export interface CommentReportWithDetails extends CommentReport {
reportedComment: { reportedComment: {
id: string; id: string;
content: string; content: string;
rawContent?: string; rawContent?: string;
userId: string; userId: string;
user: { user: {
id: string; id: string;
username: string; username: string;