From 8b99635eb38899e257b4cb64095558f24f189d1e Mon Sep 17 00:00:00 2001 From: balibabu Date: Mon, 10 Mar 2025 11:14:44 +0800 Subject: [PATCH] Feat: Add TransferList component. #3221 (#5822) ### What problem does this PR solve? Feat: Add TransferList component. #3221 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/src/components/ui/transfer-list.tsx | 147 ++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 web/src/components/ui/transfer-list.tsx diff --git a/web/src/components/ui/transfer-list.tsx b/web/src/components/ui/transfer-list.tsx new file mode 100644 index 000000000..db8306f8e --- /dev/null +++ b/web/src/components/ui/transfer-list.tsx @@ -0,0 +1,147 @@ +'use client'; + +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { + ChevronLeftIcon, + ChevronRightIcon, + SquareCheckIcon, + SquareIcon, +} from 'lucide-react'; +import React from 'react'; + +type Item = { + key: string; + label: string; + selected?: boolean; +}; + +export default function TransferList({ items }: { items: Item[] }) { + const [leftList, setLeftList] = React.useState(items); + const [rightList, setRightList] = React.useState([]); + const [leftSearch, setLeftSearch] = React.useState(''); + const [rightSearch, setRightSearch] = React.useState(''); + + const moveToRight = () => { + const selectedItems = leftList.filter((item) => item.selected); + setRightList([...rightList, ...selectedItems]); + setLeftList(leftList.filter((item) => !item.selected)); + }; + + const moveToLeft = () => { + const selectedItems = rightList.filter((item) => item.selected); + setLeftList([...leftList, ...selectedItems]); + setRightList(rightList.filter((item) => !item.selected)); + }; + + const toggleSelection = ( + list: Item[], + setList: React.Dispatch>, + key: string, + ) => { + const updatedList = list.map((item) => { + if (item.key === key) { + return { ...item, selected: !item.selected }; + } + return item; + }); + + setList(updatedList); + }; + + return ( +
+
+
+ setLeftSearch(e.target.value)} + /> + +
+
    + {leftList + .filter((item) => + item.label.toLowerCase().includes(leftSearch.toLowerCase()), + ) + .map((item) => ( +
  • + +
  • + ))} +
+
+ +
+
+ + setRightSearch(e.target.value)} + /> +
+
    + {rightList + .filter((item) => + item.label.toLowerCase().includes(rightSearch.toLowerCase()), + ) + .map((item) => ( +
  • + +
  • + ))} +
+
+
+ ); +}