diff --git a/web/src/App.css b/web/src/App.css index 606dd57..2fc3760 100644 --- a/web/src/App.css +++ b/web/src/App.css @@ -5,3 +5,24 @@ box-shadow: inset 0 0 0 1px #2ea64b38 !important; border-radius: 999px !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; +} +/* */ diff --git a/web/src/components/AppModal/AppModal.css b/web/src/components/AppModal/AppModal.css new file mode 100644 index 0000000..89f0369 --- /dev/null +++ b/web/src/components/AppModal/AppModal.css @@ -0,0 +1,19 @@ +/* кастомные стили для модального окна */ +.appModal .ant-modal-container { + padding: 0 !important; +} +.appModal .ant-modal-header, +.appModal .ant-modal-body { + padding: 16px !important; +} +.appModal .ant-modal-footer { + padding: 0px 16px 16px 16px !important; +} +.appModal .ant-modal-header { + border-bottom: 1px solid #f0f0f0 !important; +} + +.appModal .ant-modal-close { + padding: 4px !important; +} +/* */ diff --git a/web/src/components/AppModal/AppModal.tsx b/web/src/components/AppModal/AppModal.tsx new file mode 100644 index 0000000..b441009 --- /dev/null +++ b/web/src/components/AppModal/AppModal.tsx @@ -0,0 +1,13 @@ +import { Modal } from 'antd'; +import type { ModalProps } from 'antd'; +import CustomModalCloseIcon from '../CustomModalCloseIcon'; +import './AppModal.css'; +export type AppModalProps = ModalProps; + +export function AppModal({ children, ...props }: AppModalProps) { + return ( + } {...props}> + {children} + + ); +} diff --git a/web/src/components/CustomModalCloseIcon.tsx b/web/src/components/CustomModalCloseIcon.tsx new file mode 100644 index 0000000..7fc1738 --- /dev/null +++ b/web/src/components/CustomModalCloseIcon.tsx @@ -0,0 +1,5 @@ +import { CloseOutlined } from '@ant-design/icons'; + +export default function CustomModalCloseIcon() { + return ; +} diff --git a/web/src/components/GenericTable/DataTable.tsx b/web/src/components/GenericTable/DataTable.tsx index a845548..81e5f98 100644 --- a/web/src/components/GenericTable/DataTable.tsx +++ b/web/src/components/GenericTable/DataTable.tsx @@ -55,7 +55,7 @@ export function DataTable>({ const opts: FilterOption[] = []; for (const r of allRows) { const v = r[key]; - if (!seen.has(v)) { + if (!seen.has(v) && v !== null && v !== undefined) { seen.add(v); opts.push({ label: String(v), value: v }); } diff --git a/web/src/layouts/ConsolidationsList.tsx b/web/src/layouts/ConsolidationsList.tsx index 4a26eee..9ea8fe4 100644 --- a/web/src/layouts/ConsolidationsList.tsx +++ b/web/src/layouts/ConsolidationsList.tsx @@ -92,6 +92,7 @@ export function ConsolidationPage() { display: 'flex', flexDirection: 'column', minHeight: 0, + borderRadius: 12, }}> {/* после «Взять в работу» перечитываем и панель «Организации»: в ней «Ответственный» */} setReloadKey((k) => k + 1)} /> @@ -106,6 +107,7 @@ export function ConsolidationPage() { display: 'flex', flexDirection: 'column', minHeight: 0, + borderRadius: 12, }}> diff --git a/web/src/widgets/Admin/CreateUserModal.tsx b/web/src/widgets/Admin/CreateUserModal.tsx index 6db7af2..e8a2b5a 100644 --- a/web/src/widgets/Admin/CreateUserModal.tsx +++ b/web/src/widgets/Admin/CreateUserModal.tsx @@ -1,7 +1,8 @@ -import { Form, Input, Modal, Select } from 'antd'; +import { Form, Input, Select } from 'antd'; import { useRef, useState } from 'react'; import { ApiError, api } from '../../api/client'; import type { AdminUser, BusinessSegment, RegionalOffice, Role, UserCreate } from '../../api/types'; +import { AppModal } from '../../components/AppModal/AppModal'; import { useMountedRef, useNotifyError } from './hooks'; type Props = { @@ -87,7 +88,7 @@ export function CreateUserModal({ open, roles, offices, onClose, onCreated }: Pr }; return ( - form.resetFields()}> form={form} layout='vertical' onFinish={submit} disabled={submitting}> @@ -136,6 +136,6 @@ export function CreateUserModal({ open, roles, offices, onClose, onCreated }: Pr /> - + ); } diff --git a/web/src/widgets/CatalogueCompanyGroup/ArchiveCompanyGroupModal/ArchiveCompanyGroupModal.tsx b/web/src/widgets/CatalogueCompanyGroup/ArchiveCompanyGroupModal/ArchiveCompanyGroupModal.tsx index 65db289..e0781ae 100644 --- a/web/src/widgets/CatalogueCompanyGroup/ArchiveCompanyGroupModal/ArchiveCompanyGroupModal.tsx +++ b/web/src/widgets/CatalogueCompanyGroup/ArchiveCompanyGroupModal/ArchiveCompanyGroupModal.tsx @@ -1,4 +1,4 @@ -import { Modal } from 'antd'; +import { AppModal } from '../../../components/AppModal/AppModal'; type Props = { open: boolean; @@ -10,7 +10,7 @@ type Props = { export const ArchiveCompanyGroupModal: React.FC = ({ open, onCancel, onOk, loading, isArchived }) => { return ( - = ({ open, onCancel, onOk okText='Подтвердить' cancelText='Отмена' okButtonProps={isArchived ? undefined : { danger: true }} - confirmLoading={loading} - centered> + confirmLoading={loading}>

