diff --git a/src/component/DualSpreadsheet/components/FormulaBar.tsx b/src/component/DualSpreadsheet/components/FormulaBar.tsx index a16b640..c0c2dce 100644 --- a/src/component/DualSpreadsheet/components/FormulaBar.tsx +++ b/src/component/DualSpreadsheet/components/FormulaBar.tsx @@ -1,4 +1,4 @@ -import { Save } from 'lucide-react' +import { Save, Sigma } from 'lucide-react' import { memo } from 'react' import { ExcelUploadPanel } from '../../TemplateManager/ExcelUploadPanel' import { FormulaBarProps } from '../types' @@ -29,8 +29,8 @@ export const FormulaBar = memo(
{/* Адрес ячейки */} -
- +
+ {selectedCell ? `${getColumnLabel(selectedCell.col)}${selectedCell.row + 1}` : 'A1'} @@ -40,19 +40,7 @@ export const FormulaBar = memo( {/* Строка формул */}
- - - +
= ({ onLayoutSettingsChange, }) => { const elements = template.elements - const layoutSettings = template.layoutSettings || { - gridSize: 20, - showGrid: true, - } + const layoutSettings = template.layoutSettings || getDefaultLayoutSettings() const [isAddDialogOpen, setIsAddDialogOpen] = useState(false) const [editingElement, setEditingElement] = useState( null @@ -611,6 +608,18 @@ export const ElementConstructor: React.FC = ({ } : undefined } + snapToGrid={layoutSettings.snapToGrid} + onToggleSnapToGrid={ + onLayoutSettingsChange + ? () => { + const newSettings = { + ...layoutSettings, + snapToGrid: !layoutSettings.snapToGrid, + } + onLayoutSettingsChange(newSettings) + } + : undefined + } />
diff --git a/src/component/TemplateManager/ElementFormulaBar.tsx b/src/component/TemplateManager/ElementFormulaBar.tsx index d5c2b4d..cfae5f2 100644 --- a/src/component/TemplateManager/ElementFormulaBar.tsx +++ b/src/component/TemplateManager/ElementFormulaBar.tsx @@ -1,4 +1,4 @@ -import { Eye, EyeOff, Plus, Save, Wrench } from 'lucide-react' +import { Eye, EyeOff, Magnet, Plus, Save, Wrench } from 'lucide-react' import { memo } from 'react' import { Button } from '../ui/button' @@ -16,6 +16,8 @@ interface ElementFormulaBarProps { // Пропсы для управления сеткой showGrid?: boolean onToggleGrid?: () => void + snapToGrid?: boolean + onToggleSnapToGrid?: () => void } export const ElementFormulaBar = memo( @@ -31,58 +33,73 @@ export const ElementFormulaBar = memo( onClearError, showGrid = true, onToggleGrid, + snapToGrid = true, + onToggleSnapToGrid, }: ElementFormulaBarProps) => { return (
-
-
-
- - {elementCount} элементов - -
-
+
+
+ {onToggleGrid && ( + + )} + {onToggleSnapToGrid && ( + + )} +
+ + {/* Центральные кнопки добавления - абсолютное позиционирование */} +
+ + {onAutoArrange && ( - {onAutoArrange && ( - - )} - {onToggleGrid && ( - - )} -
+ )}
-
+
{/* Ошибка сохранения */} {lastSaveError && (
diff --git a/src/component/TemplateManager/VisualLayoutEditor.tsx b/src/component/TemplateManager/VisualLayoutEditor.tsx index 8088c03..c2ba106 100644 --- a/src/component/TemplateManager/VisualLayoutEditor.tsx +++ b/src/component/TemplateManager/VisualLayoutEditor.tsx @@ -33,10 +33,20 @@ interface DraggableElementProps { onDelete: () => void onEdit?: () => void gridSize: number + layoutSettings: FormLayoutSettings } const DraggableElement: React.FC = React.memo( - ({ element, isSelected, onSelect, onUpdate, onDelete, onEdit, gridSize }) => { + ({ + element, + isSelected, + onSelect, + onUpdate, + onDelete, + onEdit, + gridSize, + layoutSettings, + }) => { const layout = element.layout || { x: 50, y: 50, @@ -113,8 +123,8 @@ const DraggableElement: React.FC = React.memo( return ( = ({ onDelete={() => onElementDelete(element.id)} onEdit={onElementEdit ? () => onElementEdit(element) : undefined} gridSize={layoutSettings.gridSize} + layoutSettings={layoutSettings} /> ))} {elements.length === 0 && ( diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 7cf4e63..e77c50c 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -47,6 +47,7 @@ export function getDefaultLayoutSettings(): FormLayoutSettings { return { gridSize: 20, showGrid: true, + snapToGrid: true, } } diff --git a/src/page/ElementsCreation/Page.tsx b/src/page/ElementsCreation/Page.tsx index 8c74904..aef78d8 100644 --- a/src/page/ElementsCreation/Page.tsx +++ b/src/page/ElementsCreation/Page.tsx @@ -2,7 +2,7 @@ import { ElementConstructor } from '@/component/TemplateManager/ElementConstruct import { Button } from '@/component/ui/button' import { useTemplateContext } from '@/entitiy/template/model/TemplateContext' import { useDelayedSave } from '@/hook/useDelayedSave' -import { Template, TemplateElement } from '@/type/template' +import { FormLayoutSettings, Template, TemplateElement } from '@/type/template' import { ArrowLeft, FileText, Settings, Wrench } from 'lucide-react' import { FC, useCallback, useEffect, useState } from 'react' import { useNavigate, useParams } from 'react-router-dom' @@ -105,6 +105,21 @@ export const ElementsCreation: FC = () => { updateData(updatedTemplate) } + const handleLayoutSettingsChange = async ( + layoutSettings: FormLayoutSettings + ) => { + if (!selectedTemplate) return + + const updatedTemplate = { + ...selectedTemplate, + layoutSettings, + updatedAt: new Date(), + } + + setSelectedTemplate(updatedTemplate) + updateData(updatedTemplate) + } + // if (isLoading) { // return ( //
@@ -175,10 +190,10 @@ export const ElementsCreation: FC = () => { variant="link" size="sm" onClick={() => navigate(`/templates/${selectedTemplate.id}/edit`)} - className="flex items-center gap-2 hover:bg-muted" + className="flex items-center gap-1 hover:bg-muted" > - - Настройки шаблона + + Настройки шаблона