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);
}}
/>
Проектная таблица
>
);
}