Files
traque/traque-front/components/list.jsx
Sebastien Riviere d088253758 Improvements on maps
2025-08-31 23:04:15 +02:00

68 lines
2.6 KiB
JavaScript

import { useEffect, useState } from 'react';
import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd';
export function List({array, children}) {
// TODO : change key
return (
<div className='w-full h-full bg-gray-300 overflow-y-scroll'>
<ul className="w-full p-1 pb-0">
{array.map((elem, i) => (
<li className="w-full" key={elem.id ?? i}>
{children(elem, i)}
<div className="w-full h-1"/>
</li>
))}
</ul>
</div>
);
}
export function ReorderList({droppableId, array, setArray, children}) {
const [arrayLocal, setArrayLocal] = useState(array);
useEffect(() => {
setArrayLocal(array);
}, [array])
function reorder(list, startIndex, endIndex) {
const result = Array.from(list);
const [removed] = result.splice(startIndex, 1);
result.splice(endIndex, 0, removed);
return result;
};
function onDragEnd(result) {
if (!result.destination) return;
if (result.destination.index === result.source.index) return;
const newArray = reorder(array, result.source.index, result.destination.index);
setArrayLocal(newArray);
setArray(newArray);
}
return (
<DragDropContext onDragEnd={onDragEnd} >
<Droppable droppableId={droppableId}>
{provided => (
<div className='w-full h-full bg-gray-300 overflow-y-scroll' ref={provided.innerRef} {...provided.droppableProps}>
<ul className="w-full p-1 pb-0">
{arrayLocal.map((elem, i) => (
<li className='w-full' key={elem.id}>
<Draggable draggableId={elem.id.toString()} index={i}>
{provided => (
<div className='w-full' {...provided.draggableProps} {...provided.dragHandleProps} ref={provided.innerRef}>
{children(elem, i)}
<div className="w-full h-1"/>
</div>
)}
</Draggable>
</li>
))}
</ul>
{provided.placeholder}
</div>
)}
</Droppable>
</DragDropContext>
);
}