33import { updateTask , updateViewModeSettings } from '@/app/(home)/actions'
44import { TaskDataFetcher } from '@/app/_fetchers/TaskDataFetcher'
55import { clientUpdateTask } from '@/app/detail/[task_id]/[user_type]/actions'
6- import { TaskCardList } from '@/app/detail/ui/TaskCardList'
76import { TaskBoardAppBridge } from '@/app/ui/TaskBoardAppBridge'
87import { CustomDragLayer } from '@/components/CustomDragLayer'
98import { CardDragLayer } from '@/components/cards/CardDragLayer'
10- import { TaskCard } from '@/components/cards/TaskCard'
119import { TaskColumn } from '@/components/cards/TaskColumn'
1210import { TaskRow } from '@/components/cards/TaskRow'
1311import DashboardEmptyState from '@/components/layouts/EmptyState/DashboardEmptyState'
1412import { NoFilteredTasksState } from '@/components/layouts/EmptyState/NoFilteredTasksState'
1513import { FilterBar } from '@/components/layouts/FilterBar'
1614import { Header } from '@/components/layouts/Header'
17- import { CustomLink } from '@/hoc/CustomLink'
1815import { DragDropHandler } from '@/hoc/DragDropHandler'
1916import { useFilter } from '@/hooks/useFilter'
2017import { selectTaskBoard , updateWorkflowStateIdByTaskId } from '@/redux/features/taskBoardSlice'
@@ -24,16 +21,14 @@ import { TaskResponse } from '@/types/dto/tasks.dto'
2421import { CreateViewSettingsDTO } from '@/types/dto/viewSettings.dto'
2522import { View } from '@/types/interfaces'
2623import { checkEmptyAssignee } from '@/utils/assignee'
27- import { getCardHref } from '@/utils/getCardHref'
2824import { sortTaskByDescendingOrder } from '@/utils/sortTask'
2925import { prioritizeStartedStates } from '@/utils/workflowStates'
3026import { UserRole } from '@api/core/types/user'
3127import { Box , Stack } from '@mui/material'
32- import { useCallback , useEffect , useRef , useState } from 'react'
28+ import { useCallback , useEffect , useState } from 'react'
3329import { useSelector } from 'react-redux'
3430import { z } from 'zod'
35- import { useVirtualizer } from '@tanstack/react-virtual'
36- import { WorkflowStateResponse } from '@/types/dto/workflowStates.dto'
31+ import { TasksColumnVirtualizer , TasksRowVirtualizer } from '@/app/ui/VirtualizedTasksLists'
3732
3833interface TaskBoardProps {
3934 mode : UserRole
@@ -228,160 +223,3 @@ export const TaskBoard = ({ mode, workspace }: TaskBoardProps) => {
228223 </ >
229224 )
230225}
231-
232- interface TasksVirtualizerProps {
233- rows : TaskResponse [ ]
234- mode : UserRole
235- token : string | null
236- }
237-
238- // virtualization component used in board view
239- function TasksRowVirtualizer ( { rows, mode, token } : TasksVirtualizerProps ) {
240- const parentRef = useRef < HTMLDivElement > ( null )
241-
242- const rowVirtualizer = useVirtualizer ( {
243- count : rows . length ,
244- getScrollElement : ( ) => parentRef . current ,
245- estimateSize : useCallback (
246- ( index : number ) => {
247- const task = rows [ index ]
248- let estimate = 70
249- if ( task . isArchived ) estimate += 24
250- if ( task . dueDate ) estimate += 24
251- if ( task . title && task . title . length > 50 ) estimate += 20
252- return estimate
253- } ,
254- [ rows ] ,
255- ) ,
256- measureElement : ( element ) => element . getBoundingClientRect ( ) . height ,
257- overscan : 20 ,
258- } )
259-
260- return (
261- < div
262- ref = { parentRef }
263- className = "List"
264- style = { {
265- height : `100vh` ,
266- width : '100%' ,
267- overflow : 'auto' ,
268- columnGap : '6px' ,
269- } }
270- >
271- < div
272- style = { {
273- height : `${ rowVirtualizer . getTotalSize ( ) } px` ,
274- width : '100%' ,
275- position : 'relative' ,
276- } }
277- >
278- { rowVirtualizer . getVirtualItems ( ) . map ( ( virtualRow ) => (
279- < div
280- key = { virtualRow . key }
281- data-index = { virtualRow . index }
282- ref = { ( node ) => rowVirtualizer . measureElement ( node ) }
283- style = { {
284- display : 'flex' ,
285- position : 'absolute' ,
286- transform : `translateY(${ virtualRow . start } px)` ,
287- width : '100%' ,
288- } }
289- >
290- < div style = { { padding : '3px 0' } } >
291- < CustomLink
292- key = { rows [ virtualRow . index ] . id }
293- href = { {
294- pathname : getCardHref ( rows [ virtualRow . index ] , mode ) ,
295- query : { token } ,
296- } }
297- style = { { width : 'fit-content' } }
298- >
299- < DragDropHandler
300- key = { rows [ virtualRow . index ] . id }
301- accept = { 'taskCard' }
302- index = { virtualRow . index }
303- task = { rows [ virtualRow . index ] }
304- draggable
305- >
306- < Box >
307- < TaskCard
308- task = { rows [ virtualRow . index ] }
309- key = { rows [ virtualRow . index ] . id }
310- href = { {
311- pathname : getCardHref ( rows [ virtualRow . index ] , mode ) ,
312- query : { token } ,
313- } }
314- />
315- </ Box >
316- </ DragDropHandler >
317- </ CustomLink >
318- </ div >
319- </ div >
320- ) ) }
321- </ div >
322- </ div >
323- )
324- }
325-
326- function TasksColumnVirtualizer ( { rows, mode, token, list } : TasksVirtualizerProps & { list : WorkflowStateResponse } ) {
327- const parentRef = useRef < HTMLDivElement > ( null )
328- const columnVirtualizer = useVirtualizer ( {
329- count : rows . length ,
330- getScrollElement : ( ) => parentRef . current ,
331- estimateSize : ( ) => 44 ,
332- measureElement : ( element ) => element . getBoundingClientRect ( ) . height ,
333- overscan : 100 ,
334- } )
335- return (
336- < div
337- ref = { parentRef }
338- className = "List"
339- style = { {
340- height : `100vh` ,
341- width : '100%' ,
342- overflow : 'auto' ,
343- columnGap : '6px' ,
344- } }
345- >
346- < div
347- style = { {
348- height : `${ columnVirtualizer . getTotalSize ( ) } px` ,
349- width : '100%' ,
350- position : 'relative' ,
351- } }
352- >
353- { columnVirtualizer . getVirtualItems ( ) . map ( ( virtualRow ) => (
354- < div
355- key = { virtualRow . key }
356- data-index = { virtualRow . index }
357- ref = { ( node ) => columnVirtualizer . measureElement ( node ) }
358- style = { {
359- display : 'flex' ,
360- position : 'absolute' ,
361- transform : `translateY(${ virtualRow . start } px)` ,
362- width : '100%' ,
363- } }
364- >
365- < div style = { { padding : '3px 0' , width : '100%' } } >
366- < DragDropHandler
367- key = { rows [ virtualRow . index ] . id }
368- accept = { 'taskCard' }
369- index = { virtualRow . index }
370- task = { rows [ virtualRow . index ] }
371- draggable
372- >
373- < TaskCardList
374- task = { rows [ virtualRow . index ] }
375- variant = "task"
376- key = { rows [ virtualRow . index ] . id }
377- workflowState = { list }
378- mode = { mode }
379- />
380- </ DragDropHandler >
381- </ div >
382- </ div >
383- ) ) }
384- </ div >
385- </ div >
386- )
387- }
0 commit comments