사용자 매뉴얼·번호알기·gov-portal 대시보드와 메뉴 동선·수불 리포트를 보강한다.

- 사용자 매뉴얼: league/commonmark 기반 bag/manual(로그인 전용),
  ManualRenderer + Config\Manual manifest, 콘텐츠 8종, E2E
- 번호알기(봉투번호확인): bag/number-lookup, BagNumberLookup, E2E
- gov-portal 대시보드 시안(기본/strip)·기본코드관리 화면
- 메뉴 관리: 등록·수정 후 메뉴 화면 유지, 수정 버튼 클릭 시 상단 스크롤
- 수불/분석 리포트(LOT 수불·반품/파기·수급계획·추이) 표시 보강
- .gitignore: docs/ → /docs/ 앵커링(최상위 개발문서만 제외, app/Docs는 추적)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
taekyoungc
2026-06-08 00:46:51 +09:00
parent 0f1d414f37
commit 8763876f19
77 changed files with 6139 additions and 182 deletions

41
e2e/manual.spec.js Normal file
View File

@@ -0,0 +1,41 @@
const { test, expect } = require('@playwright/test');
const { login } = require('./helpers/auth');
/**
* 사용자 매뉴얼(bag/manual) E2E
* - 비로그인 차단(loginAuth)
* - 로그인 후 목차/본문 렌더
* - 목차 이동(표 렌더)
* - 미등록 slug 404
*/
test.describe('사용자 매뉴얼', () => {
test('비로그인 시 로그인으로 이동', async ({ page }) => {
await page.goto('/bag/manual');
await expect(page).toHaveURL(/\/login/);
});
test('로그인 후 매뉴얼 첫 페이지(개요) 렌더 + 목차 노출', async ({ page }) => {
await login(page, 'user');
await page.goto('/bag/manual');
// manual 첫 slug(overview)로 이동
await expect(page).toHaveURL(/\/bag\/manual\/overview/);
// 좌측 목차
await expect(page.locator('.manual-toc')).toBeVisible();
await expect(page.locator('.manual-toc a', { hasText: '핵심 업무 흐름' })).toBeVisible();
// 본문
await expect(page.locator('.manual-prose h1')).toContainText('시스템 개요');
});
test('목차에서 코드체계 페이지로 이동 → 표 렌더', async ({ page }) => {
await login(page, 'user');
await page.goto('/bag/manual/codes');
await expect(page.locator('.manual-prose table').first()).toBeVisible();
await expect(page.locator('.manual-prose')).toContainText('바코드');
});
test('미등록 slug 는 404', async ({ page }) => {
await login(page, 'user');
const res = await page.goto('/bag/manual/does-not-exist');
expect(res.status()).toBe(404);
});
});