Skip to content

Commit b967285

Browse files
authored
Merge pull request #205 from SAMAHAN-Systems-Development/162-qa-projects-page-sorting-filter-not-working
fix: project page filter to work on z to a sort
2 parents 11d6f71 + ac43bff commit b967285

2 files changed

Lines changed: 78 additions & 43 deletions

File tree

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1-
'use client'
1+
"use client";
22

3-
import React, { useEffect, useState } from 'react'
4-
import ProjectsFilter from '../ui/ProjectsFilter'
5-
import SortDropdown from '../ui/SortDropdown'
6-
import { Project } from '@/lib/features/projects/types/projects';
7-
import ProjectCard from '../ui/ProjectCard';
8-
import ProjectsModal from '../ui/ProjectsModal';
9-
import { GetProjects } from '@/lib/features/projects/service/GetProjects.api';
10-
import ServiceProjectsIdeaInMind from '../ui/ServiceProjectsIdeaInMind';
3+
import React, { useEffect, useState } from "react";
4+
import ProjectsFilter from "../ui/ProjectsFilter";
5+
import SortDropdown from "../ui/SortDropdown";
6+
import { Project } from "@/lib/features/projects/types/projects";
7+
import ProjectCard from "../ui/ProjectCard";
8+
import ProjectsModal from "../ui/ProjectsModal";
9+
import { GetProjects } from "@/lib/features/projects/service/GetProjects.api";
10+
import ServiceProjectsIdeaInMind from "../ui/ServiceProjectsIdeaInMind";
1111

