import React, { useEffect, useMemo, useRef, useState } from "react"; import { Modal, Form, Select, Row, Col, Checkbox, Input, Empty, Spin, } from "antd"; import { fetchLegEntsByComGroup, fetchGSKByComGroup, fetchGroupMembers, } from "../../services/api/directories/company_groups"; import { useAppDispatch, useAppSelector } from "../../store/store"; import { getCompanyGroupsThunk } from "../../store/slices/companyGroupsSlice/thunks"; type FormValues = { company_group_id: string; related_group_id: string; year: number; quarter: string; // example of 2nd static field legal_entity_ids: string[]; }; type Props = { open: boolean; onCancel: () => void; onOk: (values: FormValues) => void | Promise; }; export const MyModal: React.FC = ({ open, onCancel, onOk }) => { const [form] = Form.useForm(); const dispatch = useAppDispatch(); const { raw_rows, loading } = useAppSelector((state) => state.company_groups); const [subgroups, setSubgroups] = useState([]); const [loadingSubgroups, setLoadingSubgroups] = useState(false); const subgroupReqRef = useRef(0); const [legEntities, setLegEntities] = useState([]); const [loadingEntities, setLoadingEntities] = useState(false); const legEntReqRef = useRef(0); const [legEntSearch, setLegEntSearch] = useState(""); const gskEntReqRef = useRef(0); const company_group_id = Form.useWatch("company_group_id", form); const related_group_id = Form.useWatch("related_group_id", form); const year = Form.useWatch("year", form); const semester = Form.useWatch("quarter", form); const legEntIds = Form.useWatch("legal_entity_ids", form); const quarterOptions = [ { value: "Q1", label: "1 квартал" }, { value: "Q2", label: "2 квартал" }, { value: "Q3", label: "3 квартал" }, { value: "Q4", label: "4 квартал" }, ]; useEffect(() => { if (open && raw_rows.length === 0 && !loading) { dispatch(getCompanyGroupsThunk()); } }, [open, raw_rows.length, loading, dispatch]); const isSubmitDisabled = !company_group_id || !related_group_id || !year || !semester || !legEntIds?.length; const yearOptions = useMemo(() => { const y = new Date().getFullYear(); return Array.from({ length: 4 }, (_, i) => ({ value: y - i, label: String(y - i), })); }, []); const clearLegEnts = () => { setLegEntities([]); setLoadingEntities(false); setLegEntSearch(""); legEntReqRef.current++; }; // const handleGroupChange = async (value?: string) => { // form.setFieldsValue({ // related_group_id: undefined as any, // legal_entity_ids: [], // }); // setSubgroups([]); // clearLegEnts(); // if (!value) return; // const reqId = ++subgroupReqRef.current; // setLoadingSubgroups(true); // try { // const data = await fetchGSKByComGroup(value); // if (reqId === subgroupReqRef.current) setSubgroups(data); // } finally { // if (reqId === subgroupReqRef.current) setLoadingSubgroups(false); // } // }; const handleSubGroupChange = async (value?: string) => { form.setFieldsValue({ legal_entity_ids: [] }); if (!value) return; const reqId = ++gskEntReqRef.current; setLoadingEntities(true); try { const data = await fetchGroupMembers(value); if (reqId !== gskEntReqRef.current) return; const gskEntitiesIds = new Set(data.map((c) => c.legal_entity_id)); const sorted = [...legEntities].sort((a, b) => { const a_gsk = gskEntitiesIds.has(a.id); const b_gsk = gskEntitiesIds.has(b.id); if (a_gsk !== b_gsk) return a_gsk ? -1 : 1; return a.name.localeCompare(b.name); }); setLegEntities(sorted); form.setFieldsValue({ legal_entity_ids: [...gskEntitiesIds] }); } finally { if (reqId === gskEntReqRef.current) setLoadingEntities(false); } }; const handleGroupChange = async (value?: string) => { form.setFieldsValue({ related_group_id: undefined as any, legal_entity_ids: [], }); setSubgroups([]); clearLegEnts(); if (!value) return; const reqId = ++subgroupReqRef.current; const leReqId = ++legEntReqRef.current; setLoadingSubgroups(true); setLoadingEntities(true); try { const dataSubgroups = await fetchGSKByComGroup(value); const dataLegEnts = await fetchLegEntsByComGroup(value); if (reqId === subgroupReqRef.current) setSubgroups(dataSubgroups); if (leReqId === legEntReqRef.current) setLegEntities(dataLegEnts); } finally { if (reqId === subgroupReqRef.current) setLoadingSubgroups(false); if (leReqId === legEntReqRef.current) setLoadingEntities(false); } }; const resetLocal = () => { setSubgroups([]); setLoadingSubgroups(false); subgroupReqRef.current++; clearLegEnts(); setLegEntSearch(""); }; const handleOk = async () => { try { const values = await form.validateFields(); await onOk(values); form.resetFields(); resetLocal(); } catch {} }; const handleCancel = () => { form.resetFields(); resetLocal(); onCancel(); }; const filteredLegEnts = useMemo(() => { if (!legEntSearch) return legEntities; const q = legEntSearch.toLowerCase(); return legEntities.filter((s) => s.name.toLowerCase().includes(q)); }, [legEntities, legEntSearch]); return (
(option?.label as string) ?.toLowerCase() .includes(input.toLowerCase()) } options={subgroups.map((s) => ({ value: s.id, label: s.name }))} onChange={handleSubGroupChange} /> {/* ROW 3 - full width block, only after subgroup is selected */} {related_group_id && (
setLegEntSearch(e.target.value)} style={{ marginBottom: 12 }} /> {loadingEntities ? (
) : filteredLegEnts.length === 0 ? ( ) : (
{filteredLegEnts.map((s) => (
{s.name} {s.inn}
))}
)} {!loadingEntities && legEntities.length > 0 && (
Выбрано: {legEntIds?.length ?? 0} /{" "} {legEntities.length}
)}
)}
); };