aurora-1589, исправление расхождения с макетом

This commit is contained in:
Grog 2026-10-30 10:26:31 +03:00
parent 65c44978bd
commit 0cb395f5e7
26 changed files with 129 additions and 23 deletions

View File

@ -5,3 +5,43 @@
box-shadow: inset 0 0 0 1px #2ea64b38 !important;
border-radius: 999px !important;
}
/* кастомные стили для модального окна */
.ant-modal-container{
padding: 0 !important;
}
.ant-modal-header, .ant-modal-body, .ant-modal-footer{
padding: 16px !important;
}
.ant-modal-header{
border-bottom: 1px solid #f0f0f0 !important;
}
.ant-modal-close{
padding: 4px !important;
}
/* */
/* стили кастомного сегмента */
.customSegment .ant-segmented-item{
margin-right: 8px;
padding: 5px 8px;
}
.customSegment .ant-segmented-item-selected {
background-color: #ecfdf3 !important;
color: #1f5f35 !important;
box-shadow: inset 0 0 0 1px #2ea64b38 !important;
}
.customSegment .ant-segmented-thumb {
background-color: #ecfdf3 !important;
box-shadow: inset 0 0 0 1px #2ea64b38 !important;
}
.customSegment .ant-segmented-item:focus-visible {
outline: none !important;
}
/* */

View File

@ -0,0 +1,5 @@
import { CloseOutlined } from '@ant-design/icons';
export default function CustomModalCloseIcon() {
return <CloseOutlined style={{ border: '1px solid #d0d5dd', borderRadius: '8px', padding: 4 }} />;
}

View File

