Страница брокерского счёта: вкладки вместо аккордеона и нереализованный результат #112

Closed
opened 2026-10-25 23:18:44 +03:00 by codex-bot · 1 comment
Owner

Контекст

На странице счёта (src/pages/account) все секции — раскрытый Accordion (multiple, всё открыто): длинный скролл, нет навигации по разделам. Нет итогового результата позиций и процента по позиции.

Ожидаемое поведение

  • Над вкладками: AccountHeading, SourceSyncStatus, итоги по валютам (или partial Alert), PortfolioStructure.
  • Mantine Tabs: «Позиции» (по умолчанию), «Деньги», «Операции», «События», «Доход». Состояние вкладки локальное, URL не меняется.
  • «Позиции»: фильтр Все / Акции / Облигации / Прочее (только присутствующие типы).
  • «Операции», «События», «Доход» — текущие превью + кнопка «Подробнее» на существующие страницы (страницы остаются).
  • Нереализованный результат по валютам (сумма absoluteReturn) в сводке; процент по позиции absoluteReturn / (averagePurchasePrice × quantity) × 100, как в backend instrument-position.ts. Без НКД и купонов (цены брокера «чистые»; купон учитывается в доходах). Подпись это поясняет.

Acceptance Criteria

  • Аккордеон на странице счёта заменён на Mantine Tabs, по умолчанию «Позиции»; URL не меняется при переключении.
  • Вкладки доступны с клавиатуры (роли tablist/tab/tabpanel), на мобильных не ломают layout.
  • Фильтр типов в «Позициях» показывает только существующие типы; «Все» по умолчанию.
  • «Операции», «События», «Доход» содержат превью и ссылку «Подробнее» на отдельные страницы.
  • Сводка показывает нереализованный результат по каждой валюте; при неполных данных (null/разные валюты) — не показывает неверную сумму.
  • Процент по позиции считается без НКД; null при количестве ≤ 0, отсутствии средней цены или несовпадении валют.
  • Loading/empty/error/partial состояния страницы сохранены.
  • Тесты обновлены/добавлены; lint, typecheck, tests проходят.

Backend не меняется.

## Контекст На странице счёта (`src/pages/account`) все секции — раскрытый `Accordion` (multiple, всё открыто): длинный скролл, нет навигации по разделам. Нет итогового результата позиций и процента по позиции. ## Ожидаемое поведение - Над вкладками: `AccountHeading`, `SourceSyncStatus`, итоги по валютам (или partial Alert), `PortfolioStructure`. - Mantine `Tabs`: «Позиции» (по умолчанию), «Деньги», «Операции», «События», «Доход». Состояние вкладки локальное, URL не меняется. - «Позиции»: фильтр Все / Акции / Облигации / Прочее (только присутствующие типы). - «Операции», «События», «Доход» — текущие превью + кнопка «Подробнее» на существующие страницы (страницы остаются). - Нереализованный результат по валютам (сумма `absoluteReturn`) в сводке; процент по позиции `absoluteReturn / (averagePurchasePrice × quantity) × 100`, как в backend `instrument-position.ts`. **Без НКД и купонов** (цены брокера «чистые»; купон учитывается в доходах). Подпись это поясняет. ## Acceptance Criteria - [ ] Аккордеон на странице счёта заменён на Mantine Tabs, по умолчанию «Позиции»; URL не меняется при переключении. - [ ] Вкладки доступны с клавиатуры (роли tablist/tab/tabpanel), на мобильных не ломают layout. - [ ] Фильтр типов в «Позициях» показывает только существующие типы; «Все» по умолчанию. - [ ] «Операции», «События», «Доход» содержат превью и ссылку «Подробнее» на отдельные страницы. - [ ] Сводка показывает нереализованный результат по каждой валюте; при неполных данных (null/разные валюты) — не показывает неверную сумму. - [ ] Процент по позиции считается без НКД; null при количестве ≤ 0, отсутствии средней цены или несовпадении валют. - [ ] Loading/empty/error/partial состояния страницы сохранены. - [ ] Тесты обновлены/добавлены; lint, typecheck, tests проходят. Backend не меняется.
Author
Owner

Реализовано в #113 (squash 3075081 в develop).

Отклонение от исходного AC по решению владельца: опция «Все» в фильтре позиций убрана — переключатель показывает только присутствующие типы, по умолчанию выбран первый; при одном типе скрыт.

Проверки: npm run verify — exit 0 (lint, typecheck, tests с coverage, knip, depcruise, build, storybook build); CI PR зелёный. Первый прогон CI падал на stories-must-not-reach-application-data (view импортировал runtime из model) — исправлено коммитом d3e0656: процент форматируется в model, view получает готовую строку.

Ограничение: ручная проверка клавиатуры и вида целиком на 375px не выполнялась.

Реализовано в #113 (squash `3075081` в `develop`). Отклонение от исходного AC по решению владельца: опция «Все» в фильтре позиций убрана — переключатель показывает только присутствующие типы, по умолчанию выбран первый; при одном типе скрыт. Проверки: `npm run verify` — exit 0 (lint, typecheck, tests с coverage, knip, depcruise, build, storybook build); CI PR зелёный. Первый прогон CI падал на `stories-must-not-reach-application-data` (view импортировал runtime из model) — исправлено коммитом `d3e0656`: процент форматируется в model, view получает готовую строку. Ограничение: ручная проверка клавиатуры и вида целиком на 375px не выполнялась.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/frontend#112