Skip to content

Commit 9e76c29

Browse files
authored
Merge pull request #500 from hotosm/refactor
Added a new filter option (Filter by Project Status) in projects page
2 parents 067e961 + 47add29 commit 9e76c29

File tree

4 files changed

+52
-12
lines changed

4 files changed

+52
-12
lines changed

src/backend/app/drones/drone_routes.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
from app.config import settings
88
from app.drones import drone_schemas, drone_deps
99
from psycopg import Connection
10-
10+
from app.users.permissions import (
11+
IsSuperUser,
12+
check_permissions,
13+
)
1114

1215
router = APIRouter(
1316
prefix=f"{settings.API_PREFIX}/drones",
@@ -31,7 +34,7 @@ async def read_drones(
3134
async def create_drone(
3235
drone_info: drone_schemas.DroneIn,
3336
db: Annotated[Connection, Depends(database.get_db)],
34-
user_data: Annotated[AuthUser, Depends(login_required)],
37+
user_data: Annotated[AuthUser, Depends(check_permissions(IsSuperUser()))],
3538
):
3639
"""Create a new drone in database"""
3740
drone_id = await drone_schemas.DbDrone.create(db, drone_info)
@@ -42,7 +45,7 @@ async def create_drone(
4245
async def delete_drone(
4346
drone: Annotated[drone_schemas.DbDrone, Depends(drone_deps.get_drone_by_id)],
4447
db: Annotated[Connection, Depends(database.get_db)],
45-
user_data: Annotated[AuthUser, Depends(login_required)],
48+
user_data: Annotated[AuthUser, Depends(check_permissions(IsSuperUser()))],
4649
):
4750
"""
4851
Deletes a drone record from the database.
@@ -56,8 +59,6 @@ async def delete_drone(
5659
dict: A success message if the drone was deleted.
5760
"""
5861

59-
# TODO: Check user role, Admin can only do this.
60-
# After user roles introduction
6162
drone_id = await drone_schemas.DbDrone.delete(db, drone.id)
6263
return {"message": f"Drone successfully deleted {drone_id}"}
6364

src/frontend/src/components/Projects/ProjectsHeader/index.tsx

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ export default function ProjectsHeader() {
1818
const projectsFilterByOwner = useTypedSelector(
1919
state => state.createproject.ProjectsFilterByOwner,
2020
);
21+
const selectedProjectStatus = useTypedSelector(
22+
state => state.createproject.selectedProjectStatus
23+
);
2124
const [searchValue, setSearchValue] = useState('');
2225
const debouncedValue = useDebounceListener(searchValue || '', 300);
2326

@@ -30,7 +33,7 @@ export default function ProjectsHeader() {
3033
<FlexRow className="naxatw-flex naxatw-w-full naxatw-items-center naxatw-justify-between naxatw-gap-4 md:naxatw-w-[65%]">
3134
<h5 className="naxatw-font-bold">Projects</h5>
3235
<FlexRow gap={3} className="">
33-
<div>
36+
<div className='naxatw-flex naxatw-items-center naxatw-gap-2'>
3437
<Select
3538
placeholder="Select"
3639
options={[
@@ -50,6 +53,26 @@ export default function ProjectsHeader() {
5053
)
5154
}
5255
/>
56+
<Select
57+
placeholder="Filter By Project Status"
58+
options={[
59+
{
60+
label: 'Not Started',
61+
value: 'not-started',
62+
},
63+
{ label: 'On Going', value: 'ongoing' },
64+
{ label: 'Completed', value: 'completed' },
65+
]}
66+
labelKey="label"
67+
valueKey="value"
68+
className="!naxatw-w-[150px] "
69+
selectedOption={selectedProjectStatus}
70+
onChange={value =>
71+
dispatch(
72+
setCreateProjectState({ selectedProjectStatus: value }),
73+
)
74+
}
75+
/>
5376
</div>
5477
<div>
5578
<SearchInput

src/frontend/src/store/slices/createproject.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export interface CreateProjectState {
2525
imageMergeType: string;
2626
ProjectsFilterByOwner: 'yes' | 'no';
2727
requiresApprovalFromRegulator: 'required' | 'not_required';
28+
selectedProjectStatus: string;
2829
regulatorEmails: string[] | [];
2930
demType: string;
3031
}
@@ -53,6 +54,7 @@ const initialState: CreateProjectState = {
5354
requiresApprovalFromRegulator: 'not_required',
5455
regulatorEmails: [],
5556
demType: 'auto',
57+
selectedProjectStatus: ''
5658
};
5759

5860
const setCreateProjectState: CaseReducer<

src/frontend/src/views/Projects/index.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ const Projects = () => {
2323
const projectsFilterByOwner = useTypedSelector(
2424
state => state.createproject.ProjectsFilterByOwner,
2525
);
26+
const projectFilterByStatus = useTypedSelector(
27+
state => state.createproject.selectedProjectStatus,
28+
);
2629
const projectSearchKey = useTypedSelector(
2730
state => state.common.projectSearchKey,
2831
);
@@ -35,16 +38,26 @@ const Projects = () => {
3538
setSetPaginationState(prev => ({ ...prev, ...value }));
3639
};
3740

38-
// fetch api for projectsList
39-
const { data: projectListData, isFetching: isLoading }: Record<string, any> =
40-
useGetProjectsListQuery({
41-
queryKey: {
42-
// @ts-ignore
41+
const filterParams = projectFilterByStatus
42+
? {
4343
filter_by_owner: projectsFilterByOwner === 'yes',
44+
status: projectFilterByStatus,
4445
page: paginationState?.activePage,
4546
results_per_page: paginationState?.selectedNumberOfRows,
4647
search: projectSearchKey,
47-
},
48+
}
49+
: {
50+
filter_by_owner: projectsFilterByOwner === 'yes',
51+
page: paginationState?.activePage,
52+
results_per_page: paginationState?.selectedNumberOfRows,
53+
search: projectSearchKey,
54+
};
55+
56+
// fetch api for projectsList
57+
const { data: projectListData, isFetching: isLoading }: Record<string, any> =
58+
useGetProjectsListQuery({
59+
// @ts-ignore
60+
queryKey: { ...filterParams },
4861
});
4962

5063
// fetch project centroid
@@ -65,6 +78,7 @@ const Projects = () => {
6578
return (
6679
<section className="naxatw-px-3 naxatw-pt-2 lg:naxatw-px-16">
6780
<ProjectsHeader />
81+
6882
<div className="naxatw-grid naxatw-gap-2 naxatw-pb-10 md:naxatw-flex md:naxatw-h-[calc(100vh-11rem)] md:naxatw-pb-0">
6983
<div
7084
className={`scrollbar naxatw-grid naxatw-grid-rows-[19rem] naxatw-gap-3 naxatw-overflow-y-auto naxatw-py-2 ${showMap ? 'naxatw-w-full naxatw-grid-cols-1 md:naxatw-w-1/2 md:naxatw-grid-cols-1 lg:naxatw-grid-cols-2 xl:naxatw-grid-cols-3' : 'naxatw-w-full naxatw-grid-cols-1 sm:naxatw-grid-cols-2 md:naxatw-grid-cols-3 lg:naxatw-grid-cols-6'}`}

0 commit comments

Comments
 (0)