data-table-column-header.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { Button } from '@/components/ui/button.js';
  2. import {
  3. DropdownMenu,
  4. DropdownMenuContent,
  5. DropdownMenuItem,
  6. DropdownMenuTrigger,
  7. } from '@/components/ui/dropdown-menu.js';
  8. import {
  9. Dialog,
  10. DialogContent,
  11. DialogDescription,
  12. DialogHeader,
  13. DialogTitle,
  14. DialogTrigger,
  15. } from '@/components/ui/dialog.js';
  16. import { DataTableFilterDialog } from '@/components/data-table/data-table-filter-dialog.js';
  17. import { FieldInfo } from '@/framework/document-introspection/get-document-structure.js';
  18. import { camelCaseToTitleCase } from '@/lib/utils.js';
  19. import { Trans } from '@/lib/trans.js';
  20. import { ColumnDef, HeaderContext } from '@tanstack/table-core';
  21. import { ArrowDown, ArrowUp, ArrowUpDown, EllipsisVertical, Filter } from 'lucide-react';
  22. import React from 'react';
  23. export interface DataTableColumnHeaderProps {
  24. customConfig: Partial<ColumnDef<any>>;
  25. headerContext: HeaderContext<any, any>;
  26. }
  27. export function DataTableColumnHeader({ headerContext, customConfig }: DataTableColumnHeaderProps) {
  28. const { column } = headerContext;
  29. const isSortable = column.getCanSort();
  30. const customHeader = customConfig.header;
  31. let display = camelCaseToTitleCase(column.id);
  32. if (typeof customHeader === 'function') {
  33. display = customHeader(headerContext);
  34. } else if (typeof customHeader === 'string') {
  35. display = customHeader;
  36. }
  37. const columSort = column.getIsSorted();
  38. const nextSort = columSort === 'asc' ? true : columSort === 'desc' ? undefined : false;
  39. return (
  40. <div className="flex items-center">
  41. {isSortable && (
  42. <Button size="icon-sm" variant="ghost" onClick={() => column.toggleSorting(nextSort)}>
  43. {columSort === 'desc' ? (
  44. <ArrowUp />
  45. ) : columSort === 'asc' ? (
  46. <ArrowDown />
  47. ) : (
  48. <ArrowUpDown className="opacity-50" />
  49. )}
  50. </Button>
  51. )}
  52. <div>{display}</div>
  53. </div>
  54. );
  55. }