🎨 Palette: 로딩 상태(aria-busy) 시각적/기능적 피드백 개선 - #1022
Conversation
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다. CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하여, 시각적 상태와 접근성 트리를 동기화하고 로딩 중 불필요한 중복 요청을 방지했습니다.
|
👋 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: trueNo actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthrough
Changes비동기 상호작용 상태
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to Loading scan rows now appear inactive and reject repeated activation while detail data is loading. No current merge-blocking risk remains. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks 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 |
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다. CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하여, 시각적 상태와 접근성 트리를 동기화하고 로딩 중 불필요한 중복 요청을 방지했습니다.
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다. CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하여, 시각적 상태와 접근성 트리를 동기화하고 로딩 중 불필요한 중복 요청을 방지했습니다.
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다. CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하여, 시각적 상태와 접근성 트리를 동기화하고 로딩 중 불필요한 중복 요청을 방지했습니다.
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다.
CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하고, JS의 클릭/엔터 이벤트 리스너에도 명시적인 반환 로직(`if(tr.getAttribute("aria-busy")==="true")return;`)을 추가하여 로딩 중 불필요한 중복 요청을 원천적으로 차단했습니다.
|
Design Assurance exact-head finding — A concurrent update reintroduced the repository-wide “always map aria-busy to pointer-events:none” doctrine and also deleted the protected-base shared-skill threat-model/CHANGELOG evidence. Forward-only atomic commit The PR remains Draft / not merge-ready. Exact-head admission and CodeQL/security jobs are queued, real browser/accessibility-tree evidence is absent, and this responsibility overlaps #1054/#1100. Owner acceptance remains pointer plus Enter/Space rapid activation, stale/late response, error/close/focus/cleanup, responsive evidence, and ko/en/ja/zh/vi/es/de/fr resources. Do not transfer predecessor GREEN or retire this delta until one canonical successor proves complete carryover. |
I have added explicit Javascript event-path guards ( |
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다.
CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하고, JS의 클릭/엔터 이벤트 리스너에도 명시적인 반환 로직(`if(tr.getAttribute("aria-busy")==="true")return;`)을 추가하여 로딩 중 불필요한 중복 요청을 원천적으로 차단했습니다.
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다.
CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하고, JS의 클릭/엔터 이벤트 리스너에도 명시적인 반환 로직(`if(tr.getAttribute("aria-busy")==="true")return;`)을 추가하여 로딩 중 불필요한 중복 요청을 원천적으로 차단했습니다.
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다.
CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하고, JS의 클릭/엔터 이벤트 리스너에도 명시적인 반환 로직(`if(tr.getAttribute("aria-busy")==="true")return;`)을 추가하여 로딩 중 불필요한 중복 요청을 원천적으로 차단했습니다.
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다.
CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하고, JS의 클릭/엔터 이벤트 리스너에도 명시적인 반환 로직(`if(tr.getAttribute("aria-busy")==="true")return;`)을 추가하여 로딩 중 불필요한 중복 요청을 원천적으로 차단했습니다.
기존에는 로딩 상태를 나타내기 위해 요소에 `aria-busy="true"` 속성만 추가하고 있었으나, 시각적인 피드백이나 추가 클릭 방지 기능이 없었습니다.
CSS에 `:disabled` 및 `[aria-busy="true"]` 상태일 때 `opacity: 0.7; pointer-events: none;`을 적용하고, JS의 클릭/엔터 이벤트 리스너에도 명시적인 반환 로직(`if(tr.getAttribute("aria-busy")==="true")return;`)을 추가하여 로딩 중 불필요한 중복 요청을 원천적으로 차단했습니다.
💡 What
scanner/dashboard/console.html내부에서 로딩 시 추가되는aria-busy="true"상태에 대해opacity: 0.7; pointer-events: none;CSS 속성을 부여했습니다.🎯 Why
사용자가 비동기 데이터를 가져오거나 서버와 연결할 때, 요소가 비활성화된 것처럼 보이지 않으면 여러 번 클릭을 시도할 가능성이 높습니다.
aria-busy="true"는 스크린 리더에게 상태를 전달할 뿐 기본적으로 마우스 이벤트를 막지 않으므로 시각적인 스타일 변경과 클릭 방지 기능(pointer-events: none)이 필수적입니다.📸 Before/After
로딩 상태를 강제로 발생시키기 위해 Playwright 스크립트를 작성하여 테스트했습니다.
Before:
로딩 상태(
aria-busy="true")가 되어도 해당 열(row)이나 연결 버튼이 그대로 활성화된 것처럼 보이며 클릭도 가능한 상태였습니다.After:
로딩 상태 진입 시 투명도(opacity)가 약간 낮아져 비활성화된 느낌을 주며
pointer-events: none을 통해 이중 클릭이 원천 차단됩니다. (결과 첨부 비디오 및 스크린샷 참조)♿ Accessibility
aria-busy="true"라는 올바른 ARIA 상태(접근성 트리)가 시각적 스타일(css)과 일치하도록 매핑되었습니다.스크린 리더 사용자와 마우스 사용자 간의 인터랙션 경험 차이를 줄이고, 일관된 UX를 제공합니다.
PR created automatically by Jules for task 8648974402218622840 started by @seonghobae
Summary by CodeRabbit