обновленна логика отображения ошибок сервера

This commit is contained in:
Grog 2026-11-06 08:37:53 +03:00
parent 446cd583d5
commit db8641a1a8
10 changed files with 22 additions and 84 deletions

View File

@ -1,7 +1,6 @@
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import { Button, Empty, Space } from 'antd'; import { Button, Empty, Space } from 'antd';
import { useEffect, useMemo, useState } from 'react'; import { useEffect, useMemo, useState } from 'react';
import { ApiError } from '../api/client';
import PageTitle from '../components/PageTitle'; import PageTitle from '../components/PageTitle';
import { createCatalogueJur } from '../services/api/directories/catalogue_jur'; import { createCatalogueJur } from '../services/api/directories/catalogue_jur';
import { import {
@ -108,11 +107,7 @@ export function CatalogueGroup() {
setCompanyGroupDeleteOpen(false); setCompanyGroupDeleteOpen(false);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Не удалось обновить компанию' });
notification.error({
description: e.message,
});
}
} finally { } finally {
setCompanyGroupDeleteLoading(false); setCompanyGroupDeleteLoading(false);
} }
@ -128,9 +123,7 @@ export function CatalogueGroup() {
setGskData(gsks); setGskData(gsks);
setGszData(gszs); setGszData(gszs);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении связанных групп' });
notification.error({ description: e.message });
}
} finally { } finally {
setRelatedGroupLoading(false); setRelatedGroupLoading(false);
} }

View File

@ -37,9 +37,7 @@ export const CompanyGroupForm: React.FC<Props> = ({ open, onCancel, onOk, compan
base_regional_office_id: data.base_regional_office_id, base_regional_office_id: data.base_regional_office_id,
}); });
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setInitialDataLoading(false); setInitialDataLoading(false);
} }
@ -53,9 +51,7 @@ export const CompanyGroupForm: React.FC<Props> = ({ open, onCancel, onOk, compan
const options = res.map((elem) => elem && { value: elem.id, label: elem.name }); const options = res.map((elem) => elem && { value: elem.id, label: elem.name });
setOfficesOptions(options); setOfficesOptions(options);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получения региональных офисов' });
notification.error({ description: e.message });
}
} finally { } finally {
setLoadingOptions(false); setLoadingOptions(false);
} }

View File

@ -18,7 +18,6 @@ type Props = {
jurId?: string; jurId?: string;
}; };
// Ошибки сервера, относящиеся к одному полю, показываем у этого поля
const FIELD_BY_ERROR_CODE: Record<string, keyof CatalogueJurFormProps> = { const FIELD_BY_ERROR_CODE: Record<string, keyof CatalogueJurFormProps> = {
INN_EXISTS: 'inn', INN_EXISTS: 'inn',
INVALID_INN: 'inn', INVALID_INN: 'inn',
@ -61,9 +60,7 @@ export const CatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, jurId
}); });
getRelatedGroupsHandler(data.company_group_id as string); getRelatedGroupsHandler(data.company_group_id as string);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получнии данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setInitialDataLoading(false); setInitialDataLoading(false);
} }
@ -82,9 +79,7 @@ export const CatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, jurId
const options = res.map((elem) => elem && { value: elem.id, label: elem.name }); const options = res.map((elem) => elem && { value: elem.id, label: elem.name });
setOfficesOptions(options); setOfficesOptions(options);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получения офисов рф' });
notification.error({ description: e.message });
}
} finally { } finally {
setLoadingOfficesOptions(false); setLoadingOfficesOptions(false);
} }
@ -101,9 +96,7 @@ export const CatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, jurId
setGskData(gsks); setGskData(gsks);
setGszData(gszs); setGszData(gszs);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении связанных компаний' });
notification.error({ description: e.message });
}
} finally { } finally {
setLoadingRelatedGroupsOptions(false); setLoadingRelatedGroupsOptions(false);
} }

View File

@ -3,7 +3,6 @@ import FormItem from 'antd/es/form/FormItem';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import type React from 'react'; import type React from 'react';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { ApiError } from '../../../api/client';
import { AppModal } from '../../../components/AppModal/AppModal'; import { AppModal } from '../../../components/AppModal/AppModal';
import { fetchOneCatalogueJur } from '../../../services/api/directories/catalogue_jur'; import { fetchOneCatalogueJur } from '../../../services/api/directories/catalogue_jur';
import { getCompanyGroupsThunk } from '../../../store/slices/companyGroupsSlice/thunks'; import { getCompanyGroupsThunk } from '../../../store/slices/companyGroupsSlice/thunks';
@ -47,9 +46,7 @@ export const MoveCatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, ju
effective_date: '', effective_date: '',
}); });
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setInitialDataLoading(false); setInitialDataLoading(false);
} }
@ -61,11 +58,7 @@ export const MoveCatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, ju
const { effective_date, company_group_id } = await form.validateFields(); const { effective_date, company_group_id } = await form.validateFields();
await onOk({ effective_date, company_group_id }); await onOk({ effective_date, company_group_id });
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при сохранении данных' });
notification.error({
description: e.message,
});
}
} finally { } finally {
setConfirmLoading(false); setConfirmLoading(false);
} }

