Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,7 @@
## 2026-07-13 - Async Table Actions UX
**Learning:** Adding explicit loading and disabled states to table action buttons that invoke asynchronous processes helps prevent redundant API calls and visually assures the user that their request is being handled.
**Action:** Consistently apply `disabled` state and `Loading...` text changes to inline table action buttons linked to async workflows, and carefully preserve underlying DOM structures with `Array.from(btn.childNodes)` during the loading cycle to avoid rendering regressions.

## 2024-10-24 - Explicit (required) Text Pattern
**Learning:** Using an explicit `(required)` text directly inside the `<label>` instead of using styled asterisks (`*`) or `aria-hidden` elements provides better accessibility for screen readers and complies with WCAG guidelines. This is enforced by `ViewerUiRequiredFieldAccessibilityTest`.
**Action:** Always use the explicit `(required)` text inside the `<label>` for required form fields across this app to maintain a consistent accessibility pattern.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

### Added

- **접근성 개선**: 문서 업로드 폼의 필수 입력 필드 레이블에 시각적 애스터리스크(*)나 `aria-hidden` 대신 명시적인 `(required)` 텍스트를 포함하여 스크린 리더 접근성과 WCAG 2.5.3 호환성을 향상시켰습니다.

- **UI UX 개선**: 'Details' 버튼 클릭 시, 작업 상세 정보 로드 중에 사용자가 명시적인 로딩 상태를 확인할 수 있도록 'Loading...' 텍스트와 비활성화 상태를 표시하도록 추가했습니다.
- **관리자용 단건 작업 삭제 및 재시도 API 추가**
- 특정 변환 작업을 삭제할 수 있는 `DELETE /api/v1/admin/convert/jobs/{jobId}` 엔드포인트를 추가했습니다.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ private static String demoShellHtml() {
</div>

<form id="upload-form" class="upload-form" enctype="multipart/form-data">
<label class="field-label" for="file-input">Document</label>
<label class="field-label" for="file-input">Document (required)</label>
<input id="file-input" name="file" class="file-input" type="file" required />

<div class="actions">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,4 +228,21 @@ void viewerStillServesUuidDocId() {
.expectBody(String.class)
.value(body -> assertTrue(body.contains(docId.toString())));
}

@Test
void viewerUiRequiredFieldAccessibilityTest() {
webTestClient.get()
.uri("/")
.exchange()
.expectStatus().isOk()
.expectHeader().contentTypeCompatibleWith(
MediaType.TEXT_HTML)
.expectBody(String.class)
.value(body -> {
assertTrue(body.contains(
"<label class=\"field-label\" "
+ "for=\"file-input\">"
+ "Document (required)</label>"));
});
}
}
Loading