From 437abff006e14f7dc5d3d27e47f2bb7224239d5d Mon Sep 17 00:00:00 2001 From: hided62 Date: Fri, 21 Aug 2026 01:45:04 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20Gateway=20=EB=A1=9C=EB=B9=84=EC=97=90=20?= =?UTF-8?q?=EC=8B=9C=EB=82=98=EB=A6=AC=EC=98=A4=EB=AA=85=EC=9D=84=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ref처럼 활성 및 가오픈 서버의 저장 시나리오 코드 대신 게임 상태의 표시명을 사용한다. production Chromium 회귀로 desktop/mobile 표시와 overflow를 검증한다. --- .../e2e/lobby-game-auth.spec.ts | 37 +++++++++++++++++++ app/gateway-frontend/src/views/LobbyView.vue | 13 ++++--- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/app/gateway-frontend/e2e/lobby-game-auth.spec.ts b/app/gateway-frontend/e2e/lobby-game-auth.spec.ts index 1311d99a..35597a2f 100644 --- a/app/gateway-frontend/e2e/lobby-game-auth.spec.ts +++ b/app/gateway-frontend/e2e/lobby-game-auth.spec.ts @@ -303,6 +303,43 @@ test('exchanges the gateway token before loading authenticated lobby general dat }); }); +test('shows the Ref scenario title instead of the stored scenario code for an active profile', async ({ + page, +}, testInfo) => { + await installFixture(page, { + scenarioTitle: '【가상모드27-b】 아시아 명장전(비급)', + }); + await page.setViewportSize({ width: 1365, height: 900 }); + + await page.goto('lobby'); + const row = page.locator('tbody tr').filter({ hasText: 'hwe섭' }); + const info = row.locator('.profile-info-cell'); + const title = row.getByTestId('profile-scenario-title'); + await expect(title).toHaveText('【가상모드27-b】 아시아 명장전(비급)'); + await expect(info).not.toContainText('903'); + await expect(title).toHaveCSS('color', 'oklch(0.75 0.183 55.934)'); + await page.screenshot({ path: testInfo.outputPath('gateway-active-scenario-title-desktop.png'), fullPage: true }); + + await page.setViewportSize({ width: 390, height: 844 }); + await title.scrollIntoViewIfNeeded(); + const mobileGeometry = await info.evaluate((element) => { + const titleElement = element.querySelector('[data-testid="profile-scenario-title"]'); + if (!titleElement) throw new Error('expected scenario title'); + const infoRect = element.getBoundingClientRect(); + const titleRect = titleElement.getBoundingClientRect(); + return { + documentWidth: document.documentElement.scrollWidth, + viewportWidth: window.innerWidth, + info: infoRect.toJSON(), + title: titleRect.toJSON(), + }; + }); + expect(mobileGeometry.documentWidth).toBe(mobileGeometry.viewportWidth); + expect(mobileGeometry.title.left).toBeGreaterThanOrEqual(mobileGeometry.info.left); + expect(mobileGeometry.title.right).toBeLessThanOrEqual(mobileGeometry.info.right); + await page.screenshot({ path: testInfo.outputPath('gateway-active-scenario-title-mobile.png'), fullPage: true }); +}); + test('copies the complete preopen announcement and reveals autorun details without changing layout', async ({ page, }, testInfo) => { diff --git a/app/gateway-frontend/src/views/LobbyView.vue b/app/gateway-frontend/src/views/LobbyView.vue index 078c6dce..cf3f2067 100644 --- a/app/gateway-frontend/src/views/LobbyView.vue +++ b/app/gateway-frontend/src/views/LobbyView.vue @@ -108,6 +108,8 @@ const formatGraceEndsAt = (value: string | null | undefined): string => formatSe const serverSeasonStatus = (info: LobbyInfo) => resolveServerSeasonStatus(info); const formatAnnouncementDate = (value: string | null | undefined): string => formatServerDateTime(value, { fallback: '-' }); +const profileScenarioTitle = (profileName: string): string => + profileDetails.value[profileName]?.scenarioTitle.trim() || '-'; const npcModeText = (mode: number): string => ['불가', '가능', '선택 생성'][mode] ?? '불가'; const autorunDetailText = (info: LobbyInfo): string => { const autorun = info.autorunUser; @@ -527,10 +529,10 @@ const handleEnter = async (profile: LobbyProfile, targetPath: string) => { -
- {{ - profileDetails[profile.profileName]?.scenarioTitle || - profile.scenario - }}{{ profileScenarioTitle(profile.profileName) }}{{ ' ' }} {{ profileDetails[profile.profileName]?.turnTerm }}분 턴 서버 @@ -542,7 +544,8 @@ const handleEnter = async (profile: LobbyProfile, targetPath: string) => { 서기 {{ profileDetails[profile.profileName]?.year }}년 {{ profileDetails[profile.profileName]?.month }}월 ({{ profile.scenario }}{{ profileScenarioTitle(profile.profileName) }})