-
Система протоколов
+
Protoc
{
{
= ({ templateData = {} }) => {
const multiSheetEngine = useMultiSheetEngine({
sheets: [
- { name: 'Report', rows: 50, cols: 20 },
- { name: 'Calculations', rows: 50, cols: 20 }
+ { name: 'Report', rows: 90, cols: 20 },
+ { name: 'Calculations', rows: 90, cols: 20 }
],
initialData: templateData || {}
});
@@ -27,7 +27,7 @@ const DualSpreadsheet: FC = ({ templateData = {} }) => {
// Объединенные состояния для обеих таблиц
const [sheetData, setSheetData] = useState>({
- report: Array(50).fill(null).map(() =>
+ report: Array(90).fill(null).map(() =>
Array(20).fill(null).map(() => ({
value: '',
isSelected: false,
@@ -35,7 +35,7 @@ const DualSpreadsheet: FC = ({ templateData = {} }) => {
templateValue: ''
}))
),
- calculations: Array(50).fill(null).map(() =>
+ calculations: Array(90).fill(null).map(() =>
Array(20).fill(null).map(() => ({
value: '',
isSelected: false,
@@ -56,7 +56,7 @@ const DualSpreadsheet: FC = ({ templateData = {} }) => {
calculations: Array(20).fill(96)
});
- const [rowHeights] = useState(Array(50).fill(32));
+ const [rowHeights] = useState(Array(90).fill(32));
// Объединенные refs
const containerRefs = useRef>({
@@ -76,8 +76,8 @@ const DualSpreadsheet: FC = ({ templateData = {} }) => {
// Инициализация refs
useEffect(() => {
- inputRefs.current.report = Array(50).fill(null).map(() => Array(20).fill(null));
- inputRefs.current.calculations = Array(50).fill(null).map(() => Array(20).fill(null));
+ inputRefs.current.report = Array(90).fill(null).map(() => Array(20).fill(null));
+ inputRefs.current.calculations = Array(90).fill(null).map(() => Array(20).fill(null));
}, []);
// Загрузка шаблонных данных
diff --git a/src/components/TemplateManager/TemplateManager.tsx b/src/components/TemplateManager/TemplateManager.tsx
index 5edcb3b..8f4dc3e 100644
--- a/src/components/TemplateManager/TemplateManager.tsx
+++ b/src/components/TemplateManager/TemplateManager.tsx
@@ -7,7 +7,6 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '../ui/dialog';
import { Input } from '../ui/input';
import { TemplateEditor } from './TemplateEditor';
-import { TemplateRenderer } from './TemplateRenderer';
interface TemplateManagerProps {
onTemplateSelect?: (template: Template) => void;
@@ -65,16 +64,6 @@ export const TemplateManager: React.FC = ({ onTemplateSele
setIsEditMode(true);
};
- if (selectedTemplate && !isEditMode) {
- return (
- setSelectedTemplate(null)}
- onEdit={() => setIsEditMode(true)}
- />
- );
- }
-
if (selectedTemplate && isEditMode) {
return (
= ({ onTemplateSele
Создать шаблон
+
Создать новый шаблон
@@ -198,7 +188,7 @@ export const TemplateManager: React.FC = ({ onTemplateSele
{template.elements.length} элементов интерфейса
- Создан: {template.createdAt.toLocaleDateString()}
+ Создан: {template.createdAt.toLocaleDateString('ru-RU')}
@@ -210,16 +200,6 @@ export const TemplateManager: React.FC = ({ onTemplateSele
>
Предпросмотр
-
diff --git a/src/components/TemplateManager/TemplateRenderer.tsx b/src/components/TemplateManager/TemplateRenderer.tsx
deleted file mode 100644
index d7b7259..0000000
--- a/src/components/TemplateManager/TemplateRenderer.tsx
+++ /dev/null
@@ -1,331 +0,0 @@
-import { ArrowLeft, Send, Settings } from 'lucide-react';
-import React, { useEffect, useState } from 'react';
-import { ExportData, Template, TemplateElement } from '../../types/template';
-import DualSpreadsheet from '../DualSpreadsheet/DualSpreadsheet';
-import { Button } from '../ui/button';
-import { Card, CardContent, CardHeader, CardTitle } from '../ui/card';
-import { Checkbox } from '../ui/checkbox';
-import { Input } from '../ui/input';
-import { RadioGroup, RadioGroupItem } from '../ui/radio-group';
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select';
-import { Textarea } from '../ui/textarea';
-
-interface TemplateRendererProps {
- template: Template;
- onBack: () => void;
- onEdit: () => void;
- hideSpreadsheet?: boolean;
-}
-
-export const TemplateRenderer: React.FC
= ({
- template,
- onBack,
- onEdit,
- hideSpreadsheet = false,
-}) => {
- const [formData, setFormData] = useState>({});
- const [errors, setErrors] = useState>({});
- const [spreadsheetData, setSpreadsheetData] = useState>(template.excelData || {});
-
- // Инициализация формы значениями по умолчанию
- useEffect(() => {
- const initialData: Record = {};
- template.elements.forEach(element => {
- if (element.defaultValue) {
- initialData[element.id] = element.defaultValue;
- }
- });
- setFormData(initialData);
- }, [template.elements]);
-
- // Обновление данных таблицы при изменении формы
- useEffect(() => {
- const updatedData = { ...template.excelData || {}, ...spreadsheetData };
-
- template.elements.forEach(element => {
- const value = formData[element.id];
- if (value !== undefined && value !== null && value !== '') {
- updatedData[element.targetCell] = value;
- }
- });
-
- setSpreadsheetData(updatedData);
- }, [formData, template.elements, template.excelData]);
-
- const handleInputChange = (elementId: string, value: any) => {
- setFormData(prev => ({
- ...prev,
- [elementId]: value,
- }));
-
- // Очищаем ошибку при изменении значения
- if (errors[elementId]) {
- setErrors(prev => {
- const newErrors = { ...prev };
- delete newErrors[elementId];
- return newErrors;
- });
- }
- };
-
- const validateForm = (): boolean => {
- const newErrors: Record = {};
-
- template.elements.forEach(element => {
- if (element.required) {
- const value = formData[element.id];
- if (!value || (typeof value === 'string' && value.trim() === '')) {
- newErrors[element.id] = `Поле "${element.label}" обязательно для заполнения`;
- }
- }
- });
-
- setErrors(newErrors);
- return Object.keys(newErrors).length === 0;
- };
-
- const handleSubmit = () => {
- if (!validateForm()) {
- return;
- }
-
- // Получаем измененные ячейки из таблицы
- const changedCells = (window as any).getChangedCells?.() || {};
-
- // Создаем данные для экспорта
- const exportData: ExportData = {
- templateId: template.id,
- templateName: template.name,
- excelFile: template.excelFile!,
- cellUpdates: {
- ...changedCells,
- // Добавляем значения из формы
- ...template.elements.reduce((acc, element) => {
- const value = formData[element.id];
- if (value !== undefined && value !== null && value !== '') {
- acc[element.targetCell] = { rawValue: value, calculatedValue: value };
- }
- return acc;
- }, {} as Record),
- },
- };
-
- console.log('Данные для отправки на бэкенд:', exportData);
-
- // Здесь будет отправка на бэкенд
- alert(`Отчет "${template.name}" успешно сформирован!\n\nПроверьте консоль для подробностей.`);
- };
-
- const renderFormElement = (element: TemplateElement) => {
- const value = formData[element.id] || '';
- const hasError = !!errors[element.id];
-
- const commonProps = {
- className: hasError ? 'border-red-500' : '',
- };
-
- switch (element.type) {
- case 'text':
- return (
- handleInputChange(element.id, e.target.value)}
- />
- );
-
- case 'textarea':
- return (
-