a11y(calendar): explain unavailable writeback actions - #1569
Conversation
- CalendarSidebarRight 및 CalendarWritebackSection의 모든 `<button>`에서 native `disabled` 속성을 제거 - 대신 `aria-disabled` 속성을 사용하여 스크린 리더가 버튼의 존재를 인식하고 읽을 수 있도록 수정 - `aria-disabled:opacity-50`, `aria-disabled:cursor-not-allowed` 등의 Tailwind 클래스를 추가하여 기존 비활성화 시각적 스타일 유지 - `onClick` 핸들러에 `e.preventDefault(); return;` 조기 종료 로직을 추가하여 마우스 클릭 및 키보드(Enter/Space) 이벤트 방지
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Adopt the canonical CalendarSidebarRight behavior from #1488, keep native disabled semantics for unavailable writeback controls, and expose the current unavailability reason through a visible polite status with focused regression coverage. Assisted-by: OpenAI Codex Signed-off-by: Seongho Bae <me@seonghobae.me>
Make the focused accessibility regression reject wording that implies a source is selected when only a read-only source is available. Assisted-by: OpenAI Codex Signed-off-by: Seongho Bae <me@seonghobae.me>
When intent inspection is available but provider execution is blocked, describe both possible prerequisites: a selected writable source and its conflict token. This keeps the status truthful for read-only-source states. Assisted-by: OpenAI Codex Signed-off-by: Seongho Bae <me@seonghobae.me>
Assisted-by: OpenAI Codex Signed-off-by: Seongho Bae <me@seonghobae.me>
Assisted-by: OpenAI Codex Signed-off-by: Seongho Bae <me@seonghobae.me>
Assisted-by: OpenAI Codex Signed-off-by: Seongho Bae <me@seonghobae.me>
|
Exact-head verification for
Keep Draft behind #1488 and stacked-workflow prerequisite #1562. Fresh hosted exact-head checks and independent review remain required. |
Acknowledged. The required verification checks passed locally and the early-return logic inside |
- CalendarSidebarRight 및 CalendarWritebackSection의 모든 `<button>`에서 native `disabled` 속성을 제거 - 대신 `aria-disabled` 속성을 사용하여 스크린 리더가 버튼의 존재를 인식하고 읽을 수 있도록 수정 - `aria-disabled:opacity-50`, `aria-disabled:cursor-not-allowed` 등의 Tailwind 클래스를 추가하여 기존 비활성화 시각적 스타일 유지 - `onClick` 핸들러에 `e.preventDefault(); return;` 조기 종료 로직을 추가하여 마우스 클릭 및 키보드(Enter/Space) 이벤트 방지
This reverts commit fce6f44.
|
Exact-head repair evidence for
|
Acknowledged. I confirm the non-force revert strategy correctly restores the stable configuration. I will keep the PR in draft state behind the identified prerequisite workflows as instructed and will await independent review before merging. |
Current authority — 2026-09-07
develop@042b0c70531b229af3acbd0421a2f23098d848b3palette/calendar-sidebar-buttons-10859032895198147105@5bbf1363cfbb6989f89c749dfbbf9757ae4f589c06eee107461d0a863f21f3404498408cfb108ca5CalendarWritebackSection.tsx,CalendarWritebackSection.test.tsx, and the read-only-source Playwright acceptance infrontend/tests/e2e/dashboard-branding.spec.ts.Finding → causal repair
The original child independently replaced native
disabledwitharia-disabledacross bothCalendarSidebarRightandCalendarWritebackSection. That duplicated #1488 sidebar ownership. The repaired stack keeps sidebar behavior parent-owned and limits this child to the writeback section plus its browser acceptance.The child retains native
disabledandaria-busy, a visiblerole="status" aria-live="polite"explanation, read-only sources as non-interactive, and instance-scoped ReactuseId()so reusable sections do not sharearia-describedbytargets.RED
f721e4598749baf7dc26b1c33cd4fedf6391f56bpins the ready-registry/read-only-source case: create, update, and execute controls remain natively disabled, the no-writable-source reason is exposed, and no callback runs. Causal fixa2a9f8f9fe5c779e24c5fa3e59568d7dda7523d1derives availability fromselectedWritebackSource !== null. A selected writable source without ETag still permits intent checks while provider execution stays disabled with a conflict-token explanation.The browser acceptance adds the same real
/calendarpath with a read-only source registry, requires all three writeback actions and the read-only source control to be disabled, requires the no-writable-source explanation to be visible, verifies no selected label and no/api/calendar/writeback-intentrequest, and captures the bounded state screenshot. This is product-browser evidence source, not a current-head executed result.Parent adoption
#1488 advanced from historical
5a5789e...to5bbf1363...after a live ancestry audit found that its intervening branch state had accidentally reversed #1245 EmailDetail, dependency-security, CHANGELOG, Strix and AGENTS contracts. #1488 repaired that as an ordinary child while preserving only its six Calendar-owned files.This child was therefore not blind-rebased. Ordinary two-parent merge
06eee107461d0a863f21f3404498408cfb108ca5keeps the previous child headb98abeef...as first parent, adopts #14885bbf1363...as second parent, and overlays only the same three child-owned blobs. GitHub now reports mergeable=true; no parent Calendar source, #1245 source, dependency pin, AGENTS guidance or other stale ancestor blob reappears in the child delta.Standards / TRACEABILITY
idvalue must be unique among IDs in its element tree.aria-describedbydescribes a control by referencing content through an element ID.Traceability: reusable-ID uniqueness is pinned by the two-instance regression and implemented with
useId(); unavailable-action truthfulness is pinned by the no-writable-source unit/browser regressions and implemented by the selected-writable-source boundary. Sidebar ownership and its matching readiness invariant stay in #1488.Evidence boundary
Fresh commit-workflow lookup for exact head
06eee107461d0a863f21f3404498408cfb108ca5returns zero pull-request workflow runs. Parent #1488 also now targets a non-default stacked parent and has zero current-head runs. This remains acceptance evidence for the stacked-base workflow-trigger prerequisite #1562 rather than a reason to copy workflows, retarget product branches, or create no-op commits.Prior focused unit/browser results are development evidence for earlier heads only. This exact head has no qualifying independent post-last-push approval and no current-head hosted execution. Actual VoiceOver/NVDA/JAWS speech remains unverified.
UI Delivery Gate
Keep Draft until #1245 → #1488 land through protected governance, this child is reconciled to the resulting ancestry without dropping its three-file delta, and one unchanged resulting exact head has every then-live required check terminal-success, zero valid unresolved findings/threads, appropriate browser/accessibility evidence, and qualifying independent review. No self-approval, review dismissal/fabrication, force-push, destructive rebase, dummy requeue, admin bypass, gate weakening, or predecessor-evidence transfer.