Fix rack slot drag targets
This commit is contained in:
@@ -4,7 +4,7 @@ import { CSS } from '@dnd-kit/utilities';
|
|||||||
import { Trash2, MapPin, GripVertical } from 'lucide-react';
|
import { Trash2, MapPin, GripVertical } from 'lucide-react';
|
||||||
import { toast } from 'sonner';
|
import { toast } from 'sonner';
|
||||||
import type { Rack } from '../../types';
|
import type { Rack } from '../../types';
|
||||||
import { buildOccupancyMap } from '../../lib/utils';
|
import { U_HEIGHT_PX } from '../../lib/constants';
|
||||||
import { ModuleBlock } from './ModuleBlock';
|
import { ModuleBlock } from './ModuleBlock';
|
||||||
import { RackSlot } from './RackSlot';
|
import { RackSlot } from './RackSlot';
|
||||||
import { ConfirmDialog } from '../ui/ConfirmDialog';
|
import { ConfirmDialog } from '../ui/ConfirmDialog';
|
||||||
@@ -35,9 +35,6 @@ export function RackColumn({ rack, draggingModuleId, hoverSlot }: RackColumnProp
|
|||||||
opacity: isDragging ? 0.4 : 1,
|
opacity: isDragging ? 0.4 : 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
const occupancy = buildOccupancyMap(rack.modules);
|
|
||||||
const renderedModuleIds = new Set<string>();
|
|
||||||
|
|
||||||
async function handleDelete() {
|
async function handleDelete() {
|
||||||
setDeleting(true);
|
setDeleting(true);
|
||||||
try {
|
try {
|
||||||
@@ -86,43 +83,32 @@ export function RackColumn({ rack, draggingModuleId, hoverSlot }: RackColumnProp
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* U-slot body */}
|
{/* U-slot body */}
|
||||||
<div className="border-x border-slate-600 bg-[#1e2433] flex flex-col">
|
<div
|
||||||
{Array.from({ length: rack.totalU }, (_, i) => i + 1).map((u) => {
|
className="relative border-x border-slate-600 bg-[#1e2433]"
|
||||||
const moduleId = occupancy.get(u) ?? null;
|
style={{ height: rack.totalU * U_HEIGHT_PX }}
|
||||||
|
>
|
||||||
if (moduleId) {
|
<div className="absolute inset-0 flex flex-col">
|
||||||
const module = rack.modules.find((m) => m.id === moduleId);
|
{Array.from({ length: rack.totalU }, (_, i) => i + 1).map((u) => (
|
||||||
if (!module) return null;
|
|
||||||
|
|
||||||
// Only render ModuleBlock at its top U
|
|
||||||
if (module.uPosition !== u) return null;
|
|
||||||
if (renderedModuleIds.has(moduleId)) return null;
|
|
||||||
renderedModuleIds.add(moduleId);
|
|
||||||
|
|
||||||
// If this module is being dragged, show empty ghost slot instead
|
|
||||||
if (moduleId === draggingModuleId) {
|
|
||||||
return (
|
|
||||||
<RackSlot
|
|
||||||
key={`ghost-${u}`}
|
|
||||||
rackId={rack.id}
|
|
||||||
uPosition={u}
|
|
||||||
isOver={hoverSlot?.rackId === rack.id && hoverSlot?.uPosition === u}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return <ModuleBlock key={module.id} module={module} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<RackSlot
|
<RackSlot
|
||||||
key={u}
|
key={u}
|
||||||
rackId={rack.id}
|
rackId={rack.id}
|
||||||
uPosition={u}
|
uPosition={u}
|
||||||
isOver={hoverSlot?.rackId === rack.id && hoverSlot?.uPosition === u}
|
isOver={hoverSlot?.rackId === rack.id && hoverSlot?.uPosition === u}
|
||||||
/>
|
/>
|
||||||
);
|
))}
|
||||||
})}
|
</div>
|
||||||
|
|
||||||
|
{rack.modules
|
||||||
|
.filter((module) => module.id !== draggingModuleId)
|
||||||
|
.map((module) => (
|
||||||
|
<div
|
||||||
|
key={module.id}
|
||||||
|
className="absolute left-0 right-0 z-10"
|
||||||
|
style={{ top: (module.uPosition - 1) * U_HEIGHT_PX }}
|
||||||
|
>
|
||||||
|
<ModuleBlock module={module} />
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Rack footer */}
|
{/* Rack footer */}
|
||||||
|
|||||||
Reference in New Issue
Block a user