From 437abff006e14f7dc5d3d27e47f2bb7224239d5d Mon Sep 17 00:00:00 2001 From: hided62 Date: Fri, 21 Aug 2026 01:45:04 +0000 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20Gateway=20=EB=A1=9C=EB=B9=84?= =?UTF-8?q?=EC=97=90=20=EC=8B=9C=EB=82=98=EB=A6=AC=EC=98=A4=EB=AA=85?= =?UTF-8?q?=EC=9D=84=20=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) }})
From a43f3e4e0abbb18cfef34d88d164f1d1de2178df Mon Sep 17 00:00:00 2001 From: hided62 Date: Fri, 21 Aug 2026 01:45:20 +0000 Subject: [PATCH 2/4] =?UTF-8?q?perf:=20=ED=94=84=EB=9F=B0=ED=8A=B8?= =?UTF-8?q?=EC=97=94=EB=93=9C=20import=20=EA=B2=BD=EA=B3=84=EB=A5=BC=20?= =?UTF-8?q?=EC=84=B8=EB=B6=84=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gateway 화면을 route 단위로 지연 로딩하고 common runtime import를 실제 소유 leaf export로 분리한다.\n\npackage boundary와 route loading 회귀 테스트로 root barrel 재유입을 차단한다. --- .../command/reservedCommandBrief.ts | 2 +- .../components/main/GeneralBattleSummary.vue | 2 +- .../src/components/main/MainFrontStatus.vue | 2 +- app/game-frontend/src/stores/mainDashboard.ts | 8 ++--- .../src/utils/dashboardReadModel.ts | 2 +- app/game-frontend/src/utils/formatLog.ts | 2 +- app/game-frontend/src/utils/gatewayTrpc.ts | 2 +- app/game-frontend/src/utils/legacyDateTime.ts | 2 +- app/game-frontend/src/utils/trpc.ts | 3 +- app/game-frontend/src/views/AuctionView.vue | 2 +- .../src/views/BattleCenterView.vue | 2 +- app/game-frontend/src/views/BettingView.vue | 2 +- app/game-frontend/src/views/BoardView.vue | 2 +- .../src/views/DynastyDetailView.vue | 2 +- app/game-frontend/src/views/InheritView.vue | 3 +- app/game-frontend/src/views/MainView.vue | 2 +- .../src/views/NationCitiesView.vue | 2 +- .../src/views/NationPersonnelView.vue | 2 +- .../src/views/NationSecretView.vue | 2 +- app/game-frontend/src/views/PastPlaysView.vue | 5 ++- app/game-frontend/src/views/SurveyView.vue | 2 +- .../src/views/TournamentView.vue | 2 +- app/game-frontend/src/views/TrafficView.vue | 2 +- app/game-frontend/src/views/TroopView.vue | 2 +- app/gateway-frontend/src/router/index.ts | 17 ++++----- app/gateway-frontend/src/utils/formatLog.ts | 2 +- app/gateway-frontend/src/utils/gameTrpc.ts | 6 ++-- app/gateway-frontend/src/utils/trpc.ts | 2 +- .../src/views/AccountView.vue | 2 +- app/gateway-frontend/src/views/AdminView.vue | 5 ++- app/gateway-frontend/src/views/HomeView.vue | 2 +- app/gateway-frontend/src/views/LobbyView.vue | 2 +- .../src/views/ServerOperationsView.vue | 2 +- .../test/routerLoading.test.mjs | 25 +++++++++++++ packages/common/package.json | 32 +++++++++++++++++ packages/common/tsdown.config.ts | 8 +++++ tools/check-package-boundaries.mjs | 26 +++++++++++++- tools/check-package-boundaries.test.mjs | 36 +++++++++++++++++++ 38 files changed, 175 insertions(+), 51 deletions(-) create mode 100644 app/gateway-frontend/test/routerLoading.test.mjs diff --git a/app/game-frontend/src/components/command/reservedCommandBrief.ts b/app/game-frontend/src/components/command/reservedCommandBrief.ts index 0e113877..500804aa 100644 --- a/app/game-frontend/src/components/command/reservedCommandBrief.ts +++ b/app/game-frontend/src/components/command/reservedCommandBrief.ts @@ -1,4 +1,4 @@ -import { JosaUtil } from '@sammo-ts/common'; +import { JosaUtil } from '@sammo-ts/common/util/JosaUtil'; import type { CommandOption, CommandTable } from './types'; diff --git a/app/game-frontend/src/components/main/GeneralBattleSummary.vue b/app/game-frontend/src/components/main/GeneralBattleSummary.vue index d67bb894..55ba881e 100644 --- a/app/game-frontend/src/components/main/GeneralBattleSummary.vue +++ b/app/game-frontend/src/components/main/GeneralBattleSummary.vue @@ -1,7 +1,7 @@