1212
function ProjectsDisplaySection() {
1313
const [openedProjectId, setOpenedProjectId] = useState<number | null>(null);
14-
const [selectedFilter, setSelectedFilter] = useState<'SAMAHAN' | 'Other'>('SAMAHAN');
14+
const [selectedFilter, setSelectedFilter] = useState<"SAMAHAN" | "Other">(
15+
"SAMAHAN"
16+
);
1517
// Separate states for sorting
16-
const [sortByName, setSortByName] = useState<'asc' | 'desc' | null>(null);
17-
const [sortByYear, setSortByYear] = useState<'yearDesc' | 'yearAsc' | null>(null);
18+
const [sortByName, setSortByName] = useState<"asc" | "desc" | null>(null);
19+
const [sortByYear, setSortByYear] = useState<"yearDesc" | "yearAsc" | null>(
20+
null
21+
);
1822

1923
const [projectsData, setProjectsData] = useState<Project[]>([]);
2024

@@ -25,9 +29,29 @@ function ProjectsDisplaySection() {
2529
if (sortByYear) {
2630
res = await GetProjects(undefined, undefined, sortByYear);
2731
} else if (sortByName) {
28-
// Map asc/desc to asc/desc for API
29-
const apiSort = sortByName === 'asc' ? 'asc' : 'desc';
30-
res = await GetProjects(undefined, apiSort, undefined);
32+
// For name sorting, fetch without sorting and sort on frontend
33+
console.log("Sorting by name:", sortByName);
34+
res = await GetProjects(undefined, undefined, undefined);
35+
36+
if (Array.isArray(res)) {
37+
const flattenedData = res.flat();
38+
// Sort on the frontend
39+
const sorted = [...flattenedData].sort((a, b) => {
40+
const titleA = a.title.toLowerCase();
41+
const titleB = b.title.toLowerCase();
42+
if (sortByName === "asc") {
43+
return titleA.localeCompare(titleB);
44+
} else {
45+
return titleB.localeCompare(titleA);
46+
}
47+
});
48+
setProjectsData(sorted);
49+
console.log(
50+
"Projects after frontend sorting:",
51+
sorted.map((p) => p.title)
52+
);
53+
return;
54+
}
3155
} else {
3256
res = await GetProjects();
3357
}
@@ -41,23 +65,26 @@ function ProjectsDisplaySection() {
4165
// Disable body scroll when modal is open
4266
useEffect(() => {
4367
if (openedProjectId) {
44-
document.body.style.overflow = 'hidden';
68+
document.body.style.overflow = "hidden";
4569
} else {
46-
document.body.style.overflow = '';
70+
document.body.style.overflow = "";
4771
}
4872
return () => {
49-
document.body.style.overflow = '';
73+
document.body.style.overflow = "";
5074
};
5175
}, [openedProjectId]);
5276

5377
return (
54-
<div className='w-full flex flex-col items-center py-16'>
55-
<div className='w-full max-w-4xl px-6 sm:px-10 lg:px-8'>
78+
<div className="w-full flex flex-col items-center py-16">
79+
<div className="w-full max-w-4xl px-6 sm:px-10 lg:px-8">
5680
<div className="mb-2">
57-
<ProjectsFilter selectedFilter={selectedFilter} setSelectedFilter={setSelectedFilter} />
81+
<ProjectsFilter
82+
selectedFilter={selectedFilter}
83+
setSelectedFilter={setSelectedFilter}
84+
/>
5885
</div>
5986
<div className="mb:3">
60-
<SortDropdown
87+
<SortDropdown
6188
sortByName={sortByName}
6289
setSortByName={setSortByName}
6390
sortByYear={sortByYear}
@@ -66,9 +93,11 @@ function ProjectsDisplaySection() {
6693
</div>
6794
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-5 gap-y-5">
6895
{(projectsData as Project[])
69-
.filter(project =>
70-
((selectedFilter === 'SAMAHAN' && (project.type == "internal")) ||
71-
(selectedFilter === 'Other' && (project.type == "external" || project.type == "cross_orgs")))
96+
.filter(
97+
(project) =>
98+
(selectedFilter === "SAMAHAN" && project.type == "internal") ||
99+
(selectedFilter === "Other" &&
100+
(project.type == "external" || project.type == "cross_orgs"))
72101
)
73102
.map((project, idx) => (
74103
<ProjectCard
@@ -79,15 +108,15 @@ function ProjectsDisplaySection() {
79108
))}
80109
</div>
81110
</div>
82-
<ServiceProjectsIdeaInMind/>
111+
<ServiceProjectsIdeaInMind />
83112
{openedProjectId && (
84113
<ProjectsModal
85114
openedProjectId={openedProjectId}
86115
setOpenedProjectId={setOpenedProjectId}
87116
/>
88117
)}
89118
</div>
90-
)
119+
);
91120
}
92121

93-
export default ProjectsDisplaySection
122+
export default ProjectsDisplaySection;

src/lib/features/projects/service/GetProjects.api.ts

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,30 @@ import { Project } from "../types/projects";
33
import { AxiosError } from "axios";
44

55
export const GetProjects = async (
6-
status: 'active' | 'not_active' | 'upcoming' | 'ongoing' | undefined = undefined,
7-
sortByName: 'desc' | 'asc' = 'desc',
8-
sortByYear: 'yearDesc' | 'yearAsc' = 'yearDesc',
9-
type: 'internal' | 'external' | 'cross_orgs' | undefined = undefined,
6+
status:
7+
| "active"
8+
| "not_active"
9+
| "upcoming"
10+
| "ongoing"
11+
| undefined = undefined,
12+
sortByName: "desc" | "asc" | undefined = undefined,
13+
sortByYear: "yearDesc" | "yearAsc" | undefined = undefined,
14+
type: "internal" | "external" | "cross_orgs" | undefined = undefined,
1015
page: number = 1,
11-
limit: number = 100,
16+
limit: number = 100
1217
) => {
1318
try {
14-
const url = `/api/projects?page=${page}&limit=${limit}` +
15-
(sortByName ? `&sortByName=${sortByName}` : '') +
16-
(sortByYear ? `&sortByYear=${sortByYear}` : '') +
17-
(type ? `&type=${type}` : '') +
18-
(status ? `&status=${status}` : '');
19-
const res = await request<ApiArrayRequest<Project[]>>('GET', url);
20-
//console.log(res);
19+
const url =
20+
`/api/projects?page=${page}&limit=${limit}` +
21+
(sortByName ? `&sortByName=${sortByName}` : "") +
22+
(sortByYear ? `&sortByYear=${sortByYear}` : "") +
23+
(type ? `&type=${type}` : "") +
24+
(status ? `&status=${status}` : "");
25+
console.log("API URL:", url);
26+
const res = await request<ApiArrayRequest<Project[]>>("GET", url);
27+
console.log("API Response:", res.data);
2128
return res.data;
22-
} catch(e) {
29+
} catch (e) {
2330
if (e instanceof Error) {
2431
//console.error(e.toString());
2532
} else if (e instanceof AxiosError) {
@@ -30,5 +37,4 @@ export const GetProjects = async (
3037
//console.log(e);
3138
return undefined;
3239
}
33-
}
34-
40+
};

0 commit comments

Comments
 (0)