streamline components
This commit is contained in:
125
apps/website/lib/view-models/LeagueScoringSectionViewModel.ts
Normal file
125
apps/website/lib/view-models/LeagueScoringSectionViewModel.ts
Normal file
@@ -0,0 +1,125 @@
|
||||
import type { LeagueConfigFormModel } from '@/lib/types/LeagueConfigFormModel';
|
||||
import type { LeagueScoringPresetViewModel } from '@/lib/view-models/LeagueScoringPresetViewModel';
|
||||
import type { CustomPointsConfig } from '@/lib/view-models/ScoringConfigurationViewModel';
|
||||
|
||||
/**
|
||||
* LeagueScoringSectionViewModel
|
||||
*
|
||||
* View model for the league scoring section UI state and operations
|
||||
*/
|
||||
export class LeagueScoringSectionViewModel {
|
||||
readonly form: LeagueConfigFormModel;
|
||||
readonly presets: LeagueScoringPresetViewModel[];
|
||||
readonly readOnly: boolean;
|
||||
readonly patternOnly: boolean;
|
||||
readonly championshipsOnly: boolean;
|
||||
readonly disabled: boolean;
|
||||
readonly currentPreset: LeagueScoringPresetViewModel | null;
|
||||
readonly isCustom: boolean;
|
||||
|
||||
constructor(
|
||||
form: LeagueConfigFormModel,
|
||||
presets: LeagueScoringPresetViewModel[],
|
||||
options: {
|
||||
readOnly?: boolean;
|
||||
patternOnly?: boolean;
|
||||
championshipsOnly?: boolean;
|
||||
} = {}
|
||||
) {
|
||||
this.form = form;
|
||||
this.presets = presets;
|
||||
this.readOnly = options.readOnly || false;
|
||||
this.patternOnly = options.patternOnly || false;
|
||||
this.championshipsOnly = options.championshipsOnly || false;
|
||||
this.disabled = this.readOnly;
|
||||
this.currentPreset = form.scoring.patternId
|
||||
? presets.find(p => p.id === form.scoring.patternId) || null
|
||||
: null;
|
||||
this.isCustom = form.scoring.customScoringEnabled || false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default custom points configuration
|
||||
*/
|
||||
static getDefaultCustomPoints(): CustomPointsConfig {
|
||||
return {
|
||||
racePoints: [25, 18, 15, 12, 10, 8, 6, 4, 2, 1],
|
||||
poleBonusPoints: 1,
|
||||
fastestLapPoints: 1,
|
||||
leaderLapPoints: 0,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if form can be modified
|
||||
*/
|
||||
canModify(): boolean {
|
||||
return !this.readOnly;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get available presets for display
|
||||
*/
|
||||
getAvailablePresets(): LeagueScoringPresetViewModel[] {
|
||||
return this.presets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get championships configuration for display
|
||||
*/
|
||||
getChampionshipsConfig() {
|
||||
const isTeamsMode = this.form.structure.mode === 'fixedTeams';
|
||||
|
||||
return [
|
||||
{
|
||||
key: 'enableDriverChampionship' as const,
|
||||
label: 'Driver Standings',
|
||||
description: 'Track individual driver points',
|
||||
enabled: this.form.championships.enableDriverChampionship,
|
||||
available: true,
|
||||
},
|
||||
{
|
||||
key: 'enableTeamChampionship' as const,
|
||||
label: 'Team Standings',
|
||||
description: 'Combined team points',
|
||||
enabled: this.form.championships.enableTeamChampionship,
|
||||
available: isTeamsMode,
|
||||
unavailableHint: 'Teams mode only',
|
||||
},
|
||||
{
|
||||
key: 'enableNationsChampionship' as const,
|
||||
label: 'Nations Cup',
|
||||
description: 'By nationality',
|
||||
enabled: this.form.championships.enableNationsChampionship,
|
||||
available: true,
|
||||
},
|
||||
{
|
||||
key: 'enableTrophyChampionship' as const,
|
||||
label: 'Trophy Cup',
|
||||
description: 'Special category',
|
||||
enabled: this.form.championships.enableTrophyChampionship,
|
||||
available: true,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get panel visibility based on flags
|
||||
*/
|
||||
shouldShowPatternPanel(): boolean {
|
||||
return !this.championshipsOnly;
|
||||
}
|
||||
|
||||
shouldShowChampionshipsPanel(): boolean {
|
||||
return !this.patternOnly;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the active custom points configuration
|
||||
*/
|
||||
getActiveCustomPoints(): CustomPointsConfig {
|
||||
// This would be stored separately in the form model
|
||||
// For now, return defaults
|
||||
return LeagueScoringSectionViewModel.getDefaultCustomPoints();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user