CLAUDE: Remove alignment field from frontend - complete Session 1 cleanup

Removed all references to the defensive alignment field across frontend codebase
after backend removal in Session 1. The alignment field was determined to be unused
and was removed from DefensiveDecision model.

Changes:
- types/websocket.ts: Removed alignment from DefensiveDecisionRequest interface
- composables/useGameActions.ts: Removed alignment from submit handler
- pages/demo-decisions.vue: Updated demo state and summary text (alignment → depths)
- pages/games/[id].vue: Updated decision history text for both defensive and offensive
  * Defensive: Now shows "infield depth, outfield depth" instead of "alignment, infield"
  * Offensive: Updated to use new action field with proper labels (swing_away, hit_and_run, etc.)
- Test files (3): Updated all test cases to remove alignment references
  * tests/unit/composables/useGameActions.spec.ts
  * tests/unit/store/game-decisions.spec.ts
  * tests/unit/components/Decisions/DefensiveSetup.spec.ts

Also updated offensive decision handling to match Session 2 changes (approach/hit_and_run/bunt_attempt → action field).

Total: 7 files modified, all alignment references removed
Verified: Zero remaining alignment references in .ts/.vue/.js files

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2025-11-14 15:34:59 -06:00
parent cf4fef22d8
commit 4e7ea9e514
7 changed files with 37 additions and 68 deletions

View File

