fix: unify history and upcoming events labels (WealthLedger/frontend#161)

This commit is contained in:
2026-11-07 10:29:25 +03:00
parent 134c951178
commit 6333426ba2
7 changed files with 55 additions and 55 deletions
@@ -227,9 +227,9 @@ beforeEach(() => {
describe("All accounts routes", () => {
it.each([
["/accounts/all", "Все счета"],
["/accounts/all/operations", "Журнал операций"],
["/accounts/all/operations", "История операций"],
["/accounts/all/income?from=2026-08-01&to=2026-08-31", "Пассивный доход"],
["/accounts/all/events", "Будущие события"],
["/accounts/all/events", "Предстоящие события"],
])("opens %s directly", async (path, title) => {
renderPage(path);
expect(
@@ -311,9 +311,9 @@ describe("All accounts routes", () => {
);
for (const [suffix, tab] of [
["operations", "Операции"],
["operations", "История операций"],
["income", "Доход"],
["events", "События"],
["events", "Предстоящие события"],
]) {
fireEvent.click(screen.getByRole("tab", { name: tab }));
expect(screen.getByRole("link", { name: "Подробнее" }))
@@ -55,9 +55,9 @@ describe("AppBreadcrumbs", () => {
});
it.each([
["operations", "Операции"],
["OPERATIONS", "Операции"],
["events", "Будущие события"],
["operations", "История операций"],
["OPERATIONS", "История операций"],
["events", "Предстоящие события"],
["income", "Пассивный доход"],
])("links to the account hierarchy from %s", (section, title) => {
renderBreadcrumbs(`/accounts/account-1/${section}`, [
@@ -440,7 +440,7 @@ describe("AccountOperationsPage", () => {
renderPage();
expect(
await screen.findByRole("heading", { name: "Журнал операций" }),
await screen.findByRole("heading", { name: "История операций" }),
).toBeInTheDocument();
expect(
screen.queryByRole("link", { name: "К счету" }),
@@ -482,7 +482,7 @@ describe("AccountOperationsPage", () => {
renderPage();
expect(
await screen.findByRole("heading", { name: "Журнал операций" }),
await screen.findByRole("heading", { name: "История операций" }),
).toBeInTheDocument();
await waitFor(() => expect(searches.length).toBeGreaterThan(0));
const countBefore = searches.length;
@@ -521,7 +521,7 @@ describe("AccountOperationsPage", () => {
renderPage();
expect(
await screen.findByRole("heading", { name: "Журнал операций" }),
await screen.findByRole("heading", { name: "История операций" }),
).toBeInTheDocument();
fireEvent.click(screen.getByRole("combobox", { name: "Категории" }));
fireEvent.click(await screen.findByText("Налог"));
@@ -579,7 +579,7 @@ describe("AccountOperationsPage", () => {
);
renderPage();
expect(
await screen.findByText("Не удалось загрузить журнал", undefined, {
await screen.findByText("Не удалось загрузить историю операций", undefined, {
timeout: RETRIES_EXHAUSTED_MS,
}),
).toBeInTheDocument();
@@ -850,9 +850,9 @@ describe("AccountPage states", () => {
expect(
screen.getByRole("heading", { name: "Портфель пока пуст" }),
).toBeInTheDocument();
expect(screen.getByRole("link", { name: "Открыть журнал" }))
expect(screen.getByRole("link", { name: "Открыть историю операций" }))
.toBeInTheDocument();
expect(screen.getByRole("link", { name: "Открыть будущие события" }))
expect(screen.getByRole("link", { name: "Открыть предстоящие события" }))
.toBeInTheDocument();
expect(screen.getByRole("link", { name: "Открыть пассивный доход" }))
.toBeInTheDocument();
@@ -893,10 +893,10 @@ describe("AccountPage states", () => {
}),
).toBeVisible();
expect(
screen.getByRole("status", { name: "Загрузка будущих событий" }),
screen.getByRole("status", { name: "Загрузка предстоящих событий" }),
).toBeVisible();
expect(
screen.queryByText("На ближайшие 30 дней событий не найдено."),
screen.queryByText("На ближайшие 30 дней предстоящих событий не найдено."),
).not.toBeInTheDocument();
expect(screen.getByText("Загрузка дохода текущего месяца")).toBeVisible();
expect(screen.queryByText("Нет текущих сумм")).not.toBeInTheDocument();
@@ -1076,7 +1076,7 @@ describe("AccountPage states", () => {
/>,
);
fireEvent.click(screen.getByRole("tab", { name: "Операции" }));
fireEvent.click(screen.getByRole("tab", { name: "История операций" }));
expect(
screen.getByText("Пока недоступно"),
).toBeInTheDocument();
@@ -1115,7 +1115,7 @@ describe("AccountPage states", () => {
/>,
);
fireEvent.click(screen.getByRole("tab", { name: "Операции" }));
fireEvent.click(screen.getByRole("tab", { name: "История операций" }));
expect(screen.getByText("Сделка")).toBeInTheDocument();
expect(screen.getByText("−12 ₽")).toBeInTheDocument();
});
@@ -1169,8 +1169,8 @@ describe("AccountPage states", () => {
/>,
);
fireEvent.click(screen.getByRole("tab", { name: "События" }));
const section = screen.getByRole("tabpanel", { name: "События" });
fireEvent.click(screen.getByRole("tab", { name: "Предстоящие события" }));
const section = screen.getByRole("tabpanel", { name: "Предстоящие события" });
const content = within(section);
const text = section.textContent ?? "";
@@ -1211,15 +1211,15 @@ describe("AccountPage states", () => {
/>,
);
fireEvent.click(screen.getByRole("tab", { name: "События" }));
fireEvent.click(screen.getByRole("tab", { name: "Предстоящие события" }));
const content = within(
screen.getByRole("tabpanel", { name: "События" }),
screen.getByRole("tabpanel", { name: "Предстоящие события" }),
);
if (state === "loading") {
const skeleton = content.getByRole("status", {
name: "Загрузка будущих событий",
name: "Загрузка предстоящих событий",
});
// eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch.
@@ -1230,7 +1230,7 @@ describe("AccountPage states", () => {
else {
// eslint-disable-next-line vitest/no-conditional-expect -- The table case deterministically selects the empty state.
expect(
content.getByText("На ближайшие 30 дней событий не найдено."),
content.getByText("На ближайшие 30 дней предстоящих событий не найдено."),
).toBeVisible();
}
@@ -1251,7 +1251,7 @@ describe("AccountPage states", () => {
/>,
);
fireEvent.click(screen.getByRole("tab", { name: "События" }));
fireEvent.click(screen.getByRole("tab", { name: "Предстоящие события" }));
expect(
screen.getByText("Данные появятся здесь, когда чтение восстановится."),
).toBeInTheDocument();
@@ -1522,8 +1522,8 @@ describe("AccountPage states", () => {
.toBeVisible();
expect(screen.queryByText("Вторая")).not.toBeInTheDocument();
fireEvent.click(screen.getByRole("tab", { name: "Операции" }));
expect(screen.getByText("Последних событий пока нет.")).toBeVisible();
fireEvent.click(screen.getByRole("tab", { name: "История операций" }));
expect(screen.getByText("Последних операций пока нет.")).toBeVisible();
});
it("links operation, event and income previews to their detail pages", () => {
@@ -1538,8 +1538,8 @@ describe("AccountPage states", () => {
);
for (const [tab, href] of [
["Операции", "/accounts/account-1/operations"],
["События", "/accounts/account-1/events"],
["История операций", "/accounts/account-1/operations"],
["Предстоящие события", "/accounts/account-1/events"],
["Доход", "/accounts/account-1/income"],
]) {
fireEvent.click(screen.getByRole("tab", { name: tab }));
+1 -1
View File
@@ -351,7 +351,7 @@ describe("bond page", () => {
screen.queryByRole("heading", { name: "Моя позиция" }),
).not.toBeInTheDocument();
expect(
screen.getByRole("heading", { name: "Моя история событий" }),
screen.getByRole("heading", { name: "История операций" }),
).toBeVisible();
});
it(
@@ -490,7 +490,7 @@ describe("stock page", () => {
fireEvent.click(screen.getByRole("button", { name: "Далее" }));
controls.recoverOperations();
expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument();
expect(screen.getByRole("heading", { name: "Моя история событий" })).toBeVisible();
expect(screen.getByRole("heading", { name: "История операций" })).toBeVisible();
},
);
it("keeps the last quote without manual refresh", async () => {
+25 -25
View File
@@ -274,7 +274,7 @@ const ru = {
COUPON_TYPE_VARIABLE: "Переменный",
},
couponWindow:
"Календарь выпуска с {{from}} по {{to}}. Личные зачисления показаны в истории событий.",
"Календарь выпуска с {{from}} по {{to}}. Полученные выплаты показаны в истории операций.",
couponYield: "Текущая купонная доходность, годовых",
couponYieldNote:
"Купонная доходность = ближайший купон × 365 / дней в купонном периоде / цена без НКД × 100 %. Это годовая оценка при сохранении размера купона и номинала, без налогов, комиссий и реинвестирования; для плавающего или переменного купона будущий доход изменится.",
@@ -343,10 +343,10 @@ const ru = {
breadcrumbs: {
accountFallback: "Счет",
accounts: "Брокерские счета",
events: "Будущие события",
events: "Предстоящие события",
income: "Пассивный доход",
label: "Хлебные крошки",
operations: "Операции",
operations: "История операций",
settings: "Настройки",
},
entryGroup: {
@@ -356,20 +356,20 @@ const ru = {
dateKind: { event: "Дата события", registry: "Дата реестра" },
emptyText:
"Доступные источники не сообщили о купонах, дивидендах, погашениях или офертах в этом периоде.",
emptyTitle: "За выбранный период событий не найдено",
errorText: "Попробуйте запросить прогноз еще раз.",
errorTitle: "Не удалось загрузить будущие события",
emptyTitle: "На выбранный период предстоящих событий не найдено",
errorText: "Попробуйте загрузить предстоящие события ещё раз.",
errorTitle: "Не удалось загрузить предстоящие события",
forecastWindow: "Прогноз от {{date}} на {{from}} – {{to}}",
hint: "Прогноз рассчитан по текущей позиции до налогов. Покрытие зависит от доступных данных MOEX.",
noAmount: "Сумма неизвестна",
open: "Открыть будущие события",
open: "Открыть предстоящие события",
projectedAmount: "Ожидаемая сумма",
recentEmpty: "На ближайшие 30 дней событий не найдено.",
recentError: "Не удалось загрузить будущие события.",
recentLoading: "Загрузка будущих событий",
recentTitle: "Будущие события",
recentEmpty: "На ближайшие 30 дней предстоящих событий не найдено.",
recentError: "Не удалось загрузить предстоящие события.",
recentLoading: "Загрузка предстоящих событий",
recentTitle: "Предстоящие события",
retry: "Повторить",
title: "Будущие события",
title: "Предстоящие события",
type: {
coupon: "Купон",
dividend: "Дивиденд",
@@ -451,14 +451,14 @@ const ru = {
dividend: "Дивиденд",
},
},
errorText: "Попробуйте запросить операции еще раз.",
errorTitle: "Не удалось загрузить журнал",
errorText: "Попробуйте загрузить историю операций ещё раз.",
errorTitle: "Не удалось загрузить историю операций",
from: "С",
next: "Далее",
noInstrument: "Без инструмента",
noMoney: "Без движения денег",
occurredAt: "Исполнено {{date}}",
open: "Открыть журнал",
open: "Открыть историю операций",
operationType: {
buy: "Покупка",
coupon: "Купон",
@@ -475,13 +475,13 @@ const ru = {
previous: "Назад",
price: "Цена: {{value}}",
quantity: "{{value}} шт.",
recentEmpty: "Последних событий пока нет.",
recentError: "Не удалось загрузить последние события.",
recentLoading: "Загрузка последних событий",
recentTitle: "Последние события",
recentEmpty: "Последних операций пока нет.",
recentError: "Не удалось загрузить последние операции.",
recentLoading: "Загрузка последних операций",
recentTitle: "Последние операции",
reset: "Сбросить",
retry: "Повторить",
title: "Журнал операций",
title: "История операций",
to: "По",
},
navigation: {
@@ -582,9 +582,9 @@ const ru = {
},
tabs: {
cash: "Деньги",
events: "События",
events: "Предстоящие события",
income: "Доход",
operations: "Операции",
operations: "История операций",
positions: "Позиции",
},
title: "Портфель",
@@ -637,10 +637,10 @@ const ru = {
dividendNote:
"Личная сумма — оценка по текущему количеству, не гарантия выплаты. Налоги не сопоставлены; дата выплаты компании может отличаться от дня зачисления на ваш счёт.",
dividendWindow:
"События компании с {{from}} по {{to}}. Личные зачисления показаны отдельно в истории событий.",
"События компании с {{from}} по {{to}}. Полученные выплаты показаны отдельно в истории операций.",
estimateUnavailable:
"Данные позиции не удалось обновить. Личная оценка недоступна или рассчитана по сохранённой позиции.",
eventFilter: "Фильтр событий",
eventFilter: "Фильтр операций",
eventPrice: "Цена: {{value}}",
eventQuantity: "{{value}} шт.",
exchanges: {
@@ -656,7 +656,7 @@ const ru = {
trades: "Сделки",
},
forming: "Формируется",
history: "Моя история событий",
history: "История операций",
historyNote:
"Операции по этой акции на доступных открытых счетах, включая периоды до текущего года. Дата сделки — дата операции брокера; количество — исполненная часть. История закрытых счетов не включена.",
incomplete: "Последняя свеча ещё формируется: её цена может измениться.",