[CL-REACT-DOCTOR-MAILCMP] refactor(MailCompose): чистим 16 react-doctor warnings + smoke-test (100% closure) #116
No reviewers
Labels
No labels
ci-failing
duplicate
needs-rebase
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
europa-tech-srl/europatech!116
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/claude-mail-compose-warnings-cleanup"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
design-no-redundant-size-axesrerender-functional-setstatesplitRecipients(input)сflatMapзаменяет 3 inline.map().filter()— rulejs-flatmap-filterrole="button" tabIndex={0} aria-label onKeyDown(Escape close) — rulesclick-events-have-key-events+no-static-element-interactionsrole="presentation" onKeyDown— те же 2 rulesadmin.mail.closeBackdropна 14 локалейЗачем
Phase 2 react-doctor hygiene #5. 100% closure второй раз подряд (после PR #115). GitNexus impact: LOW risk, 0 upstream callers.
План тестирования
Где могу ошибаться
splitRecipientsповеденчески idempotent (тест проверяет split-trim)## Что сделано - Tailwind 4 size-shorthand на 4 иконках (Send/X header + RefreshCw/Send footer): `w-X h-X` → `size-X` (`design-no-redundant-size-axes`) - Functional setState pattern для 5 input onChange (`setForm((prev) => ({ ...prev, field: e.target.value }))` вместо `setForm({ ...form, field: ... })`) — rule `rerender-functional-setstate` - Извлечён helper `splitRecipients(input)` с `flatMap(trim → [trimmed]|[])` pattern, заменяет 3 inline `.split().map(trim).filter(Boolean)` цепочки — rule `js-flatmap-filter` - a11y backdrop: добавлены `role="button" tabIndex={0} aria-label onKeyDown` (closes на Escape) — rules `click-events-have-key-events` + `no-static-element-interactions` ×2 на L77 - a11y modal panel: добавлены `role="presentation" onKeyDown` (stop propagation) — те же 2 rules на L82 - Новый i18n ключ `admin.mail.closeBackdrop` на 14 локалей - Новый smoke test `app/src/pages/admin/__tests__/MailCompose.test.tsx` (7 кейсов): render title, close X, backdrop role+aria, size-X invariant, error на empty form, functional setState, sendEmail recipient split ## Зачем Phase 2 react-doctor hygiene #5. **100% closure** второй раз подряд. GitNexus impact: **LOW** risk, 0 upstream callers. | До | После | |---|---| | 16 warnings | **0 warnings** | | 0 errors | 0 errors | | 0 tests | 7/7 PASS | ## План тестирования - `cd app && npx tsc --noEmit` — clean - `cd app && npx vitest run src/pages/admin/__tests__/MailCompose.test.tsx` — **7/7 PASS** - `cd app && npm run test:i18n-usage` — Missing: 0 - `cd app && npx react-doctor . --offline --lint -y --json` → MailCompose 16 → **0**, app errors=0 ## Где могу ошибаться - `splitRecipients` ничего не меняет в behavioral (тест на split-by-comma-semicolon-trim покрывает) - Allowance comment для inline JSX handlers оставлен (verbatim из original, hygiene scope) - 14 locale переводов сгенерированы AI — non-EN может потребовать native review (low priority — screen reader only) - Backdrop onKeyDown реагирует только на Escape — Enter не пробрасывает (consistent с modal UX)