[598][@ant] docs(marketplace): «Каталог витрины» — добавлен e2e скриншот пустого стенда

Существующая проза описывает функционал каталога; добавил один кадр
с реальным состоянием на свежем стенде (фильтр «Все 0», плейсхолдер
«Ничего не найдено», свежая пайщица Екатерина без баланса).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
ant
2026-05-21 00:24:49 +00:00
parent 006e659c95
commit f1ed8e35cb
3 changed files with 78 additions and 0 deletions
@@ -0,0 +1,74 @@
// Сценарий: orderer-стол «Каталог витрины» (/market/catalog).
// Снимаем пустое состояние каталога — на свежем стенде нет активных
// предложений, виден заголовок, фильтр «Все 0», селектор «Свежие сначала»
// и плейсхолдер «Ничего не найдено».
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { cleanViteOverlays, env, loginAs } from '../../../lib/harness.mjs';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const loadFixture = (username) =>
JSON.parse(
fs.readFileSync(path.resolve(__dirname, `../../../state/participants/${username}.json`), 'utf8'),
);
export const meta = {
title: 'Стол заказчика — каталог витрины',
docPath: 'new/marketplace/orderer/catalog.md',
assetsDir: 'assets/new/marketplace/orderer/catalog',
role: 'user',
fixture: 'ekaterina',
fixtures: ['ekaterina'],
};
async function signAllAgreements(page) {
for (let i = 0; i < 8; i++) {
const clicked = await page.evaluate(() => {
const portals = Array.from(document.querySelectorAll('[id^="q-portal--dialog--"]'))
.filter((p) => getComputedStyle(p).display !== 'none');
if (portals.length === 0) return false;
const top = portals[portals.length - 1];
const btn = Array.from(top.querySelectorAll('button'))
.find((b) => b.textContent?.trim() === 'Подписать' && !b.disabled);
if (!btn) return false;
btn.scrollIntoView({ block: 'center', behavior: 'instant' });
btn.click();
return true;
});
if (!clicked) break;
await page.waitForTimeout(3500);
}
}
export default async ({ page, shot }) => {
const fixture = loadFixture('ekaterina');
await loginAs(page, fixture);
await page.evaluate(() => localStorage.setItem('harness:noBranchOverlay', '1'));
await page.waitForFunction(
() => !document.body.innerText.includes('Формируем документ'),
{ timeout: 30000 },
).catch(() => {});
await page.waitForTimeout(1500);
await signAllAgreements(page);
await page.waitForLoadState('networkidle', { timeout: 15000 }).catch(() => {});
await page.goto(`${env.BASE_URL}/${env.COOPNAME}/market/catalog`, { waitUntil: 'domcontentloaded', timeout: 45000 });
await page.waitForLoadState('networkidle', { timeout: 20000 }).catch(() => {});
await page.waitForTimeout(3000);
await cleanViteOverlays(page);
await signAllAgreements(page);
await page.waitForLoadState('networkidle', { timeout: 15000 }).catch(() => {});
await page.waitForTimeout(1500);
await cleanViteOverlays(page);
await shot(
page,
'01-catalog-empty',
`Каталог витрины пайщицы Екатерины. URL: \`${page.url()}\`. Активных предложений нет.`,
);
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

@@ -7,6 +7,10 @@ tags:
Каталог — главная страница Стола заказчика. Здесь пайщик видит **активные Предложения поставщиков**, отфильтрованные по кооперативным категориям, и собирает из них корзину Заказа.
![Каталог витрины пайщицы Екатерины на свежем стенде: фильтр «✓ Все 0», селектор сортировки «Свежие сначала», плейсхолдер «Ничего не найдено — в каталоге пока нет активных предложений»](/assets/new/marketplace/orderer/catalog/01-catalog-empty.png)
На скриншоте — состояние каталога на свежем стенде до первой публикации Предложения: фильтр-чип «Все 0» (счётчик 0 — нет ни одного активного), сортировка по умолчанию «Свежие сначала», по центру placeholder «Ничего не найдено — в каталоге пока нет активных предложений». Левый сайдбар — «Стол пайщика» (Кошелёк, Удостоверение, Реквизиты, Документы, Платежи, Собрания, Контакты, Поддержка), снизу карточка с балансом «0,00 RUB Доступно».
## Что показывается
Каталог построен как лента карточек Предложений. Каждая карточка содержит: