feat: add filter for user's assigned tasks and update translation for 'mine'

This commit is contained in:
2025-10-14 12:55:28 +02:00
parent f1e7c2d7aa
commit 0e237a9549
2 changed files with 50 additions and 8 deletions

View File

@@ -16,15 +16,18 @@ import {
} from "date-fns";
import { formatDate } from "@/lib/utils";
import { useTranslation } from "@/lib/i18n";
import { useSession } from "next-auth/react";
export default function ProjectTasksList() {
const { t } = useTranslation();
const { data: session } = useSession();
const [allTasks, setAllTasks] = useState([]);
const [loading, setLoading] = useState(true);
const [searchTerm, setSearchTerm] = useState("");
const [groupBy, setGroupBy] = useState("none");
const [selectedTask, setSelectedTask] = useState(null);
const [showCommentsModal, setShowCommentsModal] = useState(false);
const [mine, setMine] = useState(true);
useEffect(() => {
const fetchAllTasks = async () => {
@@ -201,14 +204,25 @@ export default function ProjectTasksList() {
const taskGroups = groupTasksByStatus();
// Filter tasks based on search term
const filterTasks = (tasks) => {
if (!searchTerm) return tasks;
return tasks.filter(
(task) =>
task.task_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
task.project_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
task.city?.toLowerCase().includes(searchTerm.toLowerCase()) ||
task.address?.toLowerCase().includes(searchTerm.toLowerCase())
);
let filtered = tasks;
// Apply mine filter
if (mine && session?.user?.id) {
filtered = filtered.filter(task => task.assigned_to === session.user.id);
}
// Apply search term
if (searchTerm) {
filtered = filtered.filter(
(task) =>
task.task_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
task.project_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
task.city?.toLowerCase().includes(searchTerm.toLowerCase()) ||
task.address?.toLowerCase().includes(searchTerm.toLowerCase())
);
}
return filtered;
};
// Group tasks by task name when groupBy is set to "task_name"
@@ -552,6 +566,33 @@ export default function ProjectTasksList() {
<option value="task_name">{t("tasks.taskName")}</option>
</Select>
</div>
{session?.user && (
<button
onClick={() => setMine(!mine)}
className={`
inline-flex items-center space-x-2 px-3 py-1.5 rounded-full text-sm font-medium transition-all
${mine
? 'bg-blue-100 text-blue-700 border-2 border-blue-300 dark:bg-blue-900/30 dark:text-blue-300 dark:border-blue-700'
: 'bg-gray-100 text-gray-700 border-2 border-gray-200 hover:border-gray-300 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-700 dark:hover:border-gray-600'
}
`}
>
<svg
className="w-4 h-4"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
/>
</svg>
<span>{t('projects.mine') || 'Tylko moje'}</span>
</button>
)}
</div>
}
/>{" "}