Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion client/src/components/common/UserActions.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ export default function UserActions() {
تعيين قائد لقطاع
</Button>
<Button
disabled
linkTo={ActionRoutes["Add Sector"]}
className="Button--medium Button--regular"
>
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/common/nav.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export default function Nav() {
<nav className="Nav">
<div className="container">
<div className="Nav__logo">
<Link to="/">
<Link to={show ? "/dashboard" : "/"}>
<img src={logo} alt="logo" />
<h2 className="logo-text">كشافة</h2>
</Link>
Expand Down
118 changes: 118 additions & 0 deletions client/src/components/insert-sector/InsertSector.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import { useEffect, useState } from "react";
import Button from "../common/Button";
import PageTitle from "../common/PageTitle";
import TextInput from "../common/Inputs";
import "./InsertSector.scss";
import { useInsertSectorMutation } from "../../redux/slices/sectorApiSlice";
import { toast } from "react-toastify";
import { useGetCaptainsQuery } from "../../redux/slices/captainsApiSlice";
import CustomSelect from "../common/CustomSelect";

export default function InsertSector() {
const [sectorBaseName, setSectorBaseName] = useState("");
const [sectorSuffixName, setSectorSuffixName] = useState("");
const [unitSectorLeader, setUnitSectorLeader] = useState("");

const [insertSector, { isLoading: isLoadingInsertSector }] =
useInsertSectorMutation();

let unitCaptains = [];

const { data, isFetching } = useGetCaptainsQuery();

if (data && !isFetching) {
unitCaptains = data.body.filter((captain) => captain.type === "unit");
if (unitCaptains.length === 0) {
unitCaptains = [{ captainId: "", firstName: "لا يوجد قادة" }];
}
}

useEffect(() => {
if (unitCaptains.length === 1) {
setUnitSectorLeader(unitCaptains[0].captainId);
}
}, [unitCaptains]);

const handleSubmit = async (e) => {
e.preventDefault();
const newSector = {
baseName: sectorBaseName,
suffixName: sectorSuffixName,
unitCaptainId: unitSectorLeader,
};
console.log(newSector);

// Try To Insert New Sector
try {
const res = await insertSector(newSector).unwrap();
if (res.status === 400 || res.status === 500)
throw new Error("Something went wrong while inserting the sector");
toast.success("تم إنشاء القطاع بنجاح");
} catch (err) {
toast.error("حدث خطأ أثناء إنشاء القطاع");
toast.error(JSON.stringify(err));
}
};

return (
<div className="insert-sector container">
<PageTitle title="إنشاء قطاع جديد" />

<form onSubmit={handleSubmit} className="insert-sector__from">
<div className="insert-sector__form__container">
<TextInput
label="اسم القطاع"
type="text"
name="sectorBaseName"
value={sectorBaseName}
onChange={(e) => setSectorBaseName(e.target.value)}
placeholder="اسم القطاع"
required
/>
<TextInput
label="رقم القطاع"
type="text"
name="sectorSuffixName"
value={sectorSuffixName}
onChange={(e) => setSectorSuffixName(e.target.value)}
placeholder="مثل: أ, ب, ج"
required
/>
<CustomSelect
data={unitCaptains}
label="قائد القطاع"
name="unitSectorLeader"
selectedValue={unitSectorLeader}
onChange={(e) => {
setUnitSectorLeader(e.target.value);
}}
required
displayMember="firstName"
valueMember="captainId"
/>
{isFetching && (
<p
style={{
direction: "rtl",
}}
>
جاري التحميل
</p>
)}
</div>
<Button className="insert-sector__btn Button--medium Button--primary-darker">
إنشاء
</Button>
{isLoadingInsertSector && (
<p
style={{
direction: "rtl",
}}
>
جاري الإنشاء
</p>
)}
</form>
</div>
);
}
19 changes: 19 additions & 0 deletions client/src/components/insert-sector/InsertSector.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
.insert-sector {
display: flex;
flex-direction: column;

&__from {
margin-block: 1rem;
}
&__form__container {
display: grid;
gap: 1rem;
margin-block: 1rem;
}
&__btn {
margin-block: 2rem;
width: 50%;
display: block;
margin-inline: auto;
}
}
Empty file.
8 changes: 7 additions & 1 deletion client/src/redux/slices/captainsApiSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@ export const captainsApi = apiSlice.injectEndpoints({
method: "GET",
}),
}),
GetUnitCaptains: builder.query({
query: () => ({
url: `${CAPTAINS_URL}/`,
method: "GET",
}),
}),
}),
});

export const { useGetCaptainsQuery } = captainsApi;
export const { useGetCaptainsQuery, useGetUnitCaptainsQuery } = captainsApi;
29 changes: 29 additions & 0 deletions client/src/redux/slices/sectorApiSlice.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { apiSlice } from "./apiSlice";

const SECTOR_URL = "/api/sector";

export const captainsApi = apiSlice.injectEndpoints({
endpoints: (builder) => ({
InsertSector: builder.mutation({
query: (sector) => ({
url: `${SECTOR_URL}/`,
method: "POST",
body: sector,
}),
}),
UpdateSectorUnitCaptain: builder.mutation({
query: (sector) => ({
url: `${SECTOR_URL}/:baseName/:suffixName`,
method: "PATCH",
body: sector,
params: {
baseName: sector.baseName,
suffixName: sector.suffixName,
},
}),
}),
}),
});

export const { useInsertSectorMutation, useUpdateSectorUnitCaptainMutation } =
captainsApi;
2 changes: 2 additions & 0 deletions client/src/routes.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import Dashboard from "./components/dashboard/Dashboard";
import CaptainProfile from "./components/captain-profile/CaptainProfile";
import InsertTermPage from "./components/insert-term/InsertTermPage";
import UpdateTermPage from "./components/update-term-page/UpdateTermPage";
import InsertSector from "./components/insert-sector/InsertSector";

function Routes() {
return (
Expand All @@ -34,6 +35,7 @@ function Routes() {
<Route exact path="/profile" element={<CaptainProfile />} />
<Route exact path="/start-new-term" element={<InsertTermPage />} />
<Route exact path="/edit-term" element={<UpdateTermPage />} />
<Route exact path="/add-sector" element={<InsertSector />} />
</Route>

{/* Testing Routes */}
Expand Down
Empty file removed client/src/services/api.js
Empty file.