gov-portal 디자인을 시스템 전체에 적용한다.
- 사이트 업무 페이지: 공통 셸 bag/layout/portal(헤더+대메뉴 클릭+좌측 사이드바 소메뉴) - 관리자 페이지: admin/layout 을 동일 포털 셸로 재작성(관리자 메뉴 트리, 폴백) - 메인(/): gov-portal 대시보드, 종량제 실데이터만(재고/주문/승인/활동로그) - 로그인/회원가입/2차인증/TOTP: 공통 auth/_shell 로 통일, 사이트 공통 로고 - 버튼색 통일: btn-search 등 주요 버튼을 #243a5e(메뉴바 네이비보다 살짝 밝게), 밝은 파랑 채움 버튼(#2b4c8c/#1e548a)도 동일 색으로 - gov_portal_nav_context() 임의 메뉴 트리 수용, 업무 셸은 실제 bag/* 링크 유지 - Admin\Menu 권한거부 리다이렉트 admin/dashboard(404) → admin 수정 - E2E redesign.spec.js 추가, 기능 무변경 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
74
e2e/redesign.spec.js
Normal file
74
e2e/redesign.spec.js
Normal file
@@ -0,0 +1,74 @@
|
||||
const { test, expect } = require('@playwright/test');
|
||||
const { login } = require('./helpers/auth');
|
||||
|
||||
/**
|
||||
* gov-portal 디자인 전면 적용 검증
|
||||
* - 메인(/) = 포털 대시보드(실데이터 카드)
|
||||
* - 업무 페이지에 포털 셸(헤더+대메뉴+사이드바) 적용
|
||||
* - 대메뉴 클릭 → 좌측 사이드바에 소메뉴 표시
|
||||
*/
|
||||
test.describe('gov-portal 전면 적용', () => {
|
||||
test('메인(/)이 포털 대시보드로 렌더', async ({ page }) => {
|
||||
await login(page, 'user');
|
||||
await page.goto('/');
|
||||
await expect(page.locator('header.portal-header')).toBeVisible();
|
||||
await expect(page.locator('.sidebar')).toBeVisible();
|
||||
await expect(page.getByText('봉투 재고 총량')).toBeVisible();
|
||||
await expect(page.getByText('승인 대기')).toBeVisible();
|
||||
// 목업 흔적(가짜 공지/지도)이 없어야 함
|
||||
await expect(page.getByText('서비스 데스크')).toHaveCount(0);
|
||||
});
|
||||
|
||||
test('업무 페이지에 포털 셸 적용', async ({ page }) => {
|
||||
await login(page, 'user');
|
||||
await page.goto('/bag/help');
|
||||
await expect(page.locator('header.portal-header')).toBeVisible();
|
||||
await expect(page.locator('#portalSidebarList')).toBeAttached();
|
||||
await expect(page.locator('#portalTopNavClick')).toBeAttached();
|
||||
});
|
||||
|
||||
test('관리자 계정은 상단에 관리자 링크 노출', async ({ page }) => {
|
||||
await login(page, 'local');
|
||||
await page.goto('/');
|
||||
const adminLink = page.locator('header.portal-header a[href$="/admin"]');
|
||||
await expect(adminLink).toBeVisible();
|
||||
await expect(adminLink).toContainText('관리자');
|
||||
});
|
||||
|
||||
test('로그인 페이지가 gov-portal 스타일(Pretendard)로 렌더', async ({ page }) => {
|
||||
await page.goto('/login');
|
||||
const hasPretendard = await page.evaluate(() =>
|
||||
[...document.styleSheets, ...document.querySelectorAll('link')].some(
|
||||
(n) => (n.href || '').includes('pretendard')));
|
||||
expect(hasPretendard).toBeTruthy();
|
||||
await expect(page.locator('input[name="login_id"]')).toBeVisible();
|
||||
});
|
||||
|
||||
test('관리자 페이지에도 포털 셸 적용', async ({ page }) => {
|
||||
await login(page, 'admin');
|
||||
await page.goto('/admin/select-local-government');
|
||||
await expect(page.locator('header.portal-header')).toBeVisible();
|
||||
await expect(page.locator('#portalSidebarList')).toBeAttached();
|
||||
await expect(page.locator('#portalTopNavClick')).toBeAttached();
|
||||
});
|
||||
|
||||
test('로그인·메인 로고가 사이트 공통 로고로 통일', async ({ page }) => {
|
||||
for (const url of ['/login', '/']) {
|
||||
await page.goto(url);
|
||||
const brand = page.locator('header a[href]').first();
|
||||
await expect(brand).toContainText('종량제 시스템');
|
||||
await expect(brand.locator('svg path')).toHaveCount(1); // 휴지통 SVG
|
||||
}
|
||||
});
|
||||
|
||||
test('대메뉴 클릭 시 사이드바에 소메뉴 표시', async ({ page }) => {
|
||||
await login(page, 'user');
|
||||
await page.goto('/');
|
||||
const triggers = page.locator('.portal-nav-trigger[data-parent-idx]');
|
||||
const n = await triggers.count();
|
||||
test.skip(n === 0, '이 계정에 하위메뉴를 가진 대메뉴가 없음');
|
||||
await triggers.first().click();
|
||||
// 사이드바 목록에 항목이 채워짐
|
||||
await expect(page.locator('#portalSidebarList li').first()).toBeVisible();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user