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";
|
} from "date-fns";
|
||||||
import { formatDate } from "@/lib/utils";
|
import { formatDate } from "@/lib/utils";
|
||||||
import { useTranslation } from "@/lib/i18n";
|
import { useTranslation } from "@/lib/i18n";
|
||||||
|
import { useSession } from "next-auth/react";
|
||||||
|
|
||||||
export default function ProjectTasksList() {
|
export default function ProjectTasksList() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const { data: session } = useSession();
|
||||||
const [allTasks, setAllTasks] = useState([]);
|
const [allTasks, setAllTasks] = useState([]);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const [searchTerm, setSearchTerm] = useState("");
|
const [searchTerm, setSearchTerm] = useState("");
|
||||||
const [groupBy, setGroupBy] = useState("none");
|
const [groupBy, setGroupBy] = useState("none");
|
||||||
const [selectedTask, setSelectedTask] = useState(null);
|
const [selectedTask, setSelectedTask] = useState(null);
|
||||||
const [showCommentsModal, setShowCommentsModal] = useState(false);
|
const [showCommentsModal, setShowCommentsModal] = useState(false);
|
||||||
|
const [mine, setMine] = useState(true);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchAllTasks = async () => {
|
const fetchAllTasks = async () => {
|
||||||
@@ -201,14 +204,25 @@ export default function ProjectTasksList() {
|
|||||||
const taskGroups = groupTasksByStatus();
|
const taskGroups = groupTasksByStatus();
|
||||||
// Filter tasks based on search term
|
// Filter tasks based on search term
|
||||||
const filterTasks = (tasks) => {
|
const filterTasks = (tasks) => {
|
||||||
if (!searchTerm) return tasks;
|
let filtered = tasks;
|
||||||
return tasks.filter(
|
|
||||||
|
// 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.task_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
task.task_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
||||||
task.project_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
task.project_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
||||||
task.city?.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
task.city?.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
||||||
task.address?.toLowerCase().includes(searchTerm.toLowerCase())
|
task.address?.toLowerCase().includes(searchTerm.toLowerCase())
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return filtered;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Group tasks by task name when groupBy is set to "task_name"
|
// 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>
|
<option value="task_name">{t("tasks.taskName")}</option>
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</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>
|
</div>
|
||||||
}
|
}
|
||||||
/>{" "}
|
/>{" "}
|
||||||
|
|||||||
@@ -382,6 +382,7 @@ const translations = {
|
|||||||
sortBy: "Sortuj według",
|
sortBy: "Sortuj według",
|
||||||
allTasks: "Wszystkie zadania",
|
allTasks: "Wszystkie zadania",
|
||||||
myTasks: "Moje zadania",
|
myTasks: "Moje zadania",
|
||||||
|
mine: "Moje",
|
||||||
overdue: "Przeterminowane",
|
overdue: "Przeterminowane",
|
||||||
dueSoon: "Niedługo termin",
|
dueSoon: "Niedługo termin",
|
||||||
high: "Wysoki",
|
high: "Wysoki",
|
||||||
|
|||||||
Reference in New Issue
Block a user