feat: add filter for user's assigned tasks and update translation for 'mine'
This commit is contained in:
@@ -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>
|
||||
}
|
||||
/>{" "}
|
||||
|
||||
Reference in New Issue
Block a user