From db3865cb6c68e97427cf33de57dc5adb2d996d45 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sat, 15 Aug 2026 21:45:50 +0900 Subject: [PATCH] feat(fe): standardize empty data state with EmptyStatePlaceholder component and AGENTS.md rule --- AGENTS.md | 3 + frontend/src/shared/ui/DataGridShell.vue | 8 +-- frontend/src/shared/ui/QueryStateBoundary.vue | 3 +- .../ui/components/EmptyStatePlaceholder.vue | 72 +++++++++++++++++++ frontend/src/shared/ui/components/index.ts | 1 + 5 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 frontend/src/shared/ui/components/EmptyStatePlaceholder.vue diff --git a/AGENTS.md b/AGENTS.md index 066a6d86..303d4a70 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -99,6 +99,7 @@ All work in this repository MUST follow `docs/CURRENT/WBS_EXECUTION_PROCEDURES.m 2. **Grid Row & Item Context Actions (Table Row Actions)**: Dedicated to **Single-Row CRUD & Processing** (e.g., `✏️ μˆ˜μ •`, `πŸ—‘οΈ μ‚­μ œ`, `πŸ” 상세보기`, `β–Ά 재처리`). Placed in a pinned right column or explicit context menu; never placed in page top toolbar. 3. **Multi-Selection Batch Toolbar (Grid Top/Bottom Selection Bar)**: Activated conditionally upon multi-row selection for **Bulk Actions** (e.g., `선택 일괄 승인(3)`, `선택 일괄 μ‚­μ œ`). - **[CRITICAL IRON RULE] Standardized Loading Skeleton Rule**: ALL screen-level and section-level data loading MUST render animated `SkeletonLoader` (shimmer mode) matching the expected layout (e.g. `skeletonType="table"` for grids, `skeletonType="card"` for forms/summaries) through `QueryStateBoundary`/`StandardScreenBoundary`. Static text ("λΆˆλŸ¬μ˜€λŠ” 쀑...") or empty screen placeholders during loading states are STRICTLY PROHIBITED. +- **[CRITICAL IRON RULE] Standardized Empty Data State Rule**: When zero records or empty dataset states occur, ALL grids, lists, and summary cards MUST render standard `EmptyStatePlaceholder` component (`πŸ“­` icon, clear title, descriptive helper text, and optional recovery action button). Blank white spaces or plain `

데이터가 μ—†μŠ΅λ‹ˆλ‹€

` text tags are STRICTLY PROHIBITED. ## v16.0 Gitea API & CI/CD Automation @@ -360,6 +361,7 @@ Every task β€” code change, refactor, new feature, tooling, infrastructure β€” m - [ ] **Viewport Fit (UI):** λŒ€μ‹œλ³΄λ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  업무 화면이 νŽ˜μ΄μ§€ 슀크둀 없이 초기 λ‘œλ”© μ‹œ 100% ν•œλˆˆμ— λ“€μ–΄μ˜€λŠ”κ°€? - [ ] **Button Standard (UI):** 상단 νˆ΄λ°”(배치/등둝), 행별 μž‘μ—…(μˆ˜μ •/상세), 닀쀑선택(일괄), 폼 ν‘Έν„°(μ·¨μ†Œ/μ €μž₯) λ²„νŠΌ λ°°μΉ˜κ°€ κ·œμΉ™ 맀트릭슀λ₯Ό λ”°λ₯΄λŠ”κ°€? - [ ] **Skeleton Loading (UI):** λ‘œλ”© μƒνƒœ μ‹œ ν…μŠ€νŠΈ λŒ€μ‹  λ ˆμ΄μ•„μ›ƒμ— λ°˜μ‘ν•˜λŠ” shimmer μŠ€μΌˆλ ˆν†€(SkeletonLoader)이 μ œλŒ€λ‘œ λ…ΈμΆœλ˜λŠ”κ°€? +- [ ] **Empty State (UI):** 데이터 0건 λ˜λŠ” 쑰회 κ²°κ³Όκ°€ 없을 μ‹œ ν‘œμ€€ EmptyStatePlaceholder(μ•„μ΄μ½˜+μ„€λͺ…+μ‘°μΉ˜λ²„νŠΌ)κ°€ λ…ΈμΆœλ˜λŠ”κ°€? ### Anti-Patterns (κΈˆμ§€) @@ -367,6 +369,7 @@ Every task β€” code change, refactor, new feature, tooling, infrastructure β€” m - ❌ "νŽ˜μ΄μ§€μ— μ°½ μŠ€ν¬λ‘€λ°”κ°€ μƒκΈ°κ²Œ 방치" β†’ λŒ€μ‹œλ³΄λ“œ μ œμ™Έ λͺ¨λ“  업무 화면은 Viewport-Fit Zero-Scroll ν•„μˆ˜ - ❌ "λ²„νŠΌ μœ„μΉ˜ λ‚œμž‘ 배치" β†’ 상단 우츑(νŽ˜μ΄μ§€/배치), ν–‰ λ‚΄λΆ€(κ°œλ³„ CRUD), 선택바(일괄), 폼 ν‘Έν„°(μ €μž₯/μ·¨μ†Œ) ν‘œμ€€ λ¬΄μ‹œ κΈˆμ§€ - ❌ "λ‘œλ”© μ‹œ 'λΆˆλŸ¬μ˜€λŠ” 쀑...' ν…μŠ€νŠΈ 방치" β†’ λ°˜λ“œμ‹œ λ ˆμ΄μ•„μ›ƒ λ§žμΆ€ν˜• μ• λ‹ˆλ©”μ΄μ…˜ μŠ€μΌˆλ ˆν†€(SkeletonLoader) 적용 ν•„μˆ˜ +- ❌ "데이터 0건 μ‹œ 빈 흰색 곡간 방치" β†’ λ°˜λ“œμ‹œ ν‘œμ€€ EmptyStatePlaceholder μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§ ν•„μˆ˜ - ❌ "ν˜Ήμ‹œ ν•„μš”ν• κΉŒλ΄ 좔상화" β†’ Necessity-driven만 - ❌ SELECT * / Generic Repository β†’ Explicit columns, explicit logic - ❌ "이건 μž‘μ€ 변경이라 ν…ŒμŠ€νŠΈ μŠ€ν‚΅" β†’ λͺ¨λ“  경둜 characterize diff --git a/frontend/src/shared/ui/DataGridShell.vue b/frontend/src/shared/ui/DataGridShell.vue index b6854cf2..6bf4c71e 100644 --- a/frontend/src/shared/ui/DataGridShell.vue +++ b/frontend/src/shared/ui/DataGridShell.vue @@ -1,6 +1,6 @@