точка и иконка ячеек
This commit is contained in:
@@ -4,6 +4,7 @@ import {
|
|||||||
Edit,
|
Edit,
|
||||||
Eye,
|
Eye,
|
||||||
EyeOff,
|
EyeOff,
|
||||||
|
Grid,
|
||||||
Move,
|
Move,
|
||||||
Trash2
|
Trash2
|
||||||
} from 'lucide-react';
|
} from 'lucide-react';
|
||||||
@@ -181,12 +182,30 @@ const DraggableElement: React.FC<DraggableElementProps> = React.memo(({
|
|||||||
<div className={`flex items-center justify-between mb-1 ${
|
<div className={`flex items-center justify-between mb-1 ${
|
||||||
isSelected ? 'opacity-100' : 'opacity-0 group-hover:opacity-60'
|
isSelected ? 'opacity-100' : 'opacity-0 group-hover:opacity-60'
|
||||||
}`}>
|
}`}>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-start gap-2">
|
||||||
|
<div className="flex items-center gap-1">
|
||||||
<span className="font-medium text-xs text-gray-600 truncate">
|
<span className="font-medium text-xs text-gray-600 truncate">
|
||||||
{element.label || element.name || `${element.type} элемент`}
|
{element.label || element.name || `${element.type} элемент`}
|
||||||
</span>
|
</span>
|
||||||
|
{element.required && <span className="inline-block w-1 h-1 bg-red-500 rounded-full -mt-1.5" />}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
|
{/* Индикатор ячеек */}
|
||||||
|
{element.targetCells && element.targetCells.length > 0 && (
|
||||||
|
<div className="relative group/cells">
|
||||||
|
<Grid className="w-3 h-3 text-gray-500 opacity-60 hover:opacity-100 cursor-help transition-opacity" />
|
||||||
|
<div className="absolute top-full right-0 mt-2 p-2 bg-gray-900 text-white text-xs rounded shadow-lg opacity-0 group-hover/cells:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50">
|
||||||
|
<div className="font-medium mb-1">Целевые ячейки:</div>
|
||||||
|
{element.targetCells.map((cell, i) => (
|
||||||
|
<div key={i} className="font-mono">
|
||||||
|
{cell.sheet}!{cell.cell}
|
||||||
|
{cell.displayName && <span className="text-gray-300 ml-1">({cell.displayName})</span>}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
{onEdit && (
|
{onEdit && (
|
||||||
<Button
|
<Button
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
@@ -214,7 +233,6 @@ const DraggableElement: React.FC<DraggableElementProps> = React.memo(({
|
|||||||
{element.label && (
|
{element.label && (
|
||||||
<label className="block text-sm font-medium text-gray-900 pointer-events-none">
|
<label className="block text-sm font-medium text-gray-900 pointer-events-none">
|
||||||
{element.label}
|
{element.label}
|
||||||
{element.required && <span className="text-red-500 ml-1">*</span>}
|
|
||||||
</label>
|
</label>
|
||||||
)}
|
)}
|
||||||
{previewControl}
|
{previewControl}
|
||||||
@@ -224,13 +242,7 @@ const DraggableElement: React.FC<DraggableElementProps> = React.memo(({
|
|||||||
{/* Additional info (only visible on selection to preserve visual clarity & perf) */}
|
{/* Additional info (only visible on selection to preserve visual clarity & perf) */}
|
||||||
{isSelected && (
|
{isSelected && (
|
||||||
<div className="text-xs opacity-75 space-y-1 mt-1">
|
<div className="text-xs opacity-75 space-y-1 mt-1">
|
||||||
{element.targetCells && element.targetCells.length > 0 && (
|
{/* Здесь можно добавить дополнительную информацию при необходимости */}
|
||||||
<div className="font-mono truncate">
|
|
||||||
{element.targetCells.map((cell, i) => (
|
|
||||||
<span key={i} className="mr-1 px-1 py-0.5 bg-black/5 rounded text-xs">{cell.sheet}!{cell.cell}</span>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ArrowLeft, Download, FileText, Plus, Save, Settings, Wrench } from 'lucide-react';
|
import { ArrowLeft, Download, FileText, Grid, Plus, Save, Settings, Wrench } from 'lucide-react';
|
||||||
import { FC, useMemo, useState } from 'react';
|
import { FC, useMemo, useState } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { StandardsSelector } from '../../../../components/StandardsElement/StandardsSelector';
|
import { StandardsSelector } from '../../../../components/StandardsElement/StandardsSelector';
|
||||||
@@ -270,31 +270,30 @@ const FormElement: FC<FormElementProps> = ({ element, value, onChange }) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<div className="flex items-center gap-1">
|
||||||
<label className="text-sm font-medium text-gray-900">
|
<label className="text-sm font-medium text-gray-900">
|
||||||
{element.label}
|
{element.label}
|
||||||
</label>
|
</label>
|
||||||
{element.required && (
|
{element.required && <span className="inline-block w-1 h-1 bg-red-500 rounded-full -mt-1.5" />}
|
||||||
<Badge variant="destructive" className="text-xs">
|
</div>
|
||||||
!
|
{/* Индикатор ячеек */}
|
||||||
</Badge>
|
{element.targetCells && element.targetCells.length > 0 && (
|
||||||
|
<div className="relative group/cells">
|
||||||
|
<Grid className="w-3 h-3 text-gray-500 opacity-60 hover:opacity-100 cursor-help transition-opacity" />
|
||||||
|
<div className="absolute top-full right-0 mt-2 p-2 bg-gray-900 text-white text-xs rounded shadow-lg opacity-0 group-hover/cells:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50">
|
||||||
|
<div className="font-medium mb-1">Целевые ячейки:</div>
|
||||||
|
{element.targetCells.map((cell, i) => (
|
||||||
|
<div key={i} className="font-mono">
|
||||||
|
{cell.sheet}!{cell.cell}
|
||||||
|
{cell.displayName && <span className="text-gray-300 ml-1">({cell.displayName})</span>}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
{renderInput()}
|
{renderInput()}
|
||||||
{element.targetCells && element.targetCells.length > 0 && (
|
|
||||||
<div className="flex flex-wrap gap-1.5">
|
|
||||||
{element.targetCells.map((target, index) => (
|
|
||||||
<Badge
|
|
||||||
key={index}
|
|
||||||
variant="secondary"
|
|
||||||
className="text-xs font-mono"
|
|
||||||
title={target.displayName}
|
|
||||||
>
|
|
||||||
{target.sheet}!{target.cell}
|
|
||||||
</Badge>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user