fix: open report cards in the same tab
Clicking a report card or "create from this report" now switches to the report form inside the app instead of opening a new browser tab. Ctrl+click on the copy link still opens a new tab. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { Badge, Icon } from '@tnsu/ui-kit';
|
import { Badge, Icon } from '@tnsu/ui-kit';
|
||||||
import { useRouter } from '../../app/routing/RouterContext';
|
import { useRouter } from '../../app/routing/RouterContext';
|
||||||
|
import { IRoute } from '../../app/routing/routes';
|
||||||
import { IReportAccess, IReportCard } from './reportsTypes';
|
import { IReportAccess, IReportCard } from './reportsTypes';
|
||||||
import { canCreateReport, canDeleteReport } from './reportsRules';
|
import { canCreateReport, canDeleteReport } from './reportsRules';
|
||||||
import { REPORTS_TEXTS } from './texts';
|
import { REPORTS_TEXTS } from './texts';
|
||||||
@@ -17,16 +18,26 @@ interface Props {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Карточка отчёта. Отчёт и «Создать на основе» открываются в новой вкладке — как в старом
|
* Карточка отчёта. Отчёт и «Создать на основе» открываются в этой же вкладке — переходом
|
||||||
* web part (window.open … '_blank'), но адрес теперь — раздел формы отчёта этого приложения.
|
* на раздел формы отчёта без перезагрузки страницы.
|
||||||
*/
|
*/
|
||||||
export const ReportCard: React.FC<Props> = ({ report, access, projectId, onDelete }) => {
|
export const ReportCard: React.FC<Props> = ({ report, access, projectId, onDelete }) => {
|
||||||
const { buildHref } = useRouter();
|
const { navigate, buildHref } = useRouter();
|
||||||
const reportHref = buildHref({ page: 'report', projectId, reportId: report.id });
|
const reportRoute: IRoute = { page: 'report', projectId, reportId: report.id };
|
||||||
const copyHref = buildHref({ page: 'report', projectId, copyFromId: report.id });
|
const copyRoute: IRoute = { page: 'report', projectId, copyFromId: report.id };
|
||||||
|
|
||||||
const openReport = (): void => {
|
const openReport = (): void => {
|
||||||
window.open(reportHref, '_blank', 'noopener,noreferrer');
|
navigate(reportRoute);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Ссылка остаётся настоящим <a href>, чтобы Ctrl+клик / средняя кнопка по-прежнему
|
||||||
|
// открывали копию в новой вкладке; обычный клик — переход внутри приложения.
|
||||||
|
const onCopyClick = (event: React.MouseEvent<HTMLAnchorElement>): void => {
|
||||||
|
event.stopPropagation();
|
||||||
|
const opensNewTab = event.ctrlKey || event.metaKey || event.shiftKey || event.button !== 0;
|
||||||
|
if (opensNewTab) return;
|
||||||
|
event.preventDefault();
|
||||||
|
navigate(copyRoute);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Как в старом коде: Enter/Space внутри карточки (в том числе на её кнопках) открывают отчёт.
|
// Как в старом коде: Enter/Space внутри карточки (в том числе на её кнопках) открывают отчёт.
|
||||||
@@ -65,12 +76,10 @@ export const ReportCard: React.FC<Props> = ({ report, access, projectId, onDelet
|
|||||||
{canCreateReport(access) && (
|
{canCreateReport(access) && (
|
||||||
<a
|
<a
|
||||||
className={styles.cardAction}
|
className={styles.cardAction}
|
||||||
href={copyHref}
|
href={buildHref(copyRoute)}
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
title={TEXTS.copyTitle(report.number)}
|
title={TEXTS.copyTitle(report.number)}
|
||||||
aria-label={TEXTS.copyAriaLabel}
|
aria-label={TEXTS.copyAriaLabel}
|
||||||
onClick={(event) => event.stopPropagation()}
|
onClick={onCopyClick}
|
||||||
>
|
>
|
||||||
<Icon name="copy" size="sm" />
|
<Icon name="copy" size="sm" />
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user