Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

action-cell.tsx 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { ConfirmDeleteDialog } from '@/components/confirm-delete-dialog';
  2. import NewDocumentLink from '@/components/new-document-link';
  3. import { Button } from '@/components/ui/button';
  4. import {
  5. DropdownMenu,
  6. DropdownMenuContent,
  7. DropdownMenuItem,
  8. DropdownMenuSeparator,
  9. DropdownMenuTrigger,
  10. } from '@/components/ui/dropdown-menu';
  11. import { useDownloadFile } from '@/hooks/file-manager-hooks';
  12. import { IFile } from '@/interfaces/database/file-manager';
  13. import {
  14. getExtension,
  15. isSupportedPreviewDocumentType,
  16. } from '@/utils/document-util';
  17. import { CellContext } from '@tanstack/react-table';
  18. import { EllipsisVertical, Eye, Link2, Trash2 } from 'lucide-react';
  19. import { useCallback } from 'react';
  20. import { useTranslation } from 'react-i18next';
  21. import {
  22. UseHandleConnectToKnowledgeReturnType,
  23. UseRenameCurrentFileReturnType,
  24. } from './hooks';
  25. import { UseMoveDocumentShowType } from './use-move-file';
  26. import { isFolderType } from './util';
  27. type IProps = Pick<CellContext<IFile, unknown>, 'row'> &
  28. Pick<UseHandleConnectToKnowledgeReturnType, 'showConnectToKnowledgeModal'> &
  29. Pick<UseRenameCurrentFileReturnType, 'showFileRenameModal'> &
  30. UseMoveDocumentShowType;
  31. export function ActionCell({
  32. row,
  33. showConnectToKnowledgeModal,
  34. showFileRenameModal,
  35. showMoveFileModal,
  36. }: IProps) {
  37. const { t } = useTranslation();
  38. const record = row.original;
  39. const documentId = record.id;
  40. const { downloadFile } = useDownloadFile();
  41. const isFolder = isFolderType(record.type);
  42. const extension = getExtension(record.name);
  43. const handleShowConnectToKnowledgeModal = useCallback(() => {
  44. showConnectToKnowledgeModal(record);
  45. }, [record, showConnectToKnowledgeModal]);
  46. const onDownloadDocument = useCallback(() => {
  47. downloadFile({
  48. id: documentId,
  49. filename: record.name,
  50. });
  51. }, [documentId, downloadFile, record.name]);
  52. const handleShowFileRenameModal = useCallback(() => {
  53. showFileRenameModal(record);
  54. }, [record, showFileRenameModal]);
  55. const handleShowMoveFileModal = useCallback(() => {
  56. showMoveFileModal([record.id]);
  57. }, [record, showMoveFileModal]);
  58. return (
  59. <section className="flex gap-4 items-center">
  60. <Button
  61. variant="ghost"
  62. size={'icon'}
  63. onClick={handleShowConnectToKnowledgeModal}
  64. >
  65. <Link2 />
  66. </Button>
  67. <ConfirmDeleteDialog>
  68. <Button variant="ghost" size={'icon'}>
  69. <Trash2 />
  70. </Button>
  71. </ConfirmDeleteDialog>
  72. {isSupportedPreviewDocumentType(extension) && (
  73. <NewDocumentLink
  74. documentId={documentId}
  75. documentName={record.name}
  76. color="black"
  77. >
  78. <Button variant={'ghost'} size={'icon'}>
  79. <Eye />
  80. </Button>
  81. </NewDocumentLink>
  82. )}
  83. <DropdownMenu>
  84. <DropdownMenuTrigger asChild>
  85. <Button variant="ghost" size={'icon'}>
  86. <EllipsisVertical />
  87. </Button>
  88. </DropdownMenuTrigger>
  89. <DropdownMenuContent align="end">
  90. <DropdownMenuItem onClick={handleShowMoveFileModal}>
  91. {t('common.move')}
  92. </DropdownMenuItem>
  93. <DropdownMenuSeparator />
  94. <DropdownMenuItem onClick={handleShowFileRenameModal}>
  95. {t('common.rename')}
  96. </DropdownMenuItem>
  97. <DropdownMenuSeparator />
  98. {isFolder || (
  99. <DropdownMenuItem onClick={onDownloadDocument}>
  100. {t('common.download')}
  101. </DropdownMenuItem>
  102. )}
  103. </DropdownMenuContent>
  104. </DropdownMenu>
  105. </section>
  106. );
  107. }