do to formatters

This commit is contained in:
2026-01-24 01:07:43 +01:00
parent ae59df61eb
commit 891b3cf0ee
140 changed files with 656 additions and 1159 deletions

View File

@@ -1,8 +1,8 @@
import { DateFormatter } from "@/lib/formatters/DateFormatter";
import { UserRoleFormatter } from "@/lib/formatters/UserRoleFormatter";
import { UserStatusFormatter } from "@/lib/formatters/UserStatusFormatter";
import type { AdminUserViewData } from '@/lib/view-data/AdminUserViewData';
import { ViewModel } from "../contracts/view-models/ViewModel";
import { UserStatusDisplay } from "@/lib/display-objects/UserStatusDisplay";
import { UserRoleDisplay } from "@/lib/display-objects/UserRoleDisplay";
import { DateDisplay } from "@/lib/display-objects/DateDisplay";
/**
* AdminUserViewModel
@@ -31,28 +31,28 @@ export class AdminUserViewModel extends ViewModel {
/** UI-specific: Role badges using Display Object */
get roleBadges(): string[] {
return this.roles.map(role => UserRoleDisplay.roleLabel(role));
return this.roles.map(role => UserRoleFormatter.roleLabel(role));
}
/** UI-specific: Status badge label using Display Object */
get statusBadgeLabel(): string {
return UserStatusDisplay.statusLabel(this.status);
return UserStatusFormatter.statusLabel(this.status);
}
/** UI-specific: Status badge variant using Display Object */
get statusBadgeVariant(): string {
return UserStatusDisplay.statusVariant(this.status);
return UserStatusFormatter.statusVariant(this.status);
}
/** UI-specific: Formatted last login date */
get lastLoginFormatted(): string {
return this.lastLoginAt
? DateDisplay.formatShort(this.lastLoginAt)
? DateFormatter.formatShort(this.lastLoginAt)
: 'Never';
}
/** UI-specific: Formatted creation date */
get createdAtFormatted(): string {
return DateDisplay.formatShort(this.createdAt);
return DateFormatter.formatShort(this.createdAt);
}
}

View File

