Header.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {
  2. DndContext,
  3. DragEndEvent,
  4. DragOverlay,
  5. DragStartEvent,
  6. PointerSensor,
  7. closestCenter,
  8. useSensor,
  9. } from '@dnd-kit/core';
  10. import {
  11. SortableContext,
  12. horizontalListSortingStrategy,
  13. } from '@dnd-kit/sortable';
  14. import classNames from 'classnames';
  15. import {forwardRef} from 'react';
  16. import HeaderTh from './HeaderTh';
  17. import type {LDColumnsType} from '.';
  18. import type {Header, HeaderGroup} from '@tanstack/react-table';
  19. type Props = {
  20. onDragStart: (event: DragStartEvent) => void,
  21. onDragEnd: (event: DragEndEvent) => void,
  22. columns: LDColumnsType<any>[],
  23. scrollProgess: 'start' | 'end' | 'process',
  24. getCenterTotalSize: () => number,
  25. getHeaderGroups: () => HeaderGroup<Record<string, any>>[],
  26. disabledSizeChange?: boolean,
  27. disabledHeadSort?: boolean,
  28. isSecondLevel?: boolean,
  29. active: Header<Record<string, any>, unknown> | null,
  30. };
  31. export default forwardRef<HTMLDivElement, Props>(function TableHead(
  32. {
  33. onDragEnd,
  34. onDragStart,
  35. columns,
  36. scrollProgess,
  37. getCenterTotalSize,
  38. getHeaderGroups,
  39. disabledSizeChange,
  40. disabledHeadSort,
  41. isSecondLevel,
  42. active,
  43. },
  44. ref,
  45. ) {
  46. const sensor = useSensor(PointerSensor);
  47. return (
  48. <DndContext
  49. onDragStart={onDragStart}
  50. onDragEnd={onDragEnd}
  51. sensors={[sensor]}
  52. collisionDetection={closestCenter}
  53. >
  54. <SortableContext
  55. items={(columns).map(val => val.dataIndex.toString())}
  56. strategy={horizontalListSortingStrategy}
  57. >
  58. <div className="ld-table-header-sticky" ref={ref}>
  59. <table
  60. className={classNames('ld-table', {
  61. 'ld-table-enabled-right-fixed-shadow': scrollProgess !== 'end',
  62. 'ld-table-enabled-left-fixed-shadow': scrollProgess !== 'start',
  63. })}
  64. style={{width: getCenterTotalSize()}}
  65. >
  66. <thead className="ld-table-head">
  67. {getHeaderGroups().map(function({id, headers}) {
  68. return (
  69. <tr key={id}>
  70. {headers.map(header => (
  71. <HeaderTh
  72. key={header.id}
  73. header={header}
  74. disabledSizeChange={disabledSizeChange}
  75. disabledHeadSort={disabledHeadSort}
  76. />
  77. ))}
  78. </tr>
  79. );
  80. })}
  81. </thead>
  82. </table>
  83. </div>
  84. <DragOverlay>
  85. {active ? (
  86. <table
  87. className={classNames('width-full', {
  88. 'ld-table-preview-transform': isSecondLevel,
  89. })}
  90. >
  91. <thead className="width-full">
  92. <tr className="width-full">
  93. <HeaderTh
  94. header={active}
  95. preview
  96. />
  97. </tr>
  98. </thead>
  99. </table>
  100. ) : null}
  101. </DragOverlay>
  102. </SortableContext>
  103. </DndContext>
  104. );
  105. });