refactor(enhanced-kanban): improve code readability and integrate TaskListFilters component

- Refactored EnhancedKanbanBoard and EnhancedKanbanGroup components for better code organization and readability.
- Integrated TaskListFilters component to enhance task filtering capabilities within the kanban board.
- Cleaned up unnecessary whitespace and improved formatting for consistency across the codebase.
This commit is contained in:
shancds
2025-06-23 10:13:47 +05:30
parent f7ba4f202b
commit 67c26a973e
2 changed files with 60 additions and 49 deletions

View File

@@ -23,16 +23,18 @@ import {
verticalListSortingStrategy,
} from '@dnd-kit/sortable';
import { RootState } from '@/app/store';
import {
fetchEnhancedKanbanGroups,
import {
fetchEnhancedKanbanGroups,
reorderEnhancedKanbanTasks,
setDragState
setDragState
} from '@/features/enhanced-kanban/enhanced-kanban.slice';
import EnhancedKanbanGroup from './EnhancedKanbanGroup';
import EnhancedKanbanTaskCard from './EnhancedKanbanTaskCard';
import PerformanceMonitor from './PerformanceMonitor';
import './EnhancedKanbanBoard.css';
// Import the TaskListFilters component
const TaskListFilters = React.lazy(() => import('@/pages/projects/projectView/taskList/task-list-filters/task-list-filters'));
interface EnhancedKanbanBoardProps {
projectId: string;
className?: string;
@@ -40,14 +42,14 @@ interface EnhancedKanbanBoardProps {
const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, className = '' }) => {
const dispatch = useDispatch();
const {
taskGroups,
loadingGroups,
error,
const {
taskGroups,
loadingGroups,
error,
dragState,
performanceMetrics
performanceMetrics
} = useSelector((state: RootState) => state.enhancedKanbanReducer);
// Local state for drag overlay
const [activeTask, setActiveTask] = useState<any>(null);
const [activeGroup, setActiveGroup] = useState<any>(null);
@@ -70,12 +72,12 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
}, [dispatch, projectId]);
// Get all task IDs for sortable context
const allTaskIds = useMemo(() =>
taskGroups.flatMap(group => group.tasks.map(task => task.id!)),
const allTaskIds = useMemo(() =>
taskGroups.flatMap(group => group.tasks.map(task => task.id!)),
[taskGroups]
);
const allGroupIds = useMemo(() =>
taskGroups.map(group => group.id),
const allGroupIds = useMemo(() =>
taskGroups.map(group => group.id),
[taskGroups]
);
@@ -86,13 +88,13 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
const intersections = pointerIntersections.length > 0
? pointerIntersections
: rectIntersection(args);
let overId = getFirstCollision(intersections, 'id');
if (overId) {
// Check if we're over a task or a group
const overGroup = taskGroups.find(g => g.id === overId);
if (overGroup) {
// We're over a group, check if there are tasks in it
if (overGroup.tasks.length > 0) {
@@ -103,7 +105,7 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
(container: any) => container.data.current?.type === 'task'
),
});
if (taskIntersections.length > 0) {
overId = taskIntersections[0].id;
}
@@ -117,11 +119,11 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
const handleDragStart = (event: DragStartEvent) => {
const { active } = event;
const activeId = active.id as string;
// Find the active task and group
let foundTask = null;
let foundGroup = null;
for (const group of taskGroups) {
const task = group.tasks.find(t => t.id === activeId);
if (task) {
@@ -133,7 +135,7 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
setActiveTask(foundTask);
setActiveGroup(foundGroup);
// Update Redux drag state
dispatch(setDragState({
activeTaskId: activeId,
@@ -144,7 +146,7 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
const handleDragOver = (event: DragOverEvent) => {
const { active, over } = event;
if (!over) {
setOverId(null);
dispatch(setDragState({ overId: null }));
@@ -153,21 +155,21 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
const activeId = active.id as string;
const overId = over.id as string;
setOverId(overId);
// Update over ID in Redux
dispatch(setDragState({ overId }));
};
const handleDragEnd = (event: DragEndEvent) => {
const { active, over } = event;
// Reset local state
setActiveTask(null);
setActiveGroup(null);
setOverId(null);
// Reset Redux drag state
dispatch(setDragState({
activeTaskId: null,
@@ -258,8 +260,17 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
return (
<div className={`enhanced-kanban-board ${className}`}>
{/* Performance Monitor - only show for large datasets */}
{performanceMetrics.totalTasks > 100 && <PerformanceMonitor />}
{/* {performanceMetrics.totalTasks > 100 && <PerformanceMonitor />} */}
<Card
size="small"
className="mb-4"
styles={{ body: { padding: '12px 16px' } }}
>
<React.Suspense fallback={<div>Loading filters...</div>}>
<TaskListFilters position="board" />
</React.Suspense>
</Card>
{loadingGroups ? (
<Card>
<div className="flex justify-center items-center py-8">
@@ -281,11 +292,11 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
<SortableContext items={allGroupIds} strategy={horizontalListSortingStrategy}>
<div className="kanban-groups-container">
{taskGroups.map(group => (
<EnhancedKanbanGroup
key={group.id}
<EnhancedKanbanGroup
key={group.id}
group={group}
activeTaskId={dragState.activeTaskId}
overId={overId}
overId={overId as string | null}
/>
))}
</div>
@@ -293,8 +304,8 @@ const EnhancedKanbanBoard: React.FC<EnhancedKanbanBoardProps> = ({ projectId, cl
<DragOverlay>
{activeTask && (
<EnhancedKanbanTaskCard
task={activeTask}
<EnhancedKanbanTaskCard
task={activeTask}
isDragOverlay={true}
/>
)}

View File

@@ -15,10 +15,10 @@ interface EnhancedKanbanGroupProps {
// Performance threshold for virtualization
const VIRTUALIZATION_THRESHOLD = 50;
const EnhancedKanbanGroup: React.FC<EnhancedKanbanGroupProps> = React.memo(({
group,
const EnhancedKanbanGroup: React.FC<EnhancedKanbanGroupProps> = React.memo(({
group,
activeTaskId,
overId
overId
}) => {
const { setNodeRef, isOver } = useDroppable({
id: group.id,
@@ -33,7 +33,7 @@ const EnhancedKanbanGroup: React.FC<EnhancedKanbanGroupProps> = React.memo(({
// Get task IDs for sortable context
const taskIds = group.tasks.map(task => task.id!);
// Check if this group is the target for dropping
const isTargetGroup = overId === group.id;
const isDraggingOver = isOver || isTargetGroup;
@@ -56,7 +56,7 @@ const EnhancedKanbanGroup: React.FC<EnhancedKanbanGroupProps> = React.memo(({
// Memoize task rendering to prevent unnecessary re-renders
const renderTask = useMemo(() => (task: any, index: number) => (
<EnhancedKanbanTaskCard
<EnhancedKanbanTaskCard
key={task.id}
task={task}
isActive={task.id === activeTaskId}
@@ -68,7 +68,7 @@ const EnhancedKanbanGroup: React.FC<EnhancedKanbanGroupProps> = React.memo(({
const shouldShowDropIndicators = isDraggingOver && !shouldVirtualize;
return (
<div
<div
ref={setNodeRef}
className={`enhanced-kanban-group ${isDraggingOver ? 'drag-over' : ''}`}
>
@@ -81,14 +81,14 @@ const EnhancedKanbanGroup: React.FC<EnhancedKanbanGroupProps> = React.memo(({
</span>
)}
</div>
<div className="enhanced-kanban-group-tasks" ref={groupRef}>
{group.tasks.length === 0 && isDraggingOver && (
<div className="drop-preview-empty">
<div className="drop-indicator">Drop here</div>
</div>
)}
{shouldVirtualize ? (
// Use virtualization for large task lists
<SortableContext items={taskIds} strategy={verticalListSortingStrategy}>
@@ -112,21 +112,21 @@ const EnhancedKanbanGroup: React.FC<EnhancedKanbanGroupProps> = React.memo(({
<div className="drop-line"></div>
</div>
)}
<EnhancedKanbanTaskCard
<EnhancedKanbanTaskCard
task={task}
isActive={task.id === activeTaskId}
isDropTarget={overId === task.id}
/>
{/* Show drop indicator after last task if dropping at the end */}
{shouldShowDropIndicators &&
index === group.tasks.length - 1 &&
overId === group.id && (
<div className="drop-preview-indicator">
<div className="drop-line"></div>
</div>
)}
{shouldShowDropIndicators &&
index === group.tasks.length - 1 &&
overId === group.id && (
<div className="drop-preview-indicator">
<div className="drop-line"></div>
</div>
)}
</React.Fragment>
))}
</SortableContext>