View File

@ -11,7 +11,6 @@ import { Alert, Button, Checkbox, Dropdown, Input, Space } from 'antd';
import type { ColumnsType } from 'antd/es/table'; import type { ColumnsType } from 'antd/es/table';
import { type ReactNode, useEffect, useMemo, useState } from 'react'; import { type ReactNode, useEffect, useMemo, useState } from 'react';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { ApiError } from '../../../api/client';
import { ColumnSettings, DataTable, useFilteredRows, useTableFilters, useVisibleColumns } from '../../../components/GenericTable'; import { ColumnSettings, DataTable, useFilteredRows, useTableFilters, useVisibleColumns } from '../../../components/GenericTable';
import { editCatalogueJur, moveCatalogueJur, withdrawCatalogueJur } from '../../../services/api/directories/catalogue_jur'; import { editCatalogueJur, moveCatalogueJur, withdrawCatalogueJur } from '../../../services/api/directories/catalogue_jur';
import { setIsGettingArchive, setRelatedGroupFilter } from '../../../store/slices/catalogueJurSlice/catalogueJurSlice'; import { setIsGettingArchive, setRelatedGroupFilter } from '../../../store/slices/catalogueJurSlice/catalogueJurSlice';
@ -100,11 +99,7 @@ export function CatalogueJurTable({ outside_group, tabsComponent }: CatalogueJur
dispatch(getCompanyGroupsThunk()); dispatch(getCompanyGroupsThunk());
closeMoveCatalogueJurHandler(); closeMoveCatalogueJurHandler();
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при перемещении ЮЛ в другую ГК' });
notification.error({
description: e.message,
});
}
} }
} }
async function withdrawCatalogueJurHandler(values: WithdrawCatalogueJurProps) { async function withdrawCatalogueJurHandler(values: WithdrawCatalogueJurProps) {
@ -115,11 +110,7 @@ export function CatalogueJurTable({ outside_group, tabsComponent }: CatalogueJur
closeWithdrawCatalogueJurHandler(); closeWithdrawCatalogueJurHandler();
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при выводе ЮЛ из ГК' });
notification.error({
description: e.message,
});
}
} }
} }
@ -130,7 +121,6 @@ export function CatalogueJurTable({ outside_group, tabsComponent }: CatalogueJur
} }
useEffect(() => { useEffect(() => {
// «ЮЛ вне ГК» грузится без выбранной ГК; список ГК — только по выбранной (без неё запрос ушёл бы по всем ГК)
if (outside_group || activeCompanyGroup?.id) { if (outside_group || activeCompanyGroup?.id) {
getCatalogueJur(); getCatalogueJur();
} }

View File

@ -4,7 +4,6 @@ import TextArea from 'antd/es/input/TextArea';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import type React from 'react'; import type React from 'react';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { ApiError } from '../../../api/client';
import { AppModal } from '../../../components/AppModal/AppModal'; import { AppModal } from '../../../components/AppModal/AppModal';
import { fetchOneCatalogueJur } from '../../../services/api/directories/catalogue_jur'; import { fetchOneCatalogueJur } from '../../../services/api/directories/catalogue_jur';
import type { WithdrawCatalogueJurProps } from '../../../types/catalogueJur/catalogueJur'; import type { WithdrawCatalogueJurProps } from '../../../types/catalogueJur/catalogueJur';
@ -44,9 +43,7 @@ export const WithdrawCatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk
comment: '', comment: '',
}); });
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setInitialDataLoading(false); setInitialDataLoading(false);
} }
@ -58,11 +55,7 @@ export const WithdrawCatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk
const { effective_date, event, comment = '' } = await form.validateFields(); const { effective_date, event, comment = '' } = await form.validateFields();
await onOk({ effective_date, event, comment }); await onOk({ effective_date, event, comment });
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при сохранении данных' });
notification.error({
description: e.message,
});
}
} finally { } finally {
setConfirmLoading(false); setConfirmLoading(false);
} }

View File

@ -108,9 +108,7 @@ export const ChessContent = ({ card }: { card: VersionCard | null }) => {
const res = await fetchChessConsolidationsResult(vid); const res = await fetchChessConsolidationsResult(vid);
setChessResData(res); setChessResData(res);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setChessResLoading(false); setChessResLoading(false);
} }
@ -134,9 +132,7 @@ export const ChessContent = ({ card }: { card: VersionCard | null }) => {
saveBlob(blob, filename ?? xlsxFilename('Шахматка', versionInfo)); saveBlob(blob, filename ?? xlsxFilename('Шахматка', versionInfo));
} }
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при экспорте данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setMatrixExportLoading(false); setMatrixExportLoading(false);
} }
@ -150,9 +146,7 @@ export const ChessContent = ({ card }: { card: VersionCard | null }) => {
const { blob, filename } = await exportChessConsolidationsResult(version_id); const { blob, filename } = await exportChessConsolidationsResult(version_id);
saveBlob(blob, filename ?? xlsxFilename('Результирующая_таблица_ВГО', versionInfo)); saveBlob(blob, filename ?? xlsxFilename('Результирующая_таблица_ВГО', versionInfo));
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при экспорте данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setResExportLoading(false); setResExportLoading(false);
} }

