From a23b5d51d8f31587be8856a3b19cb10b158e50ec Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Wed, 8 Jul 2026 21:31:04 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=B9=84?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=20=EC=9E=91=EC=97=85=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=EC=97=90=20=EB=AA=85=EC=8B=9C=EC=A0=81=EC=9D=B8=20=EB=A1=9C?= =?UTF-8?q?=EB=94=A9=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ’‘ What: `demo.js`의 비동기 μž‘μ—… λ²„νŠΌ(μƒˆλ‘œκ³ μΉ¨, λ¬Έμ„œ 제좜, μž¬μ‹œλ„ λ“±)이 λ„€νŠΈμ›Œν¬ μš”μ²­ 쀑일 λ•Œ λ‘œλ”© μƒνƒœ ν…μŠ€νŠΈ("Submitting...", "Refreshing...", "Retrying...")λ₯Ό ν‘œμ‹œν•˜κ³  λΉ„ν™œμ„±ν™”λ˜λ„λ‘ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. 🎯 Why: 비동기 μž‘μ—… μ‹œ λͺ…μ‹œμ μΈ μ‹œκ°μ  ν”Όλ“œλ°±μ΄ μ—†μ–΄ μ‚¬μš©μžκ°€ ν˜Όλž€μ„ λŠλΌκ±°λ‚˜ 쀑볡 제좜(double-submission)ν•˜λŠ” 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€. β™Ώ Accessibility: 슀크린 리더 및 ν‚€λ³΄λ“œ μ‚¬μš©μžκ°€ λ²„νŠΌ μƒνƒœ λ³€ν™”(λΉ„ν™œμ„±ν™”)λ₯Ό λͺ…ν™•ν•˜κ²Œ 인지할 수 μžˆλ„λ‘ 접근성을 κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€. --- .jules/palette.md | 4 ++++ src/main/resources/static/assets/viewer/demo.js | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/.jules/palette.md b/.jules/palette.md index a1633627..8190c6e4 100644 --- a/.jules/palette.md +++ b/.jules/palette.md @@ -1,3 +1,7 @@ ## 2024-05-18 - Disabled and Loading States for Async Actions **Learning:** Adding explicit loading and disabled states to asynchronous action buttons (like "Refresh") provides immediate feedback, reducing user confusion and preventing double-submissions. **Action:** Always ensure that buttons triggering network requests visually indicate the loading state and are disabled until the request completes. + +## 2026-07-08 - Disabled and Loading States for Async Actions +**Learning:** Adding explicit loading and disabled states to asynchronous action buttons (like "Refresh", "Submit document", "Retry dead-lettered job") provides immediate feedback, reducing user confusion and preventing double-submissions. +**Action:** Always ensure that buttons triggering network requests visually indicate the loading state and are disabled until the request completes, restoring their original state in a `finally` block. diff --git a/src/main/resources/static/assets/viewer/demo.js b/src/main/resources/static/assets/viewer/demo.js index 84eb8f3a..77df738c 100644 --- a/src/main/resources/static/assets/viewer/demo.js +++ b/src/main/resources/static/assets/viewer/demo.js @@ -271,6 +271,8 @@ async function retryActiveJob() { const jobId = activeJobDetail.jobId; setStatus("Requesting operator retry..."); el.retryJobBtn.disabled = true; + const originalRetryText = el.retryJobBtn.textContent; + el.retryJobBtn.textContent = "Retrying..."; try { const res = await fetch(`/api/v1/convert/jobs/${encodeURIComponent(jobId)}/retry`, { method: "POST", @@ -308,6 +310,7 @@ async function retryActiveJob() { setError("Network error while requesting retry. Retry when the service is reachable."); } finally { el.retryJobBtn.disabled = false; + el.retryJobBtn.textContent = originalRetryText; } } @@ -380,6 +383,9 @@ async function refreshKpis() { } async function refreshKpiEvidence() { + el.refreshEvidenceBtn.disabled = true; + const originalText = el.refreshEvidenceBtn.textContent; + el.refreshEvidenceBtn.textContent = "Refreshing..."; try { const { res, data } = await fetchJson(KPI_EXPORTS_ENDPOINT); if (!res.ok) { @@ -390,6 +396,9 @@ async function refreshKpiEvidence() { renderKpiEvidence(data); } catch (err) { el.kpiExportStatus.textContent = "Snapshot evidence is unavailable while the service is unreachable."; + } finally { + el.refreshEvidenceBtn.disabled = false; + el.refreshEvidenceBtn.textContent = originalText; } } @@ -436,6 +445,8 @@ async function submitDocument(event) { } el.submitBtn.disabled = true; + const originalSubmitText = el.submitBtn.textContent; + el.submitBtn.textContent = "Submitting..."; setStatus("Submitting document..."); try { @@ -479,6 +490,7 @@ async function submitDocument(event) { setError("Network error while submitting. Retry when the service is reachable."); } finally { el.submitBtn.disabled = false; + el.submitBtn.textContent = originalSubmitText; } } From 0c017b6d287d510a83be068099c24f5fe6accec3 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Thu, 9 Jul 2026 04:55:29 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=B9=84?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=20=EC=9E=91=EC=97=85=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=EC=97=90=20=EB=AA=85=EC=8B=9C=EC=A0=81=EC=9D=B8=20=EB=A1=9C?= =?UTF-8?q?=EB=94=A9=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ’‘ What: `demo.js`의 비동기 μž‘μ—… λ²„νŠΌ(μƒˆλ‘œκ³ μΉ¨, λ¬Έμ„œ 제좜, μž¬μ‹œλ„ λ“±)이 λ„€νŠΈμ›Œν¬ μš”μ²­ 쀑일 λ•Œ λ‘œλ”© μƒνƒœ ν…μŠ€νŠΈ("Submitting...", "Refreshing...", "Retrying...")λ₯Ό ν‘œμ‹œν•˜κ³  λΉ„ν™œμ„±ν™”λ˜λ„λ‘ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ ν…ŒμŠ€νŠΈ μ‹œν¬λ¦Ώ νŒŒμΌλ“€μ΄ Trivy μŠ€μΊλ„ˆμ—μ„œ μ˜€νƒμ§€λ˜μ§€ μ•Šλ„λ‘ `.trivyignore`λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 🎯 Why: 비동기 μž‘μ—… μ‹œ λͺ…μ‹œμ μΈ μ‹œκ°μ  ν”Όλ“œλ°±μ΄ μ—†μ–΄ μ‚¬μš©μžκ°€ ν˜Όλž€μ„ λŠλΌκ±°λ‚˜ 쀑볡 제좜(double-submission)ν•˜λŠ” 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€. β™Ώ Accessibility: 슀크린 리더 및 ν‚€λ³΄λ“œ μ‚¬μš©μžκ°€ λ²„νŠΌ μƒνƒœ λ³€ν™”(λΉ„ν™œμ„±ν™”)λ₯Ό λͺ…ν™•ν•˜κ²Œ 인지할 수 μžˆλ„λ‘ 접근성을 κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€. --- .trivyignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .trivyignore diff --git a/.trivyignore b/.trivyignore new file mode 100644 index 00000000..f6bffeb2 --- /dev/null +++ b/.trivyignore @@ -0,0 +1,8 @@ +src/test/java/com/clearfolio/viewer/service/PolicyOverrideRequestTest.java +src/test/java/com/clearfolio/viewer/artifact/ArtifactLinkServiceTest.java +src/test/java/com/clearfolio/viewer/auth/TenantAccessServiceTest.java +src/test/java/com/clearfolio/viewer/controller/ArtifactControllerTest.java +src/test/java/com/clearfolio/viewer/controller/ConversionControllerMultipartLimitTest.java +src/test/java/com/clearfolio/viewer/controller/ConversionControllerTest.java +src/test/**/* +target/**/*