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"
>
-
- Настройки шаблона
+
+ Настройки шаблона