您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

bulk-operate-bar.tsx 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { Button } from '@/components/ui/button';
  2. import { Card, CardContent } from '@/components/ui/card';
  3. import { cn } from '@/lib/utils';
  4. import { ReactNode, useCallback } from 'react';
  5. import { ConfirmDeleteDialog } from './confirm-delete-dialog';
  6. export type BulkOperateItemType = {
  7. id: string;
  8. label: ReactNode;
  9. icon: ReactNode;
  10. onClick(): void;
  11. };
  12. type BulkOperateBarProps = { list: BulkOperateItemType[] };
  13. export function BulkOperateBar({ list }: BulkOperateBarProps) {
  14. const isDeleteItem = useCallback((id: string) => {
  15. return id === 'delete';
  16. }, []);
  17. return (
  18. <Card className="mb-4">
  19. <CardContent className="p-1">
  20. <ul className="flex gap-2">
  21. {list.map((x) => (
  22. <li
  23. key={x.id}
  24. className={cn({ ['text-text-delete-red']: isDeleteItem(x.id) })}
  25. >
  26. <ConfirmDeleteDialog
  27. hidden={!isDeleteItem(x.id)}
  28. onOk={x.onClick}
  29. >
  30. <Button
  31. variant={'ghost'}
  32. onClick={isDeleteItem(x.id) ? () => {} : x.onClick}
  33. >
  34. {x.icon} {x.label}
  35. </Button>
  36. </ConfirmDeleteDialog>
  37. </li>
  38. ))}
  39. </ul>
  40. </CardContent>
  41. </Card>
  42. );
  43. }