125 lines
3.5 KiB
TypeScript
125 lines
3.5 KiB
TypeScript
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();
|
|
}
|
|
} |