@ -96,7 +96,6 @@ export function useGameActions(gameId?: string) {
socket.value!.emit('submit_defensive_decision', {
game_id: currentGameId.value!,
alignment: decision.alignment,
infield_depth: decision.infield_depth,
outfield_depth: decision.outfield_depth,
hold_runners: decision.hold_runners,

View File

@ -346,7 +346,6 @@ const demoState = ref({
toggle3: false,
toggle4: true,
defensiveSetup: {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
@ -358,7 +357,7 @@ const demoState = ref({
decisionHistory: [
{
type: 'Defensive' as const,
summary: 'normal alignment, normal infield',
summary: 'normal infield, normal outfield',
timestamp: '10:45:23',
},
{
@ -393,7 +392,7 @@ const showToast = (message: string) => {
// Event handlers
const handleDefensiveSubmit = (decision: DefensiveDecision) => {
demoState.value.defensiveSetup = decision
const summary = `${decision.alignment} alignment, ${decision.infield_depth} infield`
const summary = `${decision.infield_depth} infield, ${decision.outfield_depth} outfield`
demoState.value.decisionHistory.unshift({
type: 'Defensive',
summary,

View File

@ -268,7 +268,7 @@ const handleDefensiveSubmit = async (decision: DefensiveDecision) => {
try {
await actions.submitDefensiveDecision(decision)
gameStore.setPendingDefensiveSetup(decision)
gameStore.addDecisionToHistory('Defensive', `${decision.alignment} alignment, ${decision.infield_depth} infield`)
gameStore.addDecisionToHistory('Defensive', `${decision.infield_depth} infield, ${decision.outfield_depth} outfield`)
} catch (error) {
console.error('[Game Page] Failed to submit defensive decision:', error)
}
@ -284,7 +284,15 @@ const handleOffensiveSubmit = async (decision: Omit<OffensiveDecision, 'steal_at
}
await actions.submitOffensiveDecision(fullDecision)
gameStore.setPendingOffensiveDecision(decision)
gameStore.addDecisionToHistory('Offensive', `${decision.approach} approach${decision.hit_and_run ? ', Hit & Run' : ''}${decision.bunt_attempt ? ', Bunt' : ''}`)
const actionLabels: Record<string, string> = {
swing_away: 'Swing Away',
steal: 'Steal',
check_jump: 'Check Jump',
hit_and_run: 'Hit & Run',
sac_bunt: 'Sac Bunt',
squeeze_bunt: 'Squeeze Bunt',
}
gameStore.addDecisionToHistory('Offensive', actionLabels[decision.action] || decision.action)
} catch (error) {
console.error('[Game Page] Failed to submit offensive decision:', error)
}

View File

@ -34,7 +34,6 @@ describe('DefensiveSetup', () => {
props: defaultProps,
})
expect(wrapper.text()).toContain('Defensive Alignment')
expect(wrapper.text()).toContain('Infield Depth')
expect(wrapper.text()).toContain('Outfield Depth')
expect(wrapper.text()).toContain('Hold Runners')
@ -53,9 +52,8 @@ describe('DefensiveSetup', () => {
it('uses provided currentSetup values', () => {
const currentSetup: DefensiveDecision = {
alignment: 'shifted_left',
infield_depth: 'back',
outfield_depth: 'deep',
outfield_depth: 'normal',
hold_runners: [1, 3],
}
@ -66,9 +64,8 @@ describe('DefensiveSetup', () => {
},
})
expect(wrapper.vm.localSetup.alignment).toBe('shifted_left')
expect(wrapper.vm.localSetup.infield_depth).toBe('back')
expect(wrapper.vm.localSetup.outfield_depth).toBe('deep')
expect(wrapper.vm.localSetup.outfield_depth).toBe('normal')
expect(wrapper.vm.localSetup.hold_runners).toEqual([1, 3])
})
})
@ -79,7 +76,6 @@ describe('DefensiveSetup', () => {
props: {
...defaultProps,
currentSetup: {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [1, 2],
@ -108,20 +104,19 @@ describe('DefensiveSetup', () => {
})
describe('Preview Display', () => {
it('displays current alignment in preview', () => {
it('displays current infield depth in preview', () => {
const wrapper = mount(DefensiveSetup, {
props: {
...defaultProps,
currentSetup: {
alignment: 'extreme_shift',
infield_depth: 'normal',
infield_depth: 'back',
outfield_depth: 'normal',
hold_runners: [],
},
},
})
expect(wrapper.text()).toContain('Extreme')
expect(wrapper.text()).toContain('Back')
})
it('displays holding status for multiple runners', () => {
@ -129,7 +124,6 @@ describe('DefensiveSetup', () => {
props: {
...defaultProps,
currentSetup: {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [1, 2, 3],
@ -159,9 +153,8 @@ describe('DefensiveSetup', () => {
})
wrapper.vm.localSetup = {
alignment: 'shifted_right',
infield_depth: 'in',
outfield_depth: 'back',
outfield_depth: 'normal',
hold_runners: [2],
}
@ -169,9 +162,8 @@ describe('DefensiveSetup', () => {
expect(wrapper.emitted('submit')).toBeTruthy()
const emitted = wrapper.emitted('submit')![0][0] as DefensiveDecision
expect(emitted.alignment).toBe('shifted_right')
expect(emitted.infield_depth).toBe('in')
expect(emitted.outfield_depth).toBe('back')
expect(emitted.outfield_depth).toBe('normal')
expect(emitted.hold_runners).toEqual([2])
})
@ -189,7 +181,6 @@ describe('DefensiveSetup', () => {
it('does not submit when no changes', async () => {
const currentSetup: DefensiveDecision = {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
@ -234,7 +225,6 @@ describe('DefensiveSetup', () => {
it('shows "No Changes" when setup unchanged', () => {
const currentSetup: DefensiveDecision = {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
@ -255,18 +245,17 @@ describe('DefensiveSetup', () => {
props: defaultProps,
})
wrapper.vm.localSetup.alignment = 'shifted_left'
wrapper.vm.localSetup.infield_depth = 'back'
expect(wrapper.vm.submitButtonText).toBe('Submit Defensive Setup')
})
})
describe('Change Detection', () => {
it('detects alignment changes', () => {
it('detects infield depth changes', () => {
const wrapper = mount(DefensiveSetup, {
props: {
...defaultProps,
currentSetup: {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
@ -275,7 +264,7 @@ describe('DefensiveSetup', () => {
})
expect(wrapper.vm.hasChanges).toBe(false)
wrapper.vm.localSetup.alignment = 'shifted_left'
wrapper.vm.localSetup.infield_depth = 'back'
expect(wrapper.vm.hasChanges).toBe(true)
})
@ -284,7 +273,6 @@ describe('DefensiveSetup', () => {
props: {
...defaultProps,
currentSetup: {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
@ -305,17 +293,15 @@ describe('DefensiveSetup', () => {
})
const newSetup: DefensiveDecision = {
alignment: 'extreme_shift',
infield_depth: 'double_play',
outfield_depth: 'back',
outfield_depth: 'normal',
hold_runners: [1, 2, 3],
}
await wrapper.setProps({ currentSetup: newSetup })
expect(wrapper.vm.localSetup.alignment).toBe('extreme_shift')
expect(wrapper.vm.localSetup.infield_depth).toBe('double_play')
expect(wrapper.vm.localSetup.outfield_depth).toBe('back')
expect(wrapper.vm.localSetup.outfield_depth).toBe('normal')
expect(wrapper.vm.localSetup.hold_runners).toEqual([1, 2, 3])
})
})

View File

@ -205,7 +205,6 @@ describe('useGameActions', () => {
describe('strategic decision actions', () => {
it('emits defensive decision with correct parameters', () => {
const decision: DefensiveDecision = {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
@ -216,7 +215,6 @@ describe('useGameActions', () => {
expect(mockSocket.value.emit).toHaveBeenCalledWith('submit_defensive_decision', {
game_id: 'game-123',
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
@ -225,10 +223,8 @@ describe('useGameActions', () => {
it('emits offensive decision with correct parameters', () => {
const decision: OffensiveDecision = {
approach: 'normal',
action: 'steal',
steal_attempts: [2],
hit_and_run: false,
bunt_attempt: false,
}
const actions = useGameActions()
@ -236,10 +232,8 @@ describe('useGameActions', () => {
expect(mockSocket.value.emit).toHaveBeenCalledWith('submit_offensive_decision', {
game_id: 'game-123',
approach: 'normal',
action: 'steal',
steal_attempts: [2],
hit_and_run: false,
bunt_attempt: false,
})
})
})
@ -380,7 +374,6 @@ describe('useGameActions', () => {
const actions = useGameActions()
actions.rollDice()
actions.submitDefensiveDecision({
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],

View File

@ -12,7 +12,6 @@ describe('Game Store - Decision Methods', () => {
it('sets defensive setup', () => {
const store = useGameStore()
const setup: DefensiveDecision = {
alignment: 'shifted_left',
infield_depth: 'back',
outfield_depth: 'normal',
hold_runners: [1, 3],
@ -25,7 +24,6 @@ describe('Game Store - Decision Methods', () => {
it('clears defensive setup with null', () => {
const store = useGameStore()
const setup: DefensiveDecision = {
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
@ -41,9 +39,7 @@ describe('Game Store - Decision Methods', () => {
it('sets offensive decision', () => {
const store = useGameStore()
const decision: Omit<OffensiveDecision, 'steal_attempts'> = {
approach: 'power',
hit_and_run: true,
bunt_attempt: false,
action: 'hit_and_run',
}
store.setPendingOffensiveDecision(decision)
@ -53,9 +49,7 @@ describe('Game Store - Decision Methods', () => {
it('clears offensive decision with null', () => {
const store = useGameStore()
const decision: Omit<OffensiveDecision, 'steal_attempts'> = {
approach: 'normal',
hit_and_run: false,
bunt_attempt: false,
action: 'swing_away',
}
store.setPendingOffensiveDecision(decision)
@ -89,21 +83,21 @@ describe('Game Store - Decision Methods', () => {
describe('addDecisionToHistory', () => {
it('adds defensive decision to history', () => {
const store = useGameStore()
store.addDecisionToHistory('Defensive', 'normal alignment, normal infield')
store.addDecisionToHistory('Defensive', 'normal infield, normal outfield')
expect(store.decisionHistory).toHaveLength(1)
expect(store.decisionHistory[0].type).toBe('Defensive')
expect(store.decisionHistory[0].summary).toBe('normal alignment, normal infield')
expect(store.decisionHistory[0].summary).toBe('normal infield, normal outfield')
expect(store.decisionHistory[0].timestamp).toBeDefined()
})
it('adds offensive decision to history', () => {
const store = useGameStore()
store.addDecisionToHistory('Offensive', 'power approach, Hit & Run')
store.addDecisionToHistory('Offensive', 'Hit & Run')
expect(store.decisionHistory).toHaveLength(1)
expect(store.decisionHistory[0].type).toBe('Offensive')
expect(store.decisionHistory[0].summary).toBe('power approach, Hit & Run')
expect(store.decisionHistory[0].summary).toBe('Hit & Run')
})
it('adds new decisions to the front of history', () => {
@ -135,15 +129,12 @@ describe('Game Store - Decision Methods', () => {
// Set all pending decisions
store.setPendingDefensiveSetup({
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
})
store.setPendingOffensiveDecision({
approach: 'normal',
hit_and_run: false,
bunt_attempt: false,
action: 'swing_away',
})
store.setPendingStealAttempts([2, 3])
@ -172,15 +163,12 @@ describe('Game Store - Decision Methods', () => {
// Set decisions and history
store.setPendingDefensiveSetup({
alignment: 'normal',
infield_depth: 'normal',
outfield_depth: 'normal',
hold_runners: [],
})
store.setPendingOffensiveDecision({
approach: 'power',
hit_and_run: true,
bunt_attempt: false,
action: 'hit_and_run',
})
store.setPendingStealAttempts([2])
store.addDecisionToHistory('Defensive', 'test')
@ -202,23 +190,20 @@ describe('Game Store - Decision Methods', () => {
// Set defensive decision
const defensiveSetup: DefensiveDecision = {
alignment: 'shifted_left',
infield_depth: 'double_play',
outfield_depth: 'normal',
hold_runners: [1],
}
store.setPendingDefensiveSetup(defensiveSetup)
store.addDecisionToHistory('Defensive', 'shifted_left alignment, double_play infield')
store.addDecisionToHistory('Defensive', 'double_play infield, normal outfield')
// Set offensive decision
const offensiveDecision: Omit<OffensiveDecision, 'steal_attempts'> = {
approach: 'contact',
hit_and_run: false,
bunt_attempt: true,
action: 'sac_bunt',
}
store.setPendingOffensiveDecision(offensiveDecision)
store.setPendingStealAttempts([])
store.addDecisionToHistory('Offensive', 'contact approach, Bunt')
store.addDecisionToHistory('Offensive', 'Sac Bunt')
// Verify all state
expect(store.pendingDefensiveSetup).toEqual(defensiveSetup)

View File

@ -117,7 +117,6 @@ export interface LeaveGameRequest {
export interface DefensiveDecisionRequest {
game_id: string
alignment: DefensiveDecision['alignment']
infield_depth: DefensiveDecision['infield_depth']
outfield_depth: DefensiveDecision['outfield_depth']
hold_runners: number[]