@ -55,7 +55,7 @@ export function DataTable<T extends Record<string, any>>({
const opts: FilterOption[] = [];
for (const r of allRows) {
const v = r[key];
if (!seen.has(v)) {
if (!seen.has(v) && v) {
seen.add(v);
opts.push({ label: String(v), value: v });
}

View File

@ -92,6 +92,7 @@ export function ConsolidationPage() {
display: 'flex',
flexDirection: 'column',
minHeight: 0,
borderRadius:12
}}>
{/* после «Взять в работу» перечитываем и панель «Организации»: в ней «Ответственный» */}
<ConsoleTableWidget onVersionLocked={() => setReloadKey((k) => k + 1)} />
@ -106,6 +107,7 @@ export function ConsolidationPage() {
display: 'flex',
flexDirection: 'column',
minHeight: 0,
borderRadius:12
}}>
<ConsoleLegalEntitiesTable reloadKey={reloadKey} onDrawerOpen={setPanelEntity} />
</div>

View File

@ -3,6 +3,7 @@ import { useRef, useState } from 'react';
import { ApiError, api } from '../../api/client';
import type { AdminUser, BusinessSegment, RegionalOffice, Role, UserCreate } from '../../api/types';
import { useMountedRef, useNotifyError } from './hooks';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
type Props = {
open: boolean;
@ -97,7 +98,9 @@ export function CreateUserModal({ open, roles, offices, onClose, onCreated }: Pr
confirmLoading={submitting}
cancelButtonProps={{ disabled: submitting }}
mask={{ closable: !submitting }}
centered
// форма смонтирована всегда (forceRender), поэтому её можно очистить после закрытия окна
closeIcon={<CustomModalCloseIcon />}
forceRender
afterClose={() => form.resetFields()}>
<Form<FormValues> form={form} layout='vertical' onFinish={submit} disabled={submitting}>

View File

@ -1,4 +1,5 @@
import { Modal } from 'antd';
import CustomModalCloseIcon from '../../../components/CustomModalCloseIcon';
type Props = {
open: boolean;
@ -19,7 +20,8 @@ export const ArchiveCompanyGroupModal: React.FC<Props> = ({ open, onCancel, onOk
cancelText='Отмена'
okButtonProps={isArchived ? undefined : { danger: true }}
confirmLoading={loading}
centered>
centered
closeIcon={<CustomModalCloseIcon/>}>
<p style={{ margin: 0, color: '#595959' }}>
{isArchived ? 'Группа компаний вернётся из архива в список действующих.' : 'Группа компаний будет перенесена в архив.'}
</p>

View File

@ -7,6 +7,7 @@ import { fetchOneCompanyGroup } from '../../../services/api/directories/company_
import type { CompanyGroupFormProps } from '../../../types/companyGroups/companyGroups';
import { useNotificationApi } from '../../../utils/useNotification';
import { loadOffices } from '../../Admin/UsersTable';
import CustomModalCloseIcon from '../../../components/CustomModalCloseIcon';
type Props = {
open: boolean;
@ -109,7 +110,9 @@ export const CompanyGroupForm: React.FC<Props> = ({ open, onCancel, onOk, compan
destroyOnHidden
loading={initialDataLoading}
confirmLoading={confirmLoading}
width={720}>
width={720}
centered
closeIcon={<CustomModalCloseIcon/>}>
<Form form={form} layout='vertical'>
<Form.Item name='name' label='Название ГК' rules={[{ required: true, message: 'Укажите название ГК' }]}>
<Input placeholder='Например: Агроком' />

View File

@ -9,6 +9,7 @@ import type { RelatedGroupOut } from '../../../types/api';
import type { CatalogueJurFormProps } from '../../../types/catalogueJur/catalogueJur';
import { useNotificationApi } from '../../../utils/useNotification';
import { loadOffices } from '../../Admin/UsersTable';
import CustomModalCloseIcon from '../../../components/CustomModalCloseIcon';
type Props = {
open: boolean;
@ -163,7 +164,9 @@ export const CatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, jurId
destroyOnHidden
width={720}
confirmLoading={confirmLoading}
loading={initialDataLoading}>
loading={initialDataLoading}
centered
closeIcon={<CustomModalCloseIcon/>}>
<Form form={form} layout='vertical'>
<Row gutter={16}>
<Col span={6}>

View File

@ -9,6 +9,7 @@ import { getCompanyGroupsThunk } from '../../../store/slices/companyGroupsSlice/
import { useAppDispatch, useAppSelector } from '../../../store/store';
import type { MoveCatalogueJurProps } from '../../../types/catalogueJur/catalogueJur';
import { useNotificationApi } from '../../../utils/useNotification';
import CustomModalCloseIcon from '../../../components/CustomModalCloseIcon';
type FormValues = {
name: string;
@ -94,7 +95,9 @@ export const MoveCatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk, ju
cancelText='Отмена'
destroyOnHidden
loading={initialDataLoading}
confirmLoading={confirmLoading}>
confirmLoading={confirmLoading}
centered
closeIcon={<CustomModalCloseIcon/>}>
<Form form={form} layout='vertical'>
<FormItem name='name' label='ЮЛ'>
<Input disabled />

View File

@ -8,6 +8,7 @@ import { ApiError } from '../../../api/client';
import { fetchOneCatalogueJur } from '../../../services/api/directories/catalogue_jur';
import type { WithdrawCatalogueJurProps } from '../../../types/catalogueJur/catalogueJur';
import { useNotificationApi } from '../../../utils/useNotification';
import CustomModalCloseIcon from '../../../components/CustomModalCloseIcon';
interface FormValues extends WithdrawCatalogueJurProps {
name: string;
@ -87,7 +88,8 @@ export const WithdrawCatalogueJurForm: React.FC<Props> = ({ open, onCancel, onOk
destroyOnHidden
loading={initialDataLoading}
confirmLoading={confirmLoading}
okButtonProps={{ danger: true }}>
okButtonProps={{ danger: true }}
centered closeIcon={<CustomModalCloseIcon/>}>
<Form form={form} layout='vertical'>
<FormItem name='name' label='ЮЛ'>
<Input disabled />

View File

@ -5,6 +5,7 @@ import { ApiError } from '../../api/client';
import { getChecklist } from '../../services/api/consolidations';
import type { ChecklistBackendShape, IVersionCard } from '../../types/consolidations/version_members';
import { buildChecklistColumns, buildChecklistRows, getMarksItems } from './checklist_utils';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
type ChecklistProps = {
open: boolean;
@ -34,11 +35,13 @@ export default function ChecklistModal({ open, onDownload, consolidationData, on
onCancel={onClose}
title='Чеклист'
destroyOnHidden
centered
onOk={() => {
onDownload();
onClose();
}}
okText='Скачать чек-лист'
closeIcon={<CustomModalCloseIcon />}
okButtonProps={{ icon: <DownloadOutlined /> }}>
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>
{getMarksItems()}

View File

@ -98,6 +98,7 @@ export function ConsoleLegalEntitiesTable({ onDrawerOpen, reloadKey }: { onDrawe
color: '#667085',
justifyContent: 'center',
borderTop: '1px solid #f1f5f9',
borderRadius:12,
}}>
Выберите консолидацию выше
</div>

View File

@ -112,7 +112,7 @@ export function buildChecklistColumns(checklistData: ChecklistBackendShape): Tab
</h5>
),
},
{ key: 'balance', dataIndex: 'balance', title: 'БУХ.БАЛАНС', render: (v: FileStatus) => mapStatus(v) },
{ key: 'balance', dataIndex: 'balance', title: 'БУХ. БАЛАНС', render: (v: FileStatus) => mapStatus(v) },
{ key: 'ofr', dataIndex: 'ofr', title: 'ОФР', render: (v: FileStatus) => mapStatus(v) },
{
key: 'osv',

View File

@ -38,7 +38,7 @@ export const membersConfig: TableConfig<MemberRow> = {
{
key: 'bb_status',
title: 'Бух.баланс',
title: 'Бух. баланс',
features: { multiselect: true },
render: (v) => <StatusTag status={v as FileRussianStatus | undefined} />,
},

View File

@ -6,6 +6,7 @@ import { getVersionCard, lockVersion } from '../../services/api/consolidations';
import type { LockOut } from '../../types/consolidations/common_types';
import { MAX_REASON_LENGTH, endSentence, isValidReason } from '../../utils/consolidations';
import { quarterShortLabel } from '../../utils/labels';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
type LockModalProps = {
versionId: string | null;
@ -114,7 +115,8 @@ export default function LockModal({ versionId, open, onOpenChange, currentUserId
confirmLoading={submitting}
cancelText='Отмена'
onOk={handleOk}
cancelButtonProps={{ disabled: submitting }}>
cancelButtonProps={{ disabled: submitting }}
closeIcon={<CustomModalCloseIcon />}>
{loading && <Skeleton active paragraph={{ rows: 2 }} />}
{!loading && loadError && (

View File

@ -19,6 +19,7 @@ import {
mapResultText,
pairCandidateRows,
} from './counterpartyMapping';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
const SEARCH_DELAY_MS = 300;
@ -229,6 +230,8 @@ export function CounterpartyMapModal({ versionId, row, onClose, onMapped, pairTa
width={1040}
footer={null}
onCancel={onClose}
centered
closeIcon={<CustomModalCloseIcon />}
title={
<>
Выбор организации для связи с <span style={{ color: TITLE_COLOR }}>{sourceName}</span>

View File

@ -13,6 +13,7 @@ import {
resolveLeaveAfterFetch,
} from '../../utils/consolidations';
import { pairsViewSearch } from './counterPairs';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
const TAB_CONFIG = [
{ key: 'osv', label: 'ОСВ' },
@ -149,10 +150,11 @@ export function OsvTabs({ summary, versionId, status }: Props) {
return (
<>
<Segmented
className='customSegment'
value={activeKey}
onChange={handleTabChange}
disabled={checking}
style={{ alignSelf: 'flex-start', maxWidth: '100%', overflowX: 'auto' }}
style={{ alignSelf: 'flex-start', maxWidth: '100%', overflowX: 'auto', background: '#f1f3f4' }}
options={options}
/>
<CounterPairsModal
@ -200,6 +202,7 @@ export function CounterPairsModal({
title='Проверьте встречные записи участников'
centered
onCancel={onStay}
closeIcon={<CustomModalCloseIcon />}
footer={[
<Button key='show' onClick={onShow}>
Показать пары
@ -212,7 +215,9 @@ export function CounterPairsModal({
</Button>,
]}>
<div style={{ display: 'flex', gap: 12, alignItems: 'flex-start' }}>
<WarningOutlined style={{ color: '#dc6803', fontSize: 20, marginTop: 2 }} />
<WarningOutlined
style={{ background: '#fff4e5', color: '#dc6803', fontSize: 20, marginTop: 2, padding: 10, borderRadius: '50%' }}
/>
<div>
<div style={{ fontWeight: 600 }}>{headline}</div>
<div style={{ color: '#667085' }}>{details}</div>

View File

@ -3,6 +3,7 @@ import { Modal } from 'antd';
import type React from 'react';
import type { CreateEntityKind } from '../../types/relatedGroup/relatedGroup';
import './CreateEntityPickerModal.css';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
type Option = {
key: CreateEntityKind;
title: string;
@ -52,14 +53,7 @@ export const CreateEntityPickerModal: React.FC<Props> = ({ open, onCancel, onSel
footer={null}
centered
destroyOnHidden
styles={{
header: {
borderBottom: '1px solid #f0f0f0',
paddingBottom: 16,
marginBottom: 0,
},
body: { paddingTop: 16, paddingBottom: 16 },
}}>
closeIcon={<CustomModalCloseIcon />}>
<div className='options'>
{OPTIONS.map((opt) => (
<button key={opt.key} type='button' className='optionCard' onClick={() => onSelect(opt.key)}>

View File

@ -2,6 +2,7 @@ import { Alert, Button, Input, Modal, Space, Tooltip, Typography } from 'antd';
import { useState } from 'react';
import type { ChecksOut, FailedCheckOut } from '../../types/api';
import { expectedActualText, failureKey, failureText } from './checkText';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
type Props = {
checks: ChecksOut;
@ -93,6 +94,9 @@ export function ChecksPanel({ checks, editable, dirty, onAccept, onShow }: Props
okText='Принять'
cancelText='Отмена'
confirmLoading={saving}
centered
closeIcon={<CustomModalCloseIcon />}
okButtonProps={{ disabled: comment.trim().length === 0 }}
onOk={submit}
onCancel={() => setOpen(false)}>

View File

@ -3,6 +3,7 @@ import { type ReactNode, useState } from 'react';
import { ApiError } from '../../api/client';
import { removeFile } from '../../services/api/files';
import type { DocumentRow } from './documentRows';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
const { Text } = Typography;
@ -56,7 +57,14 @@ export default function DeleteReasonModal({ targetRow, open, onCancel, onDelete,
}
};
return (
<Modal title='Удаление документа' open={open} onCancel={onCancel} footer={null} destroyOnHidden>
<Modal
closeIcon={<CustomModalCloseIcon />}
centered
title='Удаление документа'
open={open}
onCancel={onCancel}
footer={null}
destroyOnHidden>
<div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
<p style={{ color: '#667085', margin: 0 }}>Выберите причину удаления документа «{targetRow.name}»</p>
<p style={{ color: 'red', fontSize: 11, margin: 0 }}>Будет удален/заменён сам файл и все его документы</p>

View File

@ -1,6 +1,7 @@
import { FileAddOutlined, UploadOutlined } from '@ant-design/icons';
import { Button, Input, Modal, Upload } from 'antd';
import { useEffect, useState } from 'react';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
const { Dragger } = Upload;
@ -36,6 +37,9 @@ export default function ReplaceDocModal({ open, docName, organizationName, submi
icon: <UploadOutlined />,
disabled: file === null || reason.trim().length === 0,
}}
closeIcon={<CustomModalCloseIcon />}
centered
confirmLoading={submitting}>
<div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
{organizationName && <span>{organizationName}</span>}

View File

@ -4,6 +4,7 @@ import type { UploadFile } from 'antd/es/upload/interface';
import { useState } from 'react';
import { ApiError } from '../../api/client';
import { summarizeUpload, uploadFiles } from '../../services/api/files';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
type Props = {
legalEntityId: string;
@ -59,6 +60,9 @@ export function UploadDocumentsModal({ legalEntityId, consolidationId, organizat
disabled: !summary && fileList.length === 0,
style: { background: summary || fileList.length > 0 ? '#237804' : undefined },
}}
closeIcon={<CustomModalCloseIcon />}
centered
cancelText='Отмена'
confirmLoading={uploading}
closable={!uploading}

View File

@ -11,6 +11,7 @@ import type { ConsolidationCreate, LegalEntityBrief, Quarter, RelatedGroupOut }
import { MIN_PERIMETER } from '../../utils/consolidations';
import { CompanyMultiSelect } from './CompanyOptionRow';
import { membersFirst, preselectMembers } from './preselect';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
type Props = {
open: boolean;
@ -156,7 +157,10 @@ export const NewConsolidationModal: React.FC<Props> = ({ open, onCancel, onOk })
cancelText='Отмена'
confirmLoading={submitting}
destroyOnHidden
width={640}>
width={640}
centered
closeIcon={<CustomModalCloseIcon />}
>
<Form form={form} requiredMark={false} layout='vertical' preserve={false} initialValues={{ legal_entity_ids: [] }}>
<Row gutter={16}>
<Col span={12}>

View File

@ -1,4 +1,5 @@
import { Modal } from 'antd';
import CustomModalCloseIcon from '../../../components/CustomModalCloseIcon';
type Props = {
open: boolean;
@ -19,6 +20,8 @@ export const DeleteRelatedGroupModal: React.FC<Props> = ({ open, onCancel, onOk,
cancelText='Отмена'
okButtonProps={{ danger: true }}
confirmLoading={loading}
closeIcon={<CustomModalCloseIcon />}
centered>
<p style={{ margin: 0, color: '#595959' }}>Группа связанных {kind === 'gsk' ? 'компаний' : 'заёмщиков'} будет удалена.</p>
</Modal>

View File

@ -9,6 +9,7 @@ import { getCompanyGroupsThunk } from '../../../store/slices/companyGroupsSlice/
import { useAppDispatch, useAppSelector } from '../../../store/store';
import type { RelatedGroupFormType } from '../../../types/relatedGroup/relatedGroup';
import { useNotificationApi } from '../../../utils/useNotification';
import CustomModalCloseIcon from '../../../components/CustomModalCloseIcon';
type Props = {
open: boolean;
@ -108,7 +109,11 @@ export const RelatedGroupForm: React.FC<Props> = ({ open, onCancel, onOk, relate
cancelText='Отмена'
destroyOnHidden
loading={initialDataLoading}
confirmLoading={confirmLoading}>
confirmLoading={confirmLoading}
closeIcon={<CustomModalCloseIcon />}
centered
>
<Form form={form} layout='vertical'>
<FormItem name='crm_id' label='ID в CRM'>
<Input />

View File

@ -9,6 +9,7 @@ import type { ConsStatus } from '../../types/consolidations/common_types';
import type { VersionCard } from '../../types/consolidations/version_members';
import { CONS_STATUS_LABEL, MAX_REASON_LENGTH, canSubmitStatusChange, manualTransitions } from '../../utils/consolidations';
import { statusColorMapping } from '../ConsoleTable/consts';
import CustomModalCloseIcon from '../../components/CustomModalCloseIcon';
type StatusModalProps = {
open: boolean;
@ -63,7 +64,9 @@ export default function ChangeStatusModal({ open, card, onClose, onSuccess }: St
confirmLoading={submitting}
onOk={handleOk}
onCancel={() => !submitting && onClose()}
destroyOnHidden>
destroyOnHidden
centered
closeIcon={<CustomModalCloseIcon/>}>
<div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>
<span style={{ color: '#667085' }}>Текущий этап</span>
<TableTag text={currentLabel} {...statusColorMapping[currentLabel]} />