Skip to content

Commit 80dce11

Browse files
Merge pull request #27 from David-H-Afonso/fix/radio-name-aria-issues-11-13
Issues 13 & 11
2 parents 2ae81c7 + 7513f9c commit 80dce11

2 files changed

Lines changed: 25 additions & 14 deletions

File tree

src/components/Home/components/SelectiveExportModal.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,13 @@ const SelectiveExportModal: React.FC<Props> = ({ isOpen, onClose, preSelectedGam
127127

128128
return (
129129
<div key={game.id} className={`sem__per-game-item ${hasOverride ? 'sem__per-game-item--overridden' : ''}`}>
130-
<button type='button' className='sem__per-game-header' onClick={() => togglePerGameExpand(game.id)}>
130+
<button
131+
type='button'
132+
id={`sem-game-header-${game.id}`}
133+
className='sem__per-game-header'
134+
aria-expanded={isExpanded}
135+
aria-controls={`sem-game-body-${game.id}`}
136+
onClick={() => togglePerGameExpand(game.id)}>
131137
<span className='sem__per-game-arrow'>{isExpanded ? '▾' : '▸'}</span>
132138
<span className='sem__per-game-name'>{game.name}</span>
133139
<span className='sem__per-game-badge'>{hasOverride ? 'Override active' : 'Using global'}</span>
@@ -146,15 +152,19 @@ const SelectiveExportModal: React.FC<Props> = ({ isOpen, onClose, preSelectedGam
146152
</button>
147153

148154
{isExpanded && (
149-
<div className='sem__per-game-body'>
150-
<PropertyConfigPanel
151-
panelMode='export'
152-
config={gameConfig}
153-
onChange={(cfg) => updatePerGameConfig(game.id, cfg as GameExportConfig)}
154-
headingLabel={`Override for: ${game.name}`}
155-
/>
156-
</div>
157-
)}
155+
<div
156+
className='sem__per-game-body'
157+
role='region'
158+
aria-labelledby={`sem-game-header-${game.id}`}
159+
id={`sem-game-body-${game.id}`}>
160+
<PropertyConfigPanel
161+
panelMode='export'
162+
config={gameConfig}
163+
onChange={(cfg) => updatePerGameConfig(game.id, cfg as GameExportConfig)}
164+
headingLabel={`Override for: ${game.name}`}
165+
/>
166+
</div>
167+
)}
158168
</div>
159169
)
160170
})}

src/components/Home/components/shared/PropertyConfigPanel.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect, useState, useCallback } from 'react'
1+
import React, { useEffect, useState, useCallback, useId } from 'react'
22
import { useGameStatus, useGamePlatform, useGamePlayWith, useGamePlayedStatus } from '@/hooks'
33
import { GAME_PROPERTY_FIELDS } from '@/models/api/ImportExport'
44
import type { ConfigurableGameProperty, GameImportConfig, GameExportConfig, ImportPropertyOverride, ExportPropertyOverride } from '@/models/api/ImportExport'
@@ -21,6 +21,7 @@ interface PropertyConfigPanelProps {
2121
}
2222

2323
const PropertyConfigPanel: React.FC<PropertyConfigPanelProps> = ({ panelMode, config, onChange, headingLabel }) => {
24+
const radioGroupId = useId()
2425
const { fetchActiveStatusList } = useGameStatus()
2526
const { fetchList: fetchPlatforms } = useGamePlatform()
2627
const { fetchOptions: fetchPlayWithList } = useGamePlayWith()
@@ -233,15 +234,15 @@ const PropertyConfigPanel: React.FC<PropertyConfigPanelProps> = ({ panelMode, co
233234
{/* Mode toggle */}
234235
<div className='pcp__mode-toggle'>
235236
<label className={`pcp__mode-btn ${config.mode === 'simple' ? 'is-active' : ''}`}>
236-
<input type='radio' name={`pcp-mode-${headingLabel ?? 'global'}`} checked={config.mode === 'simple'} onChange={() => handleModeToggle('simple')} />
237+
<input type='radio' name={radioGroupId} checked={config.mode === 'simple'} onChange={() => handleModeToggle('simple')} />
237238
{panelMode === 'import' ? 'As Imported (all)' : 'As Stored (all)'}
238239
</label>
239240
<label className={`pcp__mode-btn ${config.mode === 'customCleared' ? 'is-active' : ''}`}>
240-
<input type='radio' name={`pcp-mode-${headingLabel ?? 'global'}`} checked={config.mode === 'customCleared'} onChange={() => handleModeToggle('customCleared')} />
241+
<input type='radio' name={radioGroupId} checked={config.mode === 'customCleared'} onChange={() => handleModeToggle('customCleared')} />
241242
Custom Cleared
242243
</label>
243244
<label className={`pcp__mode-btn ${config.mode === 'custom' ? 'is-active' : ''}`}>
244-
<input type='radio' name={`pcp-mode-${headingLabel ?? 'global'}`} checked={config.mode === 'custom'} onChange={() => handleModeToggle('custom')} />
245+
<input type='radio' name={radioGroupId} checked={config.mode === 'custom'} onChange={() => handleModeToggle('custom')} />
245246
Custom (per property)
246247
</label>
247248
</div>

0 commit comments

Comments
 (0)