{isArchived ? 'Группа компаний вернётся из архива в список действующих.' : 'Группа компаний будет перенесена в архив.'}

-
+ ); }; diff --git a/web/src/widgets/CatalogueCompanyGroup/CompanyGroupForm/CompanyGroupForm.tsx b/web/src/widgets/CatalogueCompanyGroup/CompanyGroupForm/CompanyGroupForm.tsx index 8ddd91a..fe8520a 100644 --- a/web/src/widgets/CatalogueCompanyGroup/CompanyGroupForm/CompanyGroupForm.tsx +++ b/web/src/widgets/CatalogueCompanyGroup/CompanyGroupForm/CompanyGroupForm.tsx @@ -1,8 +1,9 @@ -import { Col, Form, Input, Modal, Row, Select } from 'antd'; +import { Col, Form, Input, Row, Select } from 'antd'; import type React from 'react'; import { useEffect, useState } from 'react'; import { ApiError } from '../../../api/client'; import { useMe } from '../../../auth/useMe'; +import { AppModal } from '../../../components/AppModal/AppModal'; import { fetchOneCompanyGroup } from '../../../services/api/directories/company_groups'; import type { CompanyGroupFormProps } from '../../../types/companyGroups/companyGroups'; import { useNotificationApi } from '../../../utils/useNotification'; @@ -99,7 +100,7 @@ export const CompanyGroupForm: React.FC = ({ open, onCancel, onOk, compan }, []); return ( - = ({ open, onCancel, onOk, compan - + ); }; diff --git a/web/src/widgets/CatalogueJur/CatalogueJurForm/CatalogueJurForm.tsx b/web/src/widgets/CatalogueJur/CatalogueJurForm/CatalogueJurForm.tsx index bb98ed5..afce0b8 100644 --- a/web/src/widgets/CatalogueJur/CatalogueJurForm/CatalogueJurForm.tsx +++ b/web/src/widgets/CatalogueJur/CatalogueJurForm/CatalogueJurForm.tsx @@ -1,7 +1,8 @@ -import { Col, Form, Input, Modal, Row, Select } from 'antd'; +import { Col, Form, Input, Row, Select } from 'antd'; import type React from 'react'; import { useEffect, useMemo, useState } from 'react'; import { ApiError } from '../../../api/client'; +import { AppModal } from '../../../components/AppModal/AppModal'; import { fetchOneCatalogueJur } from '../../../services/api/directories/catalogue_jur'; import { fetchRelatedGroups } from '../../../services/api/directories/company_groups'; import { useAppSelector } from '../../../store/store'; @@ -153,7 +154,7 @@ export const CatalogueJurForm: React.FC = ({ open, onCancel, onOk, jurId }, [jurId, open]); return ( - = ({ open, onCancel, onOk, jurId - + ); }; diff --git a/web/src/widgets/CatalogueJur/CatalogueJurMoveForm/CatalogueJurMoveForm.tsx b/web/src/widgets/CatalogueJur/CatalogueJurMoveForm/CatalogueJurMoveForm.tsx index bfe6db4..cf1b1c6 100644 --- a/web/src/widgets/CatalogueJur/CatalogueJurMoveForm/CatalogueJurMoveForm.tsx +++ b/web/src/widgets/CatalogueJur/CatalogueJurMoveForm/CatalogueJurMoveForm.tsx @@ -1,9 +1,10 @@ -import { DatePicker, Form, Input, Modal, Select } from 'antd'; +import { DatePicker, Form, Input, Select } from 'antd'; 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'; import { useAppDispatch, useAppSelector } from '../../../store/store'; @@ -85,7 +86,7 @@ export const MoveCatalogueJurForm: React.FC = ({ open, onCancel, onOk, ju }, [open]); return ( - = ({ open, onCancel, onOk, ju - + ); }; diff --git a/web/src/widgets/CatalogueJur/CatalogueJurWithdrawForm/CatalogueJurWithdrawForm.tsx b/web/src/widgets/CatalogueJur/CatalogueJurWithdrawForm/CatalogueJurWithdrawForm.tsx index bd776da..c43430f 100644 --- a/web/src/widgets/CatalogueJur/CatalogueJurWithdrawForm/CatalogueJurWithdrawForm.tsx +++ b/web/src/widgets/CatalogueJur/CatalogueJurWithdrawForm/CatalogueJurWithdrawForm.tsx @@ -1,10 +1,11 @@ -import { DatePicker, Form, Input, Modal, Select } from 'antd'; +import { DatePicker, Form, Input, Select } from 'antd'; import FormItem from 'antd/es/form/FormItem'; 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'; import { useNotificationApi } from '../../../utils/useNotification'; @@ -77,7 +78,7 @@ export const WithdrawCatalogueJurForm: React.FC = ({ open, onCancel, onOk }, [open]); return ( - = ({ open, onCancel, onOk