feat: GBLS 리브랜딩 + 매뉴얼 보강 + 워크스페이스/코드관리 UX 개선
리브랜딩 - 서비스명 "종량제 시스템" → "GBLS", 헤더 로고에 풀네임(Garbage Bag Logistics System) 병기 (gov-portal·공통 브랜드·로그인/welcome 셸·타이틀·푸터 전반) 매뉴얼 - 신규 페이지 [로그인·회원가입·계정](01_account.md): 가입 항목·관리자 승인·2차 인증 흐름 - [화면 구성·워크스페이스·단축키]에 계정 전환 시 탭 초기화 안내 추가 워크스페이스(탭) - 탭 전환 시 좌측 사이드바 강조 동기화(메뉴 없는 화면은 강조 해제, 경로 폴백 매칭) - 소메뉴 좌측 아이콘(▸/·) 전부 제거 — 활성 메뉴는 배경 강조로만 구분 - 탭을 사용자(mb_idx)별로 격리: 다른 아이디 로그인 시 이전 탭 복원 안 함 - 사이드바 FAQ 링크 제거(자주 묻는 질문은 매뉴얼에 통합) 기본 코드관리 화면 - 업무현황 카드 스타일로 재디자인(가벼운 표·상태/범위 pill·단일 구분선) - render()에 $bare 옵션 추가 → 이미 카드형인 화면은 바깥 래퍼 생략 기타 - .claude/settings.local.json(개인 권한 설정) .gitignore 추가 - e2e: 워크스페이스(동기화·계정격리) + 매뉴얼(계정·단축키·검색) 케이스 보강 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,32 @@ test.describe('워크스페이스 탭', () => {
|
||||
await expect(page.locator('.ws-tab')).toHaveCount(2);
|
||||
});
|
||||
|
||||
test('다른 아이디로 로그인하면 이전 탭이 복원되지 않음', async ({ page }) => {
|
||||
// admin 으로 워크스페이스에서 소메뉴 탭을 추가
|
||||
await login(page, 'admin');
|
||||
await page.goto('/admin/select-local-government');
|
||||
await page.evaluate(() => {
|
||||
const r = document.querySelector('input[name="lg_idx"][value="1"]');
|
||||
if (r) { r.checked = true; r.form.submit(); }
|
||||
});
|
||||
await page.waitForTimeout(700);
|
||||
await page.goto('/workspace');
|
||||
await page.waitForTimeout(2500);
|
||||
await page.locator('.sidebar .my-menu-list a').first().click();
|
||||
await page.waitForTimeout(1500);
|
||||
await expect(page.locator('.ws-tab')).toHaveCount(2);
|
||||
|
||||
// 같은 브라우저 탭에서 로그아웃 → 다른 아이디(local)로 로그인
|
||||
await page.goto('/logout');
|
||||
await page.waitForTimeout(500);
|
||||
await login(page, 'local');
|
||||
await page.goto('/workspace');
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// 이전 사용자의 탭들은 사라지고 기본 대시보드 탭만 남아야 함
|
||||
await expect(page.locator('.ws-tab')).toHaveCount(1);
|
||||
});
|
||||
|
||||
test('편의: 가운데클릭 닫기·사이드바 동기화', async ({ page }) => {
|
||||
await login(page, 'admin');
|
||||
await page.goto('/admin/select-local-government');
|
||||
@@ -81,13 +107,28 @@ test.describe('워크스페이스 탭', () => {
|
||||
|
||||
await expect(page.locator('.ws-tab')).toHaveCount(1);
|
||||
|
||||
// 소메뉴를 탭으로 열기 → 사이드바에서 해당 항목이 active 로 동기화됨
|
||||
// 대시보드(업무 현황) 탭은 메뉴에 없으므로 사이드바에 active(▸) 가 없어야 함
|
||||
await expect(page.locator('.sidebar .my-menu-list a.active')).toHaveCount(0);
|
||||
|
||||
// 소메뉴를 탭으로 열기 → 그 메뉴가 사이드바에서 active(▸) 로 강조됨
|
||||
const firstMenu = page.locator('.sidebar .my-menu-list a').first();
|
||||
const menuText = (await firstMenu.textContent() || '').trim();
|
||||
await firstMenu.click();
|
||||
await page.waitForTimeout(1500);
|
||||
await expect(page.locator('.ws-tab')).toHaveCount(2);
|
||||
await expect(page.locator('.sidebar .my-menu-list a.active')).toBeVisible();
|
||||
const activeLink = page.locator('.sidebar .my-menu-list a.active');
|
||||
await expect(activeLink).toHaveCount(1);
|
||||
await expect(activeLink).toContainText(menuText.replace(/^[▸·]\s*/, ''));
|
||||
|
||||
// 대시보드 탭으로 전환 → active(▸) 강조가 해제되어야 함 (탭↔사이드바 동기화)
|
||||
await page.locator('.ws-tab').nth(0).click();
|
||||
await page.waitForTimeout(500);
|
||||
await expect(page.locator('.sidebar .my-menu-list a.active')).toHaveCount(0);
|
||||
|
||||
// 메뉴 탭으로 다시 전환 → active(▸) 가 그 메뉴로 복귀
|
||||
await page.locator('.ws-tab').nth(1).click();
|
||||
await page.waitForTimeout(500);
|
||||
await expect(page.locator('.sidebar .my-menu-list a.active')).toHaveCount(1);
|
||||
|
||||
// 두 번째 탭 가운데(휠) 클릭으로 닫기
|
||||
await page.locator('.ws-tab').nth(1).click({ button: 'middle' });
|
||||
|
||||
Reference in New Issue
Block a user