import { useEffect, useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { createPortal } from 'react-dom'; import { TablesApi } from '../api/tables'; import { TaskInfoContainer, NameTask, } from '../components/common/SwitchFormTask/SwitchFormTask.style'; import { Box, Button, CircularProgress, FormControl, FormLabel, TextField, Typography, } from '@mui/material'; import { Chip } from '../components/styles/StyledChip'; import { IconWithContent } from '../components/common/IconWithContent'; import { TableIcon } from '../components/common/icons/icons'; import Modal from '../components/common/Modal/Modal'; import { toast } from 'react-toastify'; import { FormsApi } from '../api/forms'; import SearchComponent from '../components/common/SearchComponent'; import { SettingModal as SettingStageModal } from '../components/Stages/SettingModal'; import { BackButton } from '../components/common/Buttons/BackButton'; import { CustomCheckbox } from '../components/common/StyledCheckbox'; import TableList from '../components/common/TableList/TableList'; const FormInfo = ({ form }) => { const portalContent = ( {form.title} ); const targetElement = document.getElementById('TableInfo'); if (targetElement) { return createPortal(portalContent, targetElement); } }; export default function FormPage() { const { formId } = useParams(); const id = Number(formId); const [form, setForm] = useState(null); const [tables, setTables] = useState([]); const [newTableName, setNewTableName] = useState(''); const [isLoading, setIsLoading] = useState(false); const [query, setQuery] = useState(''); const [modalOpen, setModalOpen] = useState(false); const [newTableIsProject, setNewTableIsProject] = useState(false); const [modalStageOpen, setModalStageOpen] = useState(false); const [projects, setProjects] = useState([]); useEffect(() => { if (!formId) return; const fetchProjects = async () => { try { const { success, result } = await FormsApi.getProjects(formId); success ? setProjects(result) : toast.error('Ошибка получения проекта'); } catch { toast.error('Ошибка получения проекта'); } }; fetchProjects(); }, [formId]); const handleClickCreate = () => { setModalOpen(true); }; const handleCancel = () => { setModalOpen(false); setNewTableName(''); }; const handleCreateTable = async () => { const trimmedName = newTableName.trim(); if (!trimmedName) { toast.error('Название не может быть пустым'); return; } try { let result; if (newTableIsProject) { result = await createProjectTable(trimmedName); } else { result = await TablesApi.createTemp({ name: trimmedName, form_id: id, }); } setTables((prevTables) => [...prevTables, result.result]); setNewTableName(''); setModalOpen(false); } catch (error) { const errorMessage = error.response?.data?.detail || error.message || 'Не удалось создать таблицу'; toast.error(errorMessage); } }; const createProjectTable = async (tableName) => { let project = projects[0] || null; if (!project) { const result = await createDefaultProject(); if (result && result.success) { setProjects([result.result]); project = result.result; } else { throw new Error('Не удалось создать проект'); } } return await FormsApi.createProjectTable(formId, project.id, { name: tableName, }); }; const createDefaultProject = async () => { const defaultProjectData = { name: 'Проектные таблицы', // ToDo: надо уточнить что сюда вообще пишется add_projects_data: { 'Тип проекта развития': { type: 'multiselect', options: [ 'Открытие ВСП', 'Закрытие ВСП', 'Переезд ВСП', 'Реновация РФ', 'Открытие УРМ', ], placeholder: '', defaultValue: null, }, 'Название проекта': { type: 'text', placeholder: 'Введите название проекта', defaultValue: '', }, 'Формат ВСП': { type: 'multiselect', options: [ 'Фланговый', 'Типовой', 'Розничный', 'МСБ', 'Лёгкий', 'Мини', 'Розничный-киоск', 'МБО', 'Офис самообслуживания', 'Другое', ], placeholder: '', defaultValue: null, }, 'Адрес объекта': { type: 'text', placeholder: 'Введите адрес объекта', defaultValue: '', }, 'Целевая численность, чел.': { type: 'number', placeholder: 'Введите число', defaultValue: 0, min: 0, // max: 1000000000, step: 1, }, 'Тип размещения': { type: 'multiselect', options: ['Собственность', 'Аренда', 'Субаренда'], placeholder: '', defaultValue: null, }, 'Площадь размещения, м2': { type: 'number', placeholder: 'Введите число', defaultValue: 0, min: 0, // max: 1000000000, step: 1, }, }, }; return await FormsApi.createProjects(formId, defaultProjectData); }; const loadFormTemplates = async () => { setIsLoading(true); try { const data = await FormsApi.formTablesList(id, true); setTables(data.result); } catch (error) { toast.error(error?.response?.data?.detail || 'Ошибка загрузки таблиц'); } finally { setIsLoading(false); } }; const getFormInfo = async () => { setIsLoading(true); try { const data = await FormsApi.getForm(id); setForm(data.result); } catch (error) { toast.error(error?.response?.data?.detail || 'Ошибка загрузки таблиц'); } finally { setIsLoading(false); } }; useEffect(() => { if (Number.isFinite(id)) { getFormInfo(); } }, [id]); useEffect(() => { if (form) { loadFormTemplates(); } }, [form]); // Фильтруем таблицы по query const filteredTables = tables.filter((item) => item.name?.toLowerCase().includes(query.toLowerCase()), ); if (isLoading) { return (
); } if (!form) { return ( Эта форма не существует ); } return ( <> {form && } Таблицы }> {tables.length} шт. { setModalStageOpen(false); }} formId={formId} /> } > Название таблицы setNewTableName(e.target.value)} /> { setNewTableIsProject(e.target.checked ? true : false); }} /> Проектная таблица ); }