На странице счёта (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 состояния страницы сохранены.
## Контекст
На странице счёта (`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 не меняется.
Отклонение от исходного 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 не выполнялась.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Контекст
На странице счёта (
src/pages/account) все секции — раскрытыйAccordion(multiple, всё открыто): длинный скролл, нет навигации по разделам. Нет итогового результата позиций и процента по позиции.Ожидаемое поведение
AccountHeading,SourceSyncStatus, итоги по валютам (или partial Alert),PortfolioStructure.Tabs: «Позиции» (по умолчанию), «Деньги», «Операции», «События», «Доход». Состояние вкладки локальное, URL не меняется.absoluteReturn) в сводке; процент по позицииabsoluteReturn / (averagePurchasePrice × quantity) × 100, как в backendinstrument-position.ts. Без НКД и купонов (цены брокера «чистые»; купон учитывается в доходах). Подпись это поясняет.Acceptance Criteria
Backend не меняется.
Реализовано в #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 не выполнялась.