@@ -4,11 +4,11 @@
*
* Accepts AnalyticsMetricsViewData as input and produces UI-ready data.
*/
import { AnalyticsMetricsViewData } from "../view-data/AnalyticsMetricsViewData";
import { DurationFormatter } from "@/lib/formatters/DurationFormatter";
import { NumberFormatter } from "@/lib/formatters/NumberFormatter";
import { PercentFormatter } from "@/lib/formatters/PercentFormatter";
import { ViewModel } from "../contracts/view-models/ViewModel";
import { NumberDisplay } from "@/lib/display-objects/NumberDisplay";
import { DurationDisplay } from "@/lib/display-objects/DurationDisplay";
import { PercentDisplay } from "@/lib/display-objects/PercentDisplay";
import { AnalyticsMetricsViewData } from "../view-data/AnalyticsMetricsViewData";
export class AnalyticsMetricsViewModel extends ViewModel {
private readonly data: AnalyticsMetricsViewData;
@@ -25,21 +25,21 @@ export class AnalyticsMetricsViewModel extends ViewModel {
/** UI-specific: Formatted page views */
get formattedPageViews(): string {
return NumberDisplay.format(this.pageViews);
return NumberFormatter.format(this.pageViews);
}
/** UI-specific: Formatted unique visitors */
get formattedUniqueVisitors(): string {
return NumberDisplay.format(this.uniqueVisitors);
return NumberFormatter.format(this.uniqueVisitors);
}
/** UI-specific: Formatted session duration */
get formattedSessionDuration(): string {
return DurationDisplay.formatSeconds(this.averageSessionDuration);
return DurationFormatter.formatSeconds(this.averageSessionDuration);
}
/** UI-specific: Formatted bounce rate */
get formattedBounceRate(): string {
return PercentDisplay.format(this.bounceRate);
return PercentFormatter.format(this.bounceRate);
}
}

View File

@@ -6,19 +6,17 @@
* Accepts AvailableLeaguesViewData as input and produces UI-ready data.
*/
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import { LeagueTierFormatter } from "../formatters/LeagueTierFormatter";
import { NumberFormatter } from "../formatters/NumberFormatter";
import { SeasonStatusFormatter } from "../formatters/SeasonStatusFormatter";
import { AvailableLeaguesViewData, AvailableLeagueViewData } from "../view-data/AvailableLeaguesViewData";
import { NumberDisplay } from "../display-objects/NumberDisplay";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { LeagueTierDisplay } from "../display-objects/LeagueTierDisplay";
import { SeasonStatusDisplay } from "../display-objects/SeasonStatusDisplay";
export class AvailableLeaguesViewModel extends ViewModel {
private readonly data: AvailableLeaguesViewData;
readonly leagues: AvailableLeagueViewModel[];
constructor(data: AvailableLeaguesViewData) {
super();
this.data = data;
this.leagues = data.leagues.map(league => new AvailableLeagueViewModel(league));
}
}
@@ -46,7 +44,7 @@ export class AvailableLeagueViewModel extends ViewModel {
/** UI-specific: Formatted average views */
get formattedAvgViews(): string {
return NumberDisplay.formatCompact(this.avgViewsPerRace);
return NumberFormatter.formatCompact(this.avgViewsPerRace);
}
/** UI-specific: CPM calculation */
@@ -56,7 +54,7 @@ export class AvailableLeagueViewModel extends ViewModel {
/** UI-specific: Formatted CPM */
get formattedCpm(): string {
return CurrencyDisplay.formatCompact(this.cpm);
return CurrencyFormatter.formatCompact(this.cpm);
}
/** UI-specific: Check if any sponsor slots are available */
@@ -66,12 +64,12 @@ export class AvailableLeagueViewModel extends ViewModel {
/** UI-specific: Tier configuration for badge styling */
get tierConfig() {
return LeagueTierDisplay.getDisplay(this.tier);
return LeagueTierFormatter.getDisplay(this.tier);
}
/** UI-specific: Status configuration for season state */
get statusConfig() {
return SeasonStatusDisplay.getDisplay(this.seasonStatus);
return SeasonStatusFormatter.getDisplay(this.seasonStatus);
}
}

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { AvatarDisplay } from "../display-objects/AvatarDisplay";
import { AvatarViewData } from "@/lib/view-data/AvatarViewData";
import { ViewModel } from "../contracts/view-models/ViewModel";
import { AvatarFormatter } from "../formatters/AvatarFormatter";
/**
* Avatar View Model
@@ -23,11 +23,11 @@ export class AvatarViewModel extends ViewModel {
/** UI-specific: Derive content type label using Display Object */
get contentTypeLabel(): string {
return AvatarDisplay.formatContentType(this.data.contentType);
return AvatarFormatter.formatContentType(this.data.contentType);
}
/** UI-specific: Derive validity check using Display Object */
get hasValidData(): boolean {
return AvatarDisplay.hasValidData(this.data.buffer, this.data.contentType);
return AvatarFormatter.hasValidData(this.data.buffer, this.data.contentType);
}
}

View File

@@ -1,5 +1,5 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { OnboardingStatusDisplay } from '../display-objects/OnboardingStatusDisplay';
import { OnboardingStatusFormatter } from '../formatters/OnboardingStatusFormatter';
import type { CompleteOnboardingViewData } from '../view-data/CompleteOnboardingViewData';
/**
@@ -22,22 +22,22 @@ export class CompleteOnboardingViewModel extends ViewModel {
/** UI-specific: Status label using Display Object */
get statusLabel(): string {
return OnboardingStatusDisplay.statusLabel(this.success);
return OnboardingStatusFormatter.statusLabel(this.success);
}
/** UI-specific: Status variant using Display Object */
get statusVariant(): string {
return OnboardingStatusDisplay.statusVariant(this.success);
return OnboardingStatusFormatter.statusVariant(this.success);
}
/** UI-specific: Status icon using Display Object */
get statusIcon(): string {
return OnboardingStatusDisplay.statusIcon(this.success);
return OnboardingStatusFormatter.statusIcon(this.success);
}
/** UI-specific: Status message using Display Object */
get statusMessage(): string {
return OnboardingStatusDisplay.statusMessage(this.success, this.errorMessage);
return OnboardingStatusFormatter.statusMessage(this.success, this.errorMessage);
}
/** UI-specific: Whether onboarding was successful */

View File

@@ -1,6 +1,6 @@
import type { CreateLeagueViewData } from '../view-data/CreateLeagueViewData';
import { ViewModel } from "../contracts/view-models/ViewModel";
import { LeagueCreationStatusDisplay } from '../display-objects/LeagueCreationStatusDisplay';
import { LeagueCreationStatusFormatter } from '../formatters/LeagueCreationStatusFormatter';
import type { CreateLeagueViewData } from '../view-data/CreateLeagueViewData';
/**
* View Model for Create League Result
@@ -21,7 +21,7 @@ export class CreateLeagueViewModel extends ViewModel {
/** UI-specific: Success message using Display Object */
get successMessage(): string {
return LeagueCreationStatusDisplay.statusMessage(this.success);
return LeagueCreationStatusFormatter.statusMessage(this.success);
}
/** UI-specific: Whether league creation was successful */

View File

@@ -1,6 +1,6 @@
import type { CreateTeamViewData } from '../view-data/CreateTeamViewData';
import { ViewModel } from "../contracts/view-models/ViewModel";
import { TeamCreationStatusDisplay } from '../display-objects/TeamCreationStatusDisplay';
import { TeamCreationStatusFormatter } from '../formatters/TeamCreationStatusFormatter';
import type { CreateTeamViewData } from '../view-data/CreateTeamViewData';
/**
* View Model for Create Team Result
@@ -21,7 +21,7 @@ export class CreateTeamViewModel extends ViewModel {
/** UI-specific: Success message using Display Object */
get successMessage(): string {
return TeamCreationStatusDisplay.statusMessage(this.success);
return TeamCreationStatusFormatter.statusMessage(this.success);
}
/** UI-specific: Whether team creation was successful */

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { ActivityLevelDisplay } from "@/lib/display-objects/ActivityLevelDisplay";
import { ActivityLevelFormatter } from "@/lib/formatters/ActivityLevelFormatter";
import type { DashboardStatsViewData } from '@/lib/view-data/DashboardStatsViewData';
import { ViewModel } from "../contracts/view-models/ViewModel";
/**
* DashboardStatsViewModel
@@ -68,7 +68,7 @@ export class DashboardStatsViewModel extends ViewModel {
// Derive activity level using Display Object
const engagementRate = this.totalUsers > 0 ? (this.recentLogins / this.totalUsers) * 100 : 0;
this.activityLevelLabel = ActivityLevelDisplay.levelLabel(engagementRate);
this.activityLevelValue = ActivityLevelDisplay.levelValue(engagementRate);
this.activityLevelLabel = ActivityLevelFormatter.levelLabel(engagementRate);
this.activityLevelValue = ActivityLevelFormatter.levelValue(engagementRate);
}
}

View File

@@ -1,9 +1,9 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { RatingTrendFormatter } from "../formatters/RatingTrendFormatter";
import { SkillLevelFormatter } from "../formatters/SkillLevelFormatter";
import { SkillLevelIconFormatter } from "../formatters/SkillLevelIconFormatter";
import { WinRateFormatter } from "../formatters/WinRateFormatter";
import type { LeaderboardDriverItem } from '../view-data/LeaderboardDriverItem';
import { SkillLevelDisplay } from "../display-objects/SkillLevelDisplay";
import { SkillLevelIconDisplay } from "../display-objects/SkillLevelIconDisplay";
import { WinRateDisplay } from "../display-objects/WinRateDisplay";
import { RatingTrendDisplay } from "../display-objects/RatingTrendDisplay";
export class DriverLeaderboardItemViewModel extends ViewModel {
private readonly data: LeaderboardDriverItem;
@@ -29,12 +29,12 @@ export class DriverLeaderboardItemViewModel extends ViewModel {
/** UI-specific: Skill level color */
get skillLevelColor(): string {
return SkillLevelDisplay.getColor(this.skillLevel);
return SkillLevelFormatter.getColor(this.skillLevel);
}
/** UI-specific: Skill level icon */
get skillLevelIcon(): string {
return SkillLevelIconDisplay.getIcon(this.skillLevel);
return SkillLevelIconFormatter.getIcon(this.skillLevel);
}
/** UI-specific: Win rate */
@@ -44,17 +44,17 @@ export class DriverLeaderboardItemViewModel extends ViewModel {
/** UI-specific: Formatted win rate */
get winRateFormatted(): string {
return WinRateDisplay.format(this.winRate);
return WinRateFormatter.format(this.winRate);
}
/** UI-specific: Rating trend */
get ratingTrend(): 'up' | 'down' | 'same' {
return RatingTrendDisplay.getTrend(this.rating, this.previousRating);
return RatingTrendFormatter.getTrend(this.rating, this.previousRating);
}
/** UI-specific: Rating change indicator */
get ratingChangeIndicator(): string {
return RatingTrendDisplay.getChangeIndicator(this.rating, this.previousRating);
return RatingTrendFormatter.getChangeIndicator(this.rating, this.previousRating);
}
/** UI-specific: Position badge */

View File

@@ -1,8 +1,8 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { DashboardConsistencyFormatter } from "../formatters/DashboardConsistencyFormatter";
import { NumberFormatter } from "../formatters/NumberFormatter";
import { RatingFormatter } from "../formatters/RatingFormatter";
import { ProfileViewData } from "../view-data/ProfileViewData";
import { RatingDisplay } from "../display-objects/RatingDisplay";
import { DashboardConsistencyDisplay } from "../display-objects/DashboardConsistencyDisplay";
import { NumberDisplay } from "../display-objects/NumberDisplay";
/**
* Driver Profile Driver Summary View Model
@@ -44,7 +44,7 @@ export class DriverProfileDriverSummaryViewModel extends ViewModel {
}
get ratingLabel(): string {
return RatingDisplay.format(this.rating);
return RatingFormatter.format(this.rating);
}
get globalRank(): number | null {
@@ -52,7 +52,7 @@ export class DriverProfileDriverSummaryViewModel extends ViewModel {
}
get globalRankLabel(): string {
return this.globalRank ? NumberDisplay.format(this.globalRank) : '—';
return this.globalRank ? NumberFormatter.format(this.globalRank) : '—';
}
get consistency(): number | null {
@@ -60,7 +60,7 @@ export class DriverProfileDriverSummaryViewModel extends ViewModel {
}
get consistencyLabel(): string {
return this.consistency ? DashboardConsistencyDisplay.format(this.consistency) : '—';
return this.consistency ? DashboardConsistencyFormatter.format(this.consistency) : '—';
}
get bio(): string | null {
@@ -72,6 +72,6 @@ export class DriverProfileDriverSummaryViewModel extends ViewModel {
}
get totalDriversLabel(): string {
return this.totalDrivers ? NumberDisplay.format(this.totalDrivers) : '—';
return this.totalDrivers ? NumberFormatter.format(this.totalDrivers) : '—';
}
}

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { DriverRegistrationStatusFormatter } from "../formatters/DriverRegistrationStatusFormatter";
import type { DriverRegistrationStatusViewData } from "../view-data/DriverRegistrationStatusViewData";
import { DriverRegistrationStatusDisplay } from "../display-objects/DriverRegistrationStatusDisplay";
export class DriverRegistrationStatusViewModel extends ViewModel {
constructor(private readonly viewData: DriverRegistrationStatusViewData) {
@@ -24,14 +24,14 @@ export class DriverRegistrationStatusViewModel extends ViewModel {
}
get statusMessage(): string {
return DriverRegistrationStatusDisplay.statusMessage(this.isRegistered);
return DriverRegistrationStatusFormatter.statusMessage(this.isRegistered);
}
get statusBadgeVariant(): string {
return DriverRegistrationStatusDisplay.statusBadgeVariant(this.isRegistered);
return DriverRegistrationStatusFormatter.statusBadgeVariant(this.isRegistered);
}
get registrationButtonText(): string {
return DriverRegistrationStatusDisplay.registrationButtonText(this.isRegistered);
return DriverRegistrationStatusFormatter.registrationButtonText(this.isRegistered);
}
}

View File

@@ -1,7 +1,7 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { NumberFormatter } from "../formatters/NumberFormatter";
import { RatingFormatter } from "../formatters/RatingFormatter";
import type { DriverSummaryData } from "../view-data/DriverSummaryData";
import { NumberDisplay } from "../display-objects/NumberDisplay";
import { RatingDisplay } from "../display-objects/RatingDisplay";
/**
* View Model for driver summary with rating and rank
@@ -30,7 +30,7 @@ export class DriverSummaryViewModel extends ViewModel {
}
get ratingLabel(): string {
return RatingDisplay.format(this.rating);
return RatingFormatter.format(this.rating);
}
get rank(): number | null {
@@ -38,7 +38,7 @@ export class DriverSummaryViewModel extends ViewModel {
}
get rankLabel(): string {
return this.rank === null ? '—' : NumberDisplay.format(this.rank);
return this.rank === null ? '—' : NumberFormatter.format(this.rank);
}
get roleBadgeText(): string {

View File

@@ -4,8 +4,8 @@
* Client-only UI helper built from ViewData.
*/
import { ProfileDisplay } from "../display-objects/ProfileDisplay";
import { ViewModel } from "../contracts/view-models/ViewModel";
import { ProfileFormatter } from "../formatters/ProfileFormatter";
import type { TeamDetailData } from "../view-data/TeamDetailViewData";
export class DriverTeamViewModel extends ViewModel {
@@ -39,6 +39,6 @@ export class DriverTeamViewModel extends ViewModel {
/** UI-specific: Display role */
get displayRole(): string {
return ProfileDisplay.getTeamRole(this.role).text;
return ProfileFormatter.getTeamRole(this.role).text;
}
}

View File

@@ -5,7 +5,7 @@
* Note: client-only ViewModel created from ViewData (never DTO).
*/
import { ViewModel } from "../contracts/view-models/ViewModel";
import { RatingDisplay } from "../display-objects/RatingDisplay";
import { RatingFormatter } from "../formatters/RatingFormatter";
import type { DriverViewData } from "../view-data/DriverViewData";
export class DriverViewModel extends ViewModel {
@@ -32,6 +32,6 @@ export class DriverViewModel extends ViewModel {
/** UI-specific: Formatted rating */
get formattedRating(): string {
return this.rating !== undefined ? RatingDisplay.format(this.rating) : "Unrated";
return this.rating !== undefined ? RatingFormatter.format(this.rating) : "Unrated";
}
}

View File

@@ -1,5 +1,5 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { LeagueRoleDisplay, LeagueRole } from "../display-objects/LeagueRoleDisplay";
import { LeagueRole, LeagueRoleFormatter } from "../formatters/LeagueRoleFormatter";
import type { LeagueMemberViewData } from "../view-data/LeagueMemberViewData";
export class LeagueMemberViewModel extends ViewModel {
@@ -23,7 +23,7 @@ export class LeagueMemberViewModel extends ViewModel {
/** UI-specific: Badge classes for role */
get roleBadgeClasses(): string {
return LeagueRoleDisplay.getLeagueRoleDisplay(this.role as LeagueRole)?.badgeClasses || '';
return LeagueRoleFormatter.getLeagueRoleDisplay(this.role as LeagueRole)?.badgeClasses || '';
}
/** UI-specific: Whether this member is the owner */

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { LeagueTierDisplay } from "../display-objects/LeagueTierDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import { LeagueTierFormatter } from "../formatters/LeagueTierFormatter";
import type { LeagueViewData } from "../view-data/LeagueDetailViewData";
export class LeagueViewModel extends ViewModel {
@@ -50,7 +50,7 @@ export class LeagueViewModel extends ViewModel {
}
get formattedMainSponsorCpm(): string {
return CurrencyDisplay.format(this.mainSponsorCpm);
return CurrencyFormatter.format(this.mainSponsorCpm);
}
get racesLeft(): number {
@@ -58,6 +58,6 @@ export class LeagueViewModel extends ViewModel {
}
get tierConfig() {
return LeagueTierDisplay.getDisplay(this.tier);
return LeagueTierFormatter.getDisplay(this.tier);
}
}

View File

@@ -1,7 +1,7 @@
import { WalletTransactionViewModel } from './WalletTransactionViewModel';
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import type { LeagueWalletViewData } from "../view-data/LeagueWalletViewData";
import { WalletTransactionViewModel } from './WalletTransactionViewModel';
export class LeagueWalletViewModel extends ViewModel {
private readonly data: LeagueWalletViewData;
@@ -24,22 +24,22 @@ export class LeagueWalletViewModel extends ViewModel {
/** UI-specific: Formatted balance */
get formattedBalance(): string {
return CurrencyDisplay.format(this.balance, this.currency);
return CurrencyFormatter.format(this.balance, this.currency);
}
/** UI-specific: Formatted total revenue */
get formattedTotalRevenue(): string {
return CurrencyDisplay.format(this.totalRevenue, this.currency);
return CurrencyFormatter.format(this.totalRevenue, this.currency);
}
/** UI-specific: Formatted total fees */
get formattedTotalFees(): string {
return CurrencyDisplay.format(this.totalFees, this.currency);
return CurrencyFormatter.format(this.totalFees, this.currency);
}
/** UI-specific: Formatted pending payouts */
get formattedPendingPayouts(): string {
return CurrencyDisplay.format(this.pendingPayouts, this.currency);
return CurrencyFormatter.format(this.pendingPayouts, this.currency);
}
/** UI-specific: Filtered transactions by type */

View File

@@ -1,7 +1,7 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { DateDisplay } from "../display-objects/DateDisplay";
import { MembershipFeeTypeDisplay } from "../display-objects/MembershipFeeTypeDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import { DateFormatter } from "../formatters/DateFormatter";
import { MembershipFeeTypeFormatter } from "../formatters/MembershipFeeTypeFormatter";
import type { MembershipFeeViewData } from "../view-data/MembershipFeeViewData";
export class MembershipFeeViewModel extends ViewModel {
@@ -23,12 +23,12 @@ export class MembershipFeeViewModel extends ViewModel {
/** UI-specific: Formatted amount */
get formattedAmount(): string {
return CurrencyDisplay.format(this.amount, 'EUR');
return CurrencyFormatter.format(this.amount, 'EUR');
}
/** UI-specific: Type display */
get typeDisplay(): string {
return MembershipFeeTypeDisplay.format(this.type);
return MembershipFeeTypeFormatter.format(this.type);
}
/** UI-specific: Status display */
@@ -43,11 +43,11 @@ export class MembershipFeeViewModel extends ViewModel {
/** UI-specific: Formatted created date */
get formattedCreatedAt(): string {
return DateDisplay.formatShort(this.createdAt);
return DateFormatter.formatShort(this.createdAt);
}
/** UI-specific: Formatted updated date */
get formattedUpdatedAt(): string {
return DateDisplay.formatShort(this.updatedAt);
return DateFormatter.formatShort(this.updatedAt);
}
}

View File

@@ -1,9 +1,9 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { DateDisplay } from "../display-objects/DateDisplay";
import { PaymentTypeDisplay } from "../display-objects/PaymentTypeDisplay";
import { PayerTypeDisplay } from "../display-objects/PayerTypeDisplay";
import { StatusDisplay } from "../display-objects/StatusDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import { DateFormatter } from "../formatters/DateFormatter";
import { PayerTypeFormatter } from "../formatters/PayerTypeFormatter";
import { PaymentTypeFormatter } from "../formatters/PaymentTypeFormatter";
import { StatusFormatter } from "../formatters/StatusFormatter";
import type { PaymentViewData } from "../view-data/PaymentViewData";
export class PaymentViewModel extends ViewModel {
@@ -29,12 +29,12 @@ export class PaymentViewModel extends ViewModel {
/** UI-specific: Formatted amount */
get formattedAmount(): string {
return CurrencyDisplay.format(this.amount, 'EUR');
return CurrencyFormatter.format(this.amount, 'EUR');
}
/** UI-specific: Formatted net amount */
get formattedNetAmount(): string {
return CurrencyDisplay.format(this.netAmount, 'EUR');
return CurrencyFormatter.format(this.netAmount, 'EUR');
}
/** UI-specific: Status color */
@@ -50,26 +50,26 @@ export class PaymentViewModel extends ViewModel {
/** UI-specific: Formatted created date */
get formattedCreatedAt(): string {
return DateDisplay.formatShort(this.createdAt);
return DateFormatter.formatShort(this.createdAt);
}
/** UI-specific: Formatted completed date */
get formattedCompletedAt(): string {
return this.completedAt ? DateDisplay.formatShort(this.completedAt) : 'Not completed';
return this.completedAt ? DateFormatter.formatShort(this.completedAt) : 'Not completed';
}
/** UI-specific: Status display */
get statusDisplay(): string {
return StatusDisplay.transactionStatus(this.status);
return StatusFormatter.transactionStatus(this.status);
}
/** UI-specific: Type display */
get typeDisplay(): string {
return PaymentTypeDisplay.format(this.type);
return PaymentTypeFormatter.format(this.type);
}
/** UI-specific: Payer type display */
get payerTypeDisplay(): string {
return PayerTypeDisplay.format(this.payerType);
return PayerTypeFormatter.format(this.payerType);
}
}

View File

@@ -1,8 +1,8 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { FinishDisplay } from "../display-objects/FinishDisplay";
import { DateDisplay } from "../display-objects/DateDisplay";
import { PrizeTypeDisplay } from "../display-objects/PrizeTypeDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import { DateFormatter } from "../formatters/DateFormatter";
import { FinishFormatter } from "../formatters/FinishFormatter";
import { PrizeTypeFormatter } from "../formatters/PrizeTypeFormatter";
import type { PrizeViewData } from "../view-data/PrizeViewData";
export class PrizeViewModel extends ViewModel {
@@ -28,17 +28,17 @@ export class PrizeViewModel extends ViewModel {
/** UI-specific: Formatted amount */
get formattedAmount(): string {
return CurrencyDisplay.format(this.amount, 'EUR');
return CurrencyFormatter.format(this.amount, 'EUR');
}
/** UI-specific: Position display */
get positionDisplay(): string {
return FinishDisplay.format(this.position);
return FinishFormatter.format(this.position);
}
/** UI-specific: Type display */
get typeDisplay(): string {
return PrizeTypeDisplay.format(this.type);
return PrizeTypeFormatter.format(this.type);
}
/** UI-specific: Status display */
@@ -58,11 +58,11 @@ export class PrizeViewModel extends ViewModel {
/** UI-specific: Formatted awarded date */
get formattedAwardedAt(): string {
return this.awardedAt ? DateDisplay.formatShort(this.awardedAt) : 'Not awarded';
return this.awardedAt ? DateFormatter.formatShort(this.awardedAt) : 'Not awarded';
}
/** UI-specific: Formatted created date */
get formattedCreatedAt(): string {
return DateDisplay.formatShort(this.createdAt);
return DateFormatter.formatShort(this.createdAt);
}
}

View File

@@ -1,7 +1,7 @@
import { DateDisplay } from '@/lib/display-objects/DateDisplay';
import { StatusDisplay } from '@/lib/display-objects/StatusDisplay';
import { ViewModel } from "../contracts/view-models/ViewModel";
import { DateFormatter } from '@/lib/formatters/DateFormatter';
import { StatusFormatter } from '@/lib/formatters/StatusFormatter';
import type { ProtestViewData } from "@/lib/view-data/ProtestViewData";
import { ViewModel } from "../contracts/view-models/ViewModel";
export class ProtestViewModel extends ViewModel {
private readonly data: ProtestViewData;
@@ -27,11 +27,11 @@ export class ProtestViewModel extends ViewModel {
/** UI-specific: Formatted submitted date */
get formattedSubmittedAt(): string {
return DateDisplay.formatShort(this.submittedAt);
return DateFormatter.formatShort(this.submittedAt);
}
/** UI-specific: Status display */
get statusDisplay(): string {
return StatusDisplay.protestStatus(this.status);
return StatusFormatter.protestStatus(this.status);
}
}

View File

@@ -1,5 +1,5 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { DurationDisplay } from "../display-objects/DurationDisplay";
import { DurationFormatter } from "../formatters/DurationFormatter";
import type { RaceDetailUserResultViewData } from "../view-data/RaceDetailUserResultViewData";
export class RaceDetailUserResultViewModel extends ViewModel {
@@ -54,6 +54,6 @@ export class RaceDetailUserResultViewModel extends ViewModel {
/** UI-specific: Formatted lap time */
get lapTimeFormatted(): string {
if (this.fastestLap <= 0) return '--:--.---';
return DurationDisplay.formatSeconds(this.fastestLap);
return DurationFormatter.formatSeconds(this.fastestLap);
}
}

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { RaceStatusDisplay } from "../display-objects/RaceStatusDisplay";
import { DateDisplay } from "../display-objects/DateDisplay";
import { DateFormatter } from "../formatters/DateFormatter";
import { RaceStatusFormatter } from "../formatters/RaceStatusFormatter";
import type { RaceListItemViewData } from "../view-data/RaceListItemViewData";
export class RaceListItemViewModel extends ViewModel {
@@ -29,12 +29,12 @@ export class RaceListItemViewModel extends ViewModel {
/** UI-specific: Formatted scheduled time */
get formattedScheduledTime(): string {
return DateDisplay.formatDateTime(this.scheduledAt);
return DateFormatter.formatDateTime(this.scheduledAt);
}
/** UI-specific: Badge variant for status */
get statusBadgeVariant(): string {
return RaceStatusDisplay.getVariant(this.status);
return RaceStatusFormatter.getVariant(this.status);
}
/** UI-specific: Time until start in minutes */

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { FinishDisplay } from '../display-objects/FinishDisplay';
import { DurationDisplay } from '../display-objects/DurationDisplay';
import { DurationFormatter } from '../formatters/DurationFormatter';
import { FinishFormatter } from '../formatters/FinishFormatter';
import type { RaceResultViewData } from "../view-data/RaceResultViewData";
export class RaceResultViewModel extends ViewModel {
@@ -50,7 +50,7 @@ export class RaceResultViewModel extends ViewModel {
/** UI-specific: Badge for position */
get positionBadge(): string {
return FinishDisplay.format(this.position);
return FinishFormatter.format(this.position);
}
/** UI-specific: Color for incidents badge */
@@ -63,7 +63,7 @@ export class RaceResultViewModel extends ViewModel {
/** UI-specific: Formatted lap time */
get lapTimeFormatted(): string {
if (this.fastestLap <= 0) return '--:--.---';
return DurationDisplay.formatSeconds(this.fastestLap);
return DurationFormatter.formatSeconds(this.fastestLap);
}
/** Required by ResultsTable */
@@ -72,11 +72,11 @@ export class RaceResultViewModel extends ViewModel {
}
get formattedPosition(): string {
return FinishDisplay.format(this.position);
return FinishFormatter.format(this.position);
}
get formattedStartPosition(): string {
return FinishDisplay.format(this.startPosition);
return FinishFormatter.format(this.startPosition);
}
get formattedIncidents(): string {

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { DateDisplay } from "../display-objects/DateDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import { DateFormatter } from "../formatters/DateFormatter";
import type { RenewalAlertViewData } from "../view-data/RenewalAlertViewData";
export class RenewalAlertViewModel extends ViewModel {
@@ -20,11 +20,11 @@ export class RenewalAlertViewModel extends ViewModel {
}
get formattedPrice(): string {
return CurrencyDisplay.format(this.price);
return CurrencyFormatter.format(this.price);
}
get formattedRenewDate(): string {
return DateDisplay.formatShort(this.renewDate);
return DateFormatter.formatShort(this.renewDate);
}
get typeIcon() {

View File

@@ -1,5 +1,5 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import type { SponsorshipDetailViewData } from "../view-data/SponsorshipDetailViewData";
export class SponsorshipDetailViewModel extends ViewModel {
@@ -36,7 +36,7 @@ export class SponsorshipDetailViewModel extends ViewModel {
/** UI-specific: Formatted amount */
get formattedAmount(): string {
return CurrencyDisplay.format(this.amount, this.currency);
return CurrencyFormatter.format(this.amount, this.currency);
}
/** UI-specific: Tier badge variant */

View File

@@ -1,5 +1,5 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import type { SponsorshipPricingViewData } from "../view-data/SponsorshipPricingViewData";
export class SponsorshipPricingViewModel extends ViewModel {
@@ -16,12 +16,12 @@ export class SponsorshipPricingViewModel extends ViewModel {
/** UI-specific: Formatted main slot price */
get formattedMainSlotPrice(): string {
return CurrencyDisplay.format(this.mainSlotPrice, this.currency);
return CurrencyFormatter.format(this.mainSlotPrice, this.currency);
}
/** UI-specific: Formatted secondary slot price */
get formattedSecondarySlotPrice(): string {
return CurrencyDisplay.format(this.secondarySlotPrice, this.currency);
return CurrencyFormatter.format(this.secondarySlotPrice, this.currency);
}
/** UI-specific: Price difference */
@@ -31,7 +31,7 @@ export class SponsorshipPricingViewModel extends ViewModel {
/** UI-specific: Formatted price difference */
get formattedPriceDifference(): string {
return CurrencyDisplay.format(this.priceDifference, this.currency);
return CurrencyFormatter.format(this.priceDifference, this.currency);
}
/** UI-specific: Discount percentage for secondary slot */

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { DateDisplay } from "../display-objects/DateDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import { DateFormatter } from "../formatters/DateFormatter";
import type { SponsorshipRequestViewData } from "../view-data/SponsorshipRequestViewData";
export class SponsorshipRequestViewModel extends ViewModel {
@@ -35,12 +35,12 @@ export class SponsorshipRequestViewModel extends ViewModel {
/** UI-specific: Formatted date */
get formattedDate(): string {
return DateDisplay.formatMonthDay(this.createdAt);
return DateFormatter.formatMonthDay(this.createdAt);
}
/** UI-specific: Net amount in dollars */
get netAmountDollars(): string {
return CurrencyDisplay.format(this.netAmount / 100, 'USD');
return CurrencyFormatter.format(this.netAmount / 100, 'USD');
}
/** UI-specific: Tier display */

View File

@@ -1,7 +1,7 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from '../display-objects/CurrencyDisplay';
import { DateDisplay } from '../display-objects/DateDisplay';
import { NumberDisplay } from '../display-objects/NumberDisplay';
import { CurrencyFormatter } from '../formatters/CurrencyFormatter';
import { DateFormatter } from '../formatters/DateFormatter';
import { NumberFormatter } from '../formatters/NumberFormatter';
import type { SponsorshipViewData } from "../view-data/SponsorshipViewData";
/**
@@ -52,11 +52,11 @@ export class SponsorshipViewModel extends ViewModel {
}
get formattedImpressions(): string {
return NumberDisplay.format(this.impressions);
return NumberFormatter.format(this.impressions);
}
get formattedPrice(): string {
return CurrencyDisplay.format(this.price);
return CurrencyFormatter.format(this.price);
}
get daysRemaining(): number {
@@ -92,8 +92,8 @@ export class SponsorshipViewModel extends ViewModel {
}
get periodDisplay(): string {
const start = DateDisplay.formatMonthYear(this.startDate);
const end = DateDisplay.formatMonthYear(this.endDate);
const start = DateFormatter.formatMonthYear(this.startDate);
const end = DateFormatter.formatMonthYear(this.endDate);
return `${start} - ${end}`;
}
}

View File

@@ -1,5 +1,5 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { FinishDisplay } from "../display-objects/FinishDisplay";
import { FinishFormatter } from "../formatters/FinishFormatter";
import type { StandingEntryViewData } from "../view-data/StandingEntryViewData";
export class StandingEntryViewModel extends ViewModel {
@@ -20,7 +20,7 @@ export class StandingEntryViewModel extends ViewModel {
/** UI-specific: Badge for position display */
get positionBadge(): string {
return FinishDisplay.format(this.position);
return FinishFormatter.format(this.position);
}
/** UI-specific: Points difference to leader */

View File

@@ -1,5 +1,5 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { DateDisplay } from "../display-objects/DateDisplay";
import { DateFormatter } from "../formatters/DateFormatter";
import type { TeamJoinRequestViewData } from "../view-data/TeamJoinRequestViewData";
export class TeamJoinRequestViewModel extends ViewModel {
@@ -35,7 +35,7 @@ export class TeamJoinRequestViewModel extends ViewModel {
/** UI-specific: Formatted requested date */
get formattedRequestedAt(): string {
return DateDisplay.formatDateTime(this.requestedAt);
return DateFormatter.formatDateTime(this.requestedAt);
}
/** UI-specific: Status color */

View File

@@ -1,6 +1,6 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { DateDisplay } from "../display-objects/DateDisplay";
import type { TeamMemberViewData, TeamMemberRole } from "../view-data/TeamMemberViewData";
import { DateFormatter } from "../formatters/DateFormatter";
import type { TeamMemberRole, TeamMemberViewData } from "../view-data/TeamMemberViewData";
function normalizeTeamRole(role: string): TeamMemberRole {
if (role === 'owner' || role === 'manager' || role === 'member') return role;
@@ -53,6 +53,6 @@ export class TeamMemberViewModel extends ViewModel {
/** UI-specific: Formatted joined date */
get formattedJoinedAt(): string {
return DateDisplay.formatShort(this.joinedAt);
return DateFormatter.formatShort(this.joinedAt);
}
}

View File

@@ -1,5 +1,5 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { DateDisplay } from "../display-objects/DateDisplay";
import { DateFormatter } from "../formatters/DateFormatter";
import type { UpcomingRaceCardViewData } from "../view-data/UpcomingRaceCardViewData";
/**
@@ -22,6 +22,6 @@ export class UpcomingRaceCardViewModel extends ViewModel {
/** UI-specific: formatted date label */
get formattedDate(): string {
return DateDisplay.formatMonthDay(this.scheduledAt);
return DateFormatter.formatMonthDay(this.scheduledAt);
}
}

View File

@@ -1,7 +1,7 @@
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { DateDisplay } from "../display-objects/DateDisplay";
import { TransactionTypeDisplay } from "../display-objects/TransactionTypeDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import { DateFormatter } from "../formatters/DateFormatter";
import { TransactionTypeFormatter } from "../formatters/TransactionTypeFormatter";
import type { WalletTransactionViewData } from "../view-data/WalletTransactionViewData";
export class WalletTransactionViewModel extends ViewModel {
@@ -25,7 +25,7 @@ export class WalletTransactionViewModel extends ViewModel {
/** UI-specific: Formatted amount with sign */
get formattedAmount(): string {
const sign = this.amount > 0 ? '+' : '';
return `${sign}${CurrencyDisplay.format(Math.abs(this.amount))}`;
return `${sign}${CurrencyFormatter.format(Math.abs(this.amount))}`;
}
/** UI-specific: Amount color */
@@ -35,12 +35,12 @@ export class WalletTransactionViewModel extends ViewModel {
/** UI-specific: Type display */
get typeDisplay(): string {
return TransactionTypeDisplay.format(this.type);
return TransactionTypeFormatter.format(this.type);
}
/** UI-specific: Formatted date */
get formattedDate(): string {
return DateDisplay.formatShort(this.date);
return DateFormatter.formatShort(this.date);
}
/** UI-specific: Is incoming */

View File

@@ -1,7 +1,7 @@
import { WalletTransactionViewModel } from './WalletTransactionViewModel';
import { ViewModel } from "../contracts/view-models/ViewModel";
import { CurrencyDisplay } from "../display-objects/CurrencyDisplay";
import { CurrencyFormatter } from "../formatters/CurrencyFormatter";
import type { WalletViewData } from "../view-data/WalletViewData";
import { WalletTransactionViewModel } from './WalletTransactionViewModel';
export class WalletViewModel extends ViewModel {
private readonly data: WalletViewData;
@@ -24,7 +24,7 @@ export class WalletViewModel extends ViewModel {
/** UI-specific: Formatted balance */
get formattedBalance(): string {
return CurrencyDisplay.format(this.balance, this.currency);
return CurrencyFormatter.format(this.balance, this.currency);
}
/** UI-specific: Balance color */