aurora-1544 добавление таблицы гудвил #220

Merged
aep merged 18 commits from feat/goodWill into main 2026-11-06 18:08:01 +03:00
10 changed files with 22 additions and 84 deletions
Showing only changes of commit db8641a1a8 - Show all commits

View File

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

View File

@ -18,7 +18,6 @@ type Props = {
jurId?: string;
};
// Ошибки сервера, относящиеся к одному полю, показываем у этого поля
const FIELD_BY_ERROR_CODE: Record<string, keyof CatalogueJurFormProps> = {
INN_EXISTS: '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);
} catch (e) {
if (e instanceof ApiError) {
notification.error({ description: e.message });
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получнии данных' });
} finally {
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 });
setOfficesOptions(options);
} catch (e) {
if (e instanceof ApiError) {
notification.error({ description: e.message });
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получения офисов рф' });
} finally {
setLoadingOfficesOptions(false);
}
@ -101,9 +96,7 @@ export const CatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, jurId
setGskData(gsks);
setGszData(gszs);
} catch (e) {
if (e instanceof ApiError) {
notification.error({ description: e.message });
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении связанных компаний' });
} finally {
setLoadingRelatedGroupsOptions(false);
}

View File

@ -3,7 +3,6 @@ import FormItem from 'antd/es/form/FormItem';
import dayjs from 'dayjs';
import type React from 'react';
import { useEffect, useState } from 'react';
import { ApiError } from '../../../api/client';
import { AppModal } from '../../../components/AppModal/AppModal';
import { fetchOneCatalogueJur } from '../../../services/api/directories/catalogue_jur';
import { getCompanyGroupsThunk } from '../../../store/slices/companyGroupsSlice/thunks';
@ -47,9 +46,7 @@ export const MoveCatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, ju
effective_date: '',
});
} catch (e) {
if (e instanceof ApiError) {
notification.error({ description: e.message });
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении данных' });
} finally {
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();
await onOk({ effective_date, company_group_id });
} catch (e) {
if (e instanceof ApiError) {
notification.error({
description: e.message,
});
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при сохранении данных' });
} finally {
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 ReactNode, useEffect, useMemo, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiError } from '../../../api/client';
import { ColumnSettings, DataTable, useFilteredRows, useTableFilters, useVisibleColumns } from '../../../components/GenericTable';
import { editCatalogueJur, moveCatalogueJur, withdrawCatalogueJur } from '../../../services/api/directories/catalogue_jur';
import { setIsGettingArchive, setRelatedGroupFilter } from '../../../store/slices/catalogueJurSlice/catalogueJurSlice';
@ -100,11 +99,7 @@ export function CatalogueJurTable({ outside_group, tabsComponent }: CatalogueJur
dispatch(getCompanyGroupsThunk());
closeMoveCatalogueJurHandler();
} catch (e) {
if (e instanceof ApiError) {
notification.error({
description: e.message,
});
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при перемещении ЮЛ в другую ГК' });
}
}
async function withdrawCatalogueJurHandler(values: WithdrawCatalogueJurProps) {
@ -115,11 +110,7 @@ export function CatalogueJurTable({ outside_group, tabsComponent }: CatalogueJur
closeWithdrawCatalogueJurHandler();
} catch (e) {
if (e instanceof ApiError) {
notification.error({
description: e.message,
});
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при выводе ЮЛ из ГК' });
}
}
@ -130,7 +121,6 @@ export function CatalogueJurTable({ outside_group, tabsComponent }: CatalogueJur
}
useEffect(() => {
// «ЮЛ вне ГК» грузится без выбранной ГК; список ГК — только по выбранной (без неё запрос ушёл бы по всем ГК)
if (outside_group || activeCompanyGroup?.id) {
getCatalogueJur();
}

View File

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

View File

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

View File

@ -2,7 +2,6 @@ import { DownloadOutlined, EditOutlined, FullscreenExitOutlined, FullscreenOutli
import { Alert, Button, ConfigProvider, Select, Space, Tooltip } from 'antd';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useParams } from 'react-router-dom';
import { ApiError } from '../../../api/client';
import { ConsolidationFormatTableFilter } from '../../../components/ConsolidationFormatTableFilter/ConsolidationFormatTableFilter';
import { type ColumnDef, ColumnSettings, useVisibleColumns } from '../../../components/GenericTable';
import { exportGoodwillTable, fetchGoodwillTable, saveGoodwillRow } from '../../../services/api/goodwill';
@ -191,7 +190,7 @@ export const GoodwillContent = ({ card }: { card: VersionCard | null }) => {
setFullscreen(false);
}
} catch (e) {
notification.error({ description: e instanceof Error ? e.message : 'Ошибка' });
notification.error({ description: e instanceof Error ? e.message : 'Ошибка раскрытия на весь экран' });
}
};

Сейчас ошибка будет отображаться, только в случае e instanceof ApiError. Во всех остальных случаях пользователь не увидит никакого уведомления.

Предлагаю заменить на:
notification.error({ description: e instanceof ApiError ? e.message : 'Не удалось загрузить данные Гудвилла' });

Аналогично стоит обрабатывать остальные вызовы notification.error в handleSave и download

Сейчас ошибка будет отображаться, только в случае `e instanceof ApiError`. Во всех остальных случаях пользователь не увидит никакого уведомления. Предлагаю заменить на: `notification.error({ description: e instanceof ApiError ? e.message : 'Не удалось загрузить данные Гудвилла' });` Аналогично стоит обрабатывать остальные вызовы `notification.error` в `handleSave` и `download`
@ -219,9 +218,7 @@ export const GoodwillContent = ({ card }: { card: VersionCard | null }) => {
});
setEditedRows(initialEdited);
} catch (e) {
if (e instanceof ApiError) {
notification.error({ description: e.message });
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при загрузке данных' });
} finally {
setLoading(false);
}
@ -253,9 +250,7 @@ export const GoodwillContent = ({ card }: { card: VersionCard | null }) => {
setIsEditMode(false);
loadData(version_id);
} catch (e) {
if (e instanceof ApiError) {
notification.error({ description: e.message });
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при сохранении данных' });
} finally {
setSaving(false);
}
@ -270,9 +265,7 @@ export const GoodwillContent = ({ card }: { card: VersionCard | null }) => {
const { blob, filename } = await exportGoodwillTable(version_id);
saveBlob(blob, filename ?? xlsxFilename('Гудвил', versionInfo));
} catch (e) {
if (e instanceof ApiError) {
notification.error({ description: e.message });
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при экспорте таблицы' });
} finally {
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,
});
} catch (e) {
if (e instanceof ApiError) {
notification.error({ description: e.message });
}
notification.error({ description: e instanceof Error ? e.message : 'Ошибка при получении данных' });
} finally {
setInitialDataLoading(false);
}

View File

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