mirror of
https://github.com/lingble/twenty.git
synced 2025-11-03 14:17:58 +00:00
56 lines
1.7 KiB
TypeScript
56 lines
1.7 KiB
TypeScript
import styled from '@emotion/styled';
|
|
import { DropResult } from '@hello-pangea/dnd'; // Atlassian dnd does not support StrictMode from RN 18, so we use a fork @hello-pangea/dnd https://github.com/atlassian/react-beautiful-dnd/issues/2350
|
|
|
|
export const StyledBoard = styled.div`
|
|
border-radius: ${({ theme }) => theme.spacing(2)};
|
|
display: flex;
|
|
flex-direction: row;
|
|
height: calc(100%);
|
|
overflow-x: auto;
|
|
width: 100%;
|
|
`;
|
|
|
|
export interface Column {
|
|
id: string;
|
|
title: string;
|
|
colorCode?: string;
|
|
itemKeys: string[];
|
|
}
|
|
|
|
export function getOptimisticlyUpdatedBoard(
|
|
board: Column[],
|
|
result: DropResult,
|
|
) {
|
|
const newBoard = JSON.parse(JSON.stringify(board));
|
|
const { destination, source } = result;
|
|
if (!destination) return;
|
|
const sourceColumnIndex = newBoard.findIndex(
|
|
(column: Column) => column.id === source.droppableId,
|
|
);
|
|
const sourceColumn = newBoard[sourceColumnIndex];
|
|
const destinationColumnIndex = newBoard.findIndex(
|
|
(column: Column) => column.id === destination.droppableId,
|
|
);
|
|
const destinationColumn = newBoard[destinationColumnIndex];
|
|
if (!destinationColumn || !sourceColumn) return;
|
|
const sourceItems = sourceColumn.itemKeys;
|
|
const destinationItems = destinationColumn.itemKeys;
|
|
|
|
const [removed] = sourceItems.splice(source.index, 1);
|
|
destinationItems.splice(destination.index, 0, removed);
|
|
|
|
const newSourceColumn = {
|
|
...sourceColumn,
|
|
itemKeys: sourceItems,
|
|
};
|
|
|
|
const newDestinationColumn = {
|
|
...destinationColumn,
|
|
itemKeys: destinationItems,
|
|
};
|
|
|
|
newBoard.splice(sourceColumnIndex, 1, newSourceColumn);
|
|
newBoard.splice(destinationColumnIndex, 1, newDestinationColumn);
|
|
return newBoard;
|
|
}
|