feat: add 410 error handling, progress messages, touch targets, and tests (refs #145)

- Handle poll errors including 410 Gone in useManualExtraction hook
- Add specific progress stage messages (Preparing/Processing/Mapping/Complete)
- Enforce 44px minimum touch targets on all interactive elements
- Add tests for inline editing, mobile fullscreen, and desktop modal layouts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Eric Gullickson
2026-02-11 15:12:29 -06:00
parent ca33f8ad9d
commit 11f52258db
5 changed files with 143 additions and 865 deletions

View File

@@ -117,10 +117,10 @@ const InlineField: React.FC<InlineFieldProps> = ({ label, value, type = 'text',
if (e.key === 'Escape') handleCancel();
}}
/>
<IconButton size="small" onClick={handleSave} color="primary">
<IconButton size="small" onClick={handleSave} color="primary" sx={{ minWidth: 44, minHeight: 44 }}>
<CheckIcon sx={{ fontSize: 16 }} />
</IconButton>
<IconButton size="small" onClick={handleCancel}>
<IconButton size="small" onClick={handleCancel} sx={{ minWidth: 44, minHeight: 44 }}>
<CloseIcon sx={{ fontSize: 16 }} />
</IconButton>
</Box>
@@ -134,6 +134,7 @@ const InlineField: React.FC<InlineFieldProps> = ({ label, value, type = 'text',
alignItems: 'center',
gap: 0.5,
cursor: 'pointer',
minHeight: 44,
'&:hover .edit-icon': { opacity: 1 },
}}
onClick={() => setIsEditing(true)}
@@ -293,7 +294,7 @@ export const MaintenanceScheduleReviewScreen: React.FC<MaintenanceScheduleReview
<Checkbox
checked={item.selected}
onChange={() => handleToggle(index)}
sx={{ mt: -0.5, mr: 1 }}
sx={{ mt: -0.5, mr: 1, '& .MuiSvgIcon-root': { fontSize: 24 }, minWidth: 44, minHeight: 44 }}
inputProps={{ 'aria-label': `Select ${item.service}` }}
/>
<Box sx={{ flex: 1, minWidth: 0 }}>
@@ -379,7 +380,7 @@ export const MaintenanceScheduleReviewScreen: React.FC<MaintenanceScheduleReview
onClick={handleCreate}
disabled={selectedCount === 0 || createMutation.isPending}
startIcon={createMutation.isPending ? <CircularProgress size={16} /> : <CheckIcon />}
sx={{ order: isMobile ? 1 : 2, width: isMobile ? '100%' : 'auto' }}
sx={{ minHeight: 44, order: isMobile ? 1 : 2, width: isMobile ? '100%' : 'auto' }}
>
{createMutation.isPending
? 'Creating...'