vkashti / app / admin / tasks / TasksList.tsx
TasksList.tsx
Raw
'use client';
import { useState } from 'react';
import { useTasks, Task } from './TasksProvider';
import { FaTrash } from 'react-icons/fa';
import TaskDialog from './TaskDialog';

export default function TasksList() {
  const { tasks, updateTask, deleteTask, setIsDialogOpen, setSelectedTask, isDialogOpen, selectedTask } = useTasks();
  const [sortField, setSortField] = useState<keyof Task>('start_date');
  const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');

  const handleSort = (field: keyof Task) => {
    if (sortField === field) {
      setSortDirection(sortDirection === 'asc' ? 'desc' : 'asc');
    } else {
      setSortField(field);
      setSortDirection('asc');
    }
  };

  // Sort tasks based on sortField and sortDirection
  const sortedTasks = [...tasks].sort((a, b) => {
    let aField = a[sortField], bField = b[sortField];
    if (sortField === 'start_date') {
      const aDate = new Date(aField as string);
      const bDate = new Date(bField as string);
      return sortDirection === 'asc'
        ? aDate.getTime() - bDate.getTime()
        : bDate.getTime() - aDate.getTime();
    }
    // Compare numeric values
    if (typeof aField === 'number' && typeof bField === 'number') {
      return sortDirection === 'asc' ? aField - bField : bField - aField;
    }
    // Fallback to string comparison
    return sortDirection === 'asc'
      ? String(aField).localeCompare(String(bField))
      : String(bField).localeCompare(String(aField));
  });

  const handleRowClick = (task: Task) => {
    setSelectedTask(task);
    setIsDialogOpen(true);
  };

  const handleSave = (updatedFields: Partial<Task>) => {
    if (selectedTask?.id) {
      updateTask(selectedTask.id, updatedFields);
    }
  };

  const renderField = (task: Task, field: keyof Task) => {
    let displayValue = task[field];
    if (field === 'start_date' && typeof displayValue === 'string') {
      displayValue = new Date(displayValue).toLocaleDateString('bg-BG', {
        day: 'numeric',
        month: 'short',
        year: 'numeric'
      });
    }
    return <span>{displayValue}</span>;
  };

  if (tasks.length === 0) {
    return <p>Няма задачи.</p>;
  }

  return (
    <div>
      <div className="overflow-x-auto w-full">
        <table className="w-full table table-fixed min-w-[800px]">
          <thead>
            <tr className="bg-orange-200">
              <th className="sm:w-[300px] text-neutral cursor-pointer" onClick={() => handleSort('name')}>Име 📝</th>
              <th className="w-[150px] text-neutral cursor-pointer" onClick={() => handleSort('start_date')}>Начална Дата 📅</th>
              <th className="w-[150px] text-neutral cursor-pointer" onClick={() => handleSort('interval')}>Интервал </th>
              <th className="w-[100px] text-neutral cursor-pointer" onClick={() => handleSort('difficulty')}>Diff 🔥</th>
              <th className="w-[100px] text-neutral cursor-pointer" onClick={() => handleSort('time')}>Време </th>
              <th></th>
            </tr>
          </thead>
          <tbody>
            {sortedTasks.map((task) => (
              <tr 
                key={task.id} 
                onClick={() => handleRowClick(task)}
                className="hover:bg-orange-50 cursor-pointer"
              >
                <td>{renderField(task, 'name')}</td>
                <td>{renderField(task, 'start_date')}</td>
                <td>{renderField(task, 'interval')}дни</td>
                <td>{renderField(task, 'difficulty')}</td>
                <td>{renderField(task, 'time')}</td>
                <td className="text-right">
                  <button onClick={(e) => {
                    e.stopPropagation();
                    if (confirm('Сигурни ли сте, че искате да изтриете тази задача?')) {
                      deleteTask(task.id);
                    }
                  }}>
                    <FaTrash className="text-gray-600 hover:text-gray-800" />
                  </button>
                </td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>

      <TaskDialog
        isOpen={isDialogOpen}
        onClose={() => {
          setIsDialogOpen(false);
          setSelectedTask(undefined);
        }}
        onSave={handleSave}
        onDelete={deleteTask}
        task={selectedTask}
      />
    </div>
  );
}