merge: 최신 main을 메인 갱신 제어 작업에 통합
This commit is contained in:
@@ -2291,6 +2291,7 @@ test('keeps Ref command briefs and autonomous-action state after a turn mutation
|
||||
|
||||
test('uses drag selection, clipboard paste, and a stored template in advanced mode', async ({ page }) => {
|
||||
const requests = await install(page);
|
||||
await page.setViewportSize({ width: 1200, height: 900 });
|
||||
await page.goto('/');
|
||||
|
||||
const editor = page.locator('[data-command-scope="general"]');
|
||||
@@ -2318,6 +2319,41 @@ test('uses drag selection, clipboard paste, and a stored template in advanced mo
|
||||
await picker.getByRole('button', { name: '입력', exact: true }).click();
|
||||
await expect(editor.locator('.action-column > div').nth(2)).toHaveText('【허창】에 화계실행');
|
||||
|
||||
const recentMenu = editor.locator('details').filter({ has: page.getByText('최근 실행', { exact: true }) });
|
||||
await recentMenu.locator('summary').click();
|
||||
const recentBriefButton = recentMenu.getByRole('button', { name: '【허창】에 화계실행', exact: true });
|
||||
await expect(recentBriefButton).toBeVisible();
|
||||
await recentBriefButton.hover();
|
||||
await page.screenshot({
|
||||
path: test.info().outputPath('advanced-recent-command-brief-desktop-1200.png'),
|
||||
fullPage: true,
|
||||
});
|
||||
await recentMenu.locator('summary').click();
|
||||
await page.setViewportSize({ width: 500, height: 900 });
|
||||
await recentMenu.locator('summary').click();
|
||||
await expect(recentBriefButton).toBeVisible();
|
||||
await recentBriefButton.focus();
|
||||
await expect(recentBriefButton).toBeFocused();
|
||||
const mobileRecentGeometry = await editor.evaluate((element) => {
|
||||
const menu = element.querySelector<HTMLElement>('details[open] .menu-items');
|
||||
const recentButton = menu?.querySelector<HTMLElement>('button');
|
||||
if (!menu || !recentButton) throw new Error('advanced recent command menu is missing');
|
||||
return {
|
||||
horizontalOverflow: element.scrollWidth - element.clientWidth,
|
||||
menuRight: menu.getBoundingClientRect().right,
|
||||
buttonRight: recentButton.getBoundingClientRect().right,
|
||||
};
|
||||
});
|
||||
expect(mobileRecentGeometry.horizontalOverflow).toBeLessThanOrEqual(0);
|
||||
expect(mobileRecentGeometry.menuRight).toBeLessThanOrEqual(500);
|
||||
expect(mobileRecentGeometry.buttonRight).toBeLessThanOrEqual(500);
|
||||
await page.screenshot({
|
||||
path: test.info().outputPath('advanced-recent-command-brief-mobile-500.png'),
|
||||
fullPage: true,
|
||||
});
|
||||
await recentMenu.locator('summary').click();
|
||||
await page.setViewportSize({ width: 1200, height: 900 });
|
||||
|
||||
await drag(0, 2);
|
||||
await editor.locator('details.selected-menu > summary').click();
|
||||
await editor.getByRole('button', { name: '복사하기', exact: true }).click();
|
||||
|
||||
@@ -112,6 +112,15 @@ const myGeneral = (state: FixtureState) => ({
|
||||
statUpgradeLimit: 20,
|
||||
dex: [350, 1_375, 3_500, 7_125, 1_275_975],
|
||||
},
|
||||
records: {
|
||||
battles: 8,
|
||||
strategies: 12,
|
||||
serviceYears: 4,
|
||||
wins: 5,
|
||||
losses: 3,
|
||||
killedCrew: 12_345,
|
||||
lostCrew: 6_789,
|
||||
},
|
||||
items: { horse: 'che_명마', weapon: null, book: null, item: null },
|
||||
itemNames: { horse: '명마', weapon: null, book: null, item: null },
|
||||
},
|
||||
@@ -1184,6 +1193,9 @@ test('내 정보&설정 keeps desktop density and becomes a 390px horizontal-ide
|
||||
expect(myPageImages[1]?.backgroundImage).toContain('/game/crewtype1.png');
|
||||
await expect(page.locator('.legacy-general-details')).toContainText('계급 29품관');
|
||||
await expect(page.locator('.legacy-general-details')).toContainText('병종 보병');
|
||||
await expect(page.locator('.legacy-general-details')).toContainText('전투 8 · 계략 12 · 사관 4년');
|
||||
await expect(page.locator('.legacy-general-details')).toContainText('승률 62.50% · 승리 5 · 패배 3');
|
||||
await expect(page.locator('.legacy-general-details')).toContainText('살상률 181.84% · 사살 12,345 · 피살 6,789');
|
||||
await expect(page.locator('.item-group')).toContainText('명마');
|
||||
await expect(page.locator('#container')).not.toContainText('che_');
|
||||
await expect(page.locator('.title-row')).toContainText('내 정 보');
|
||||
|
||||
@@ -142,11 +142,12 @@ const isRecruitmentCommand = computed(
|
||||
() => selectedCommand.value?.key === 'che_징병' || selectedCommand.value?.key === 'che_모병'
|
||||
);
|
||||
const isRecruitmentOverlayOpen = computed(() => pickerOpen.value && isRecruitmentCommand.value);
|
||||
const rowLabel = (row: ReservedCommandRow): string =>
|
||||
formatReservedCommandBrief(props.scope, row.action, row.args, props.commandTable) ||
|
||||
row.label ||
|
||||
labelMap.value.get(row.action) ||
|
||||
row.action;
|
||||
const commandBrief = (entry: { action: string; args: unknown; label?: string }): string =>
|
||||
formatReservedCommandBrief(props.scope, entry.action, entry.args, props.commandTable) ||
|
||||
entry.label ||
|
||||
labelMap.value.get(entry.action) ||
|
||||
entry.action;
|
||||
const rowLabel = (row: ReservedCommandRow): string => commandBrief(row);
|
||||
const selectedIndices = () => normalizedSelection(selected.value, previousSelected.value, props.rows.length);
|
||||
const pattern = () => extractPattern(props.rows, selectedIndices());
|
||||
const touchMenus = () => (menuRevision.value += 1);
|
||||
@@ -467,7 +468,7 @@ const clickOutsideMenu = (event: Event) => {
|
||||
clickOutsideMenu($event);
|
||||
"
|
||||
>
|
||||
{{ entry.label ?? labelMap.get(entry.action) ?? entry.action }}
|
||||
{{ commandBrief(entry) }}
|
||||
</button>
|
||||
<span v-if="!storage?.recent.size" class="empty-menu">비어 있음</span>
|
||||
</div>
|
||||
|
||||
@@ -796,12 +796,12 @@ onMounted(() => {
|
||||
width: min(100%, 1000px);
|
||||
margin: 0 auto;
|
||||
border: 1px solid #888;
|
||||
overflow: hidden;
|
||||
overflow-x: hidden;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
padding: 0 7px;
|
||||
color: #fff;
|
||||
height: 1597px;
|
||||
min-height: 1597px;
|
||||
font: 14px/21px var(--sammo-font-sans);
|
||||
}
|
||||
|
||||
@@ -1017,7 +1017,7 @@ a:not(.legacy-button):focus-visible {
|
||||
}
|
||||
|
||||
.inherit-page {
|
||||
height: 3047.5px;
|
||||
min-height: 3047.5px;
|
||||
}
|
||||
|
||||
.shop-item .buy-button {
|
||||
|
||||
@@ -136,6 +136,9 @@ const statusLine = computed(() =>
|
||||
|
||||
const canSave = computed(() => (data.value?.settings.myset ?? 1) > 0);
|
||||
const penalties = computed(() => Object.entries(data.value?.penalties ?? {}));
|
||||
const numberText = (value: number): string => value.toLocaleString('ko-KR');
|
||||
const percentText = (numerator: number, denominator: number): string =>
|
||||
`${((numerator / Math.max(denominator, 1)) * 100).toFixed(2)}%`;
|
||||
const noDefencePenaltyWaived = computed(() => {
|
||||
const environment = asRecord(world.value?.config.environment);
|
||||
return isDefenceTrainPenaltyWaivedByScenarioEffect(
|
||||
@@ -437,9 +440,22 @@ onMounted(() => {
|
||||
}})</strong
|
||||
>
|
||||
</div>
|
||||
<div>전투 0 · 계략 0 · 사관 7년</div>
|
||||
<div>승률 0% · 승리 0 · 패배 0</div>
|
||||
<div>살상률 0% · 사살 0 · 피살 0</div>
|
||||
<div>
|
||||
전투 {{ numberText(data.general.records.battles) }} · 계략
|
||||
{{ numberText(data.general.records.strategies) }} · 사관
|
||||
{{ numberText(data.general.records.serviceYears) }}년
|
||||
</div>
|
||||
<div>
|
||||
승률 {{ percentText(data.general.records.wins, data.general.records.battles) }} · 승리
|
||||
{{ numberText(data.general.records.wins) }} · 패배
|
||||
{{ numberText(data.general.records.losses) }}
|
||||
</div>
|
||||
<div>
|
||||
살상률
|
||||
{{ percentText(data.general.records.killedCrew, data.general.records.lostCrew) }} · 사살
|
||||
{{ numberText(data.general.records.killedCrew) }} · 피살
|
||||
{{ numberText(data.general.records.lostCrew) }}
|
||||
</div>
|
||||
<div>
|
||||
소속 {{ data.nation?.name ?? '재야' }} · 도시 {{ data.city?.name ?? '-' }} · 병종
|
||||
{{ data.general.crewTypeName ?? '-' }} · 내정특기
|
||||
|
||||
Reference in New Issue
Block a user