View File

@ -2,7 +2,6 @@ import { DownloadOutlined, EditOutlined, FullscreenExitOutlined, FullscreenOutli
import { Alert, Button, ConfigProvider, Select, Space, Tooltip } from 'antd'; import { Alert, Button, ConfigProvider, Select, Space, Tooltip } from 'antd';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import { ApiError } from '../../../api/client';
import { ConsolidationFormatTableFilter } from '../../../components/ConsolidationFormatTableFilter/ConsolidationFormatTableFilter'; import { ConsolidationFormatTableFilter } from '../../../components/ConsolidationFormatTableFilter/ConsolidationFormatTableFilter';
import { type ColumnDef, ColumnSettings, useVisibleColumns } from '../../../components/GenericTable'; import { type ColumnDef, ColumnSettings, useVisibleColumns } from '../../../components/GenericTable';
import { exportGoodwillTable, fetchGoodwillTable, saveGoodwillRow } from '../../../services/api/goodwill'; import { exportGoodwillTable, fetchGoodwillTable, saveGoodwillRow } from '../../../services/api/goodwill';
@ -191,7 +190,7 @@ export const GoodwillContent = ({ card }: { card: VersionCard | null }) => {
setFullscreen(false); setFullscreen(false);
} }
} catch (e) { } catch (e) {
notification.error({ description: e instanceof Error ? e.message : 'Ошибка' }); notification.error({ description: e instanceof Error ? e.message : 'Ошибка раскрытия на весь экран' });
} }
}; };
@ -219,9 +218,7 @@ export const GoodwillContent = ({ card }: { card: VersionCard | null }) => {
}); });
setEditedRows(initialEdited); setEditedRows(initialEdited);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при загрузке данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setLoading(false); setLoading(false);
} }
@ -253,9 +250,7 @@ export const GoodwillContent = ({ card }: { card: VersionCard | null }) => {
setIsEditMode(false); setIsEditMode(false);
loadData(version_id); loadData(version_id);
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при сохранении данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setSaving(false); setSaving(false);
} }
@ -270,9 +265,7 @@ export const GoodwillContent = ({ card }: { card: VersionCard | null }) => {
const { blob, filename } = await exportGoodwillTable(version_id); const { blob, filename } = await exportGoodwillTable(version_id);
saveBlob(blob, filename ?? xlsxFilename('Гудвил', versionInfo)); saveBlob(blob, filename ?? xlsxFilename('Гудвил', versionInfo));
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при экспорте таблицы' });
notification.error({ description: e.message });
}
} finally { } finally {
setExportLoading(false); setExportLoading(false);
} }

View File

@ -48,9 +48,7 @@ export const RelatedGroupForm: React.FC<Props> = ({ open, onCancel, onOk, relate
company_group_id: data?.company_group_id, company_group_id: data?.company_group_id,
}); });
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении данных' });
notification.error({ description: e.message });
}
} finally { } finally {
setInitialDataLoading(false); setInitialDataLoading(false);
} }

View File

@ -2,7 +2,6 @@ import { DeleteOutlined, EditOutlined, EllipsisOutlined } from '@ant-design/icon
import { Button, Dropdown, Space } from 'antd'; import { Button, Dropdown, Space } from 'antd';
import type { ColumnsType } from 'antd/es/table'; import type { ColumnsType } from 'antd/es/table';
import { type ReactNode, useMemo, useState } from 'react'; import { type ReactNode, useMemo, useState } from 'react';
import { ApiError } from '../../../api/client';
import { ColumnSettings, DataTable, useFilteredRows, useVisibleColumns } from '../../../components/GenericTable'; import { ColumnSettings, DataTable, useFilteredRows, useVisibleColumns } from '../../../components/GenericTable';
import { useTableFilters } from '../../../components/GenericTable/useTableFilters'; import { useTableFilters } from '../../../components/GenericTable/useTableFilters';
import { deleteRelatedGroup, editRelatedGroup } from '../../../services/api/directories/related-groups'; import { deleteRelatedGroup, editRelatedGroup } from '../../../services/api/directories/related-groups';
@ -51,11 +50,7 @@ export function RelatedGroupTable({ tabsComponent, data, loading, getData, activ
setDeleteModalOpen(false); setDeleteModalOpen(false);
setGroupId(''); setGroupId('');
} catch (e) { } catch (e) {
if (e instanceof ApiError) { notification.error({ description: e instanceof Error ? e.message : 'Ошибка при удалении данных' });
notification.error({
description: e.message,
});
}
} finally { } finally {
setDeletingLoading(false); setDeletingLoading(false);
} }