Skip to content
Snippets Groups Projects
Commit 01d0b07d authored by Leander Tolksdorf's avatar Leander Tolksdorf
Browse files

add add, edit and delete sport

parent eb94277e
No related branches found
No related tags found
No related merge requests found
export async function getSportsFromApi() { export async function getSportsFromApi() {
try { const response = await fetch("/api/sport", {
const response = await fetch("/api/sport", { method: "GET",
method: "GET", });
}); const json = await response.json();
const sports = await response.json(); return json;
return sports.result;
} catch (error) {
console.log(error);
}
} }
export async function addSport() { type AddSportParameters = {
try { name: string;
const response = await fetch("/api/sport", { };
method: "POST",
}); export async function addSport({ name }: AddSportParameters) {
const sports = await response.json(); const response = await fetch("/api/sport", {
return sports; method: "POST",
} catch (error) { body: JSON.stringify({
console.log(error); name: name,
} }),
headers: {
"Content-Type": "application/json",
},
});
const json = await response.json();
return json;
}
type EditSportParameter = {
id: number;
name: string;
};
export async function editSport({ id, name }: EditSportParameter) {
const response = await fetch(`/api/sport/${id}`, {
method: "PATCH",
body: JSON.stringify({
name: name,
}),
headers: {
"Content-Type": "application/json",
},
});
const json = await response.json();
return json;
}
type DeleteSportParameter = {
id: number;
};
export async function deleteSportInApi({ id }: DeleteSportParameter) {
const response = await fetch(`/api/sport/${id}`, {
method: "DELETE",
});
const json = await response.json();
return json;
} }
...@@ -13,7 +13,7 @@ function StaffModal(props: { ...@@ -13,7 +13,7 @@ function StaffModal(props: {
hideText?: string; hideText?: string;
show: boolean; show: boolean;
}) { }) {
const {t} = useTranslation(); const { t } = useTranslation();
return ( return (
<Modal <Modal
header={props.header} header={props.header}
...@@ -31,22 +31,28 @@ function StaffModal(props: { ...@@ -31,22 +31,28 @@ function StaffModal(props: {
<Modal.Body> <Modal.Body>
<div>{props.children}</div> <div>{props.children}</div>
</Modal.Body> </Modal.Body>
<Modal.Footer className="justify-content-between"> {props.onHide ||
<Button (props.onSuccess && (
className="float-left" <Modal.Footer className="justify-content-between">
variant={props.hideColor || "secondary"} {props.onHide && (
onClick={props.onHide} <Button
> className="float-left"
{props.hideText || t("staffModal.Cancel")} variant={props.hideColor || "secondary"}
</Button> onClick={props.onHide}
{!props.hideSuccess ? <Button >
variant={props.successColor || "success"} {props.hideText || t("staffModal.Cancel")}
onClick={props.onSuccess} </Button>
> )}
{props.successText || t("staffModal.Done")} {props.onSuccess && (
</Button> : {}} <Button
variant={props.successColor || "success"}
</Modal.Footer> onClick={props.onSuccess}
>
{props.successText || t("staffModal.Done")}
</Button>
)}
</Modal.Footer>
))}
</Modal> </Modal>
); );
} }
......
import { Form } from "react-bootstrap"; import { Button, Form } from "react-bootstrap";
import { Controller, useForm } from "react-hook-form"; import { Controller, useForm } from "react-hook-form";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import validator from "validator"; import validator from "validator";
import { addSport, editSport } from "../../api/sport";
type FormData = { type FormData = {
id: number; id: number;
name: string; name: string;
}; };
function EditSports(props: any) { function EditSports(props: {
onSubmit?: Function;
id?: number;
name?: string;
}) {
const { const {
control, control,
handleSubmit, handleSubmit,
...@@ -18,17 +23,14 @@ function EditSports(props: any) { ...@@ -18,17 +23,14 @@ function EditSports(props: any) {
}); });
const { t } = useTranslation(); const { t } = useTranslation();
const onSubmit = (data: FormData) => { const onSubmit = async (data: FormData) => {
try { if (props.id) {
/** const response = await editSport(data);
* Logic to handle authentication. Should be separated into a service in another file. } else {
* await login(data); const response = await addSport(data);
* }
* if (props.onSubmit) {
* navigate("/boatManager"); props.onSubmit();
*/
} catch (e) {
alert("error");
} }
}; };
...@@ -71,15 +73,15 @@ function EditSports(props: any) { ...@@ -71,15 +73,15 @@ function EditSports(props: any) {
rules={{ rules={{
required: { required: {
value: true, value: true,
message: t("Sports.messages.required", { message: t("sports.messages.required", {
val: t("Sports.Name"), val: t("sports.Name"),
}), }),
}, },
validate: (value: string) =>
validator.isAlphanumeric(value) ||
t("Sports.messages.required").toString(),
}} }}
/> />
<Button type="submit" variant="secondary" className="mt-2 w-100">
{t(props.id ? "sports.Edit" : "sports.Add")}
</Button>
</Form> </Form>
); );
} }
......
...@@ -6,27 +6,31 @@ import { faPlus } from "@fortawesome/free-solid-svg-icons"; ...@@ -6,27 +6,31 @@ import { faPlus } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import StaffModal from "../../components/StaffModal"; import StaffModal from "../../components/StaffModal";
import EditSports from "../../components/forms/EditSports"; import EditSports from "../../components/forms/EditSports";
import { getSportsFromApi } from "../../api/sport"; import { deleteSportInApi, getSportsFromApi } from "../../api/sport";
import { Sport } from "../../types";
function Sports() { function Sports() {
const { t } = useTranslation(); const { t } = useTranslation();
const [editElement, setEditElement] = useState<Sport | undefined>(undefined); const [editElement, setEditElement] = useState<Sport | null>(null);
const [deleteElement, setDeleteElement] = useState<any>(undefined); const [deleteElement, setDeleteElement] = useState<Sport | null>(null);
const [addElement, setAddElement] = useState<any>(false); const [addElement, setAddElement] = useState<boolean>(false);
const [sports, setSports] = useState<Sport[]>([]); const [sports, setSports] = useState<Sport[]>([]);
async function getSports() { async function getSports() {
const sports = await getSportsFromApi(); const sports = await getSportsFromApi();
setSports(sports); setSports(sports.result);
} }
function onSubmitAddSport() { async function deleteSport() {
setAddElement(undefined); if (!deleteElement) return;
const response = await deleteSportInApi({ id: deleteElement.id });
await getSports();
setDeleteElement(null);
} }
useEffect(() => { useEffect(() => {
getSports(); getSports();
}); }, []);
return ( return (
<div className="m-1 h-100"> <div className="m-1 h-100">
...@@ -89,44 +93,31 @@ function Sports() { ...@@ -89,44 +93,31 @@ function Sports() {
{t("sports.AddSport")} {t("sports.AddSport")}
</Button> </Button>
</div> </div>
<StaffModal <StaffModal header={t("sports.AddSport")} show={addElement}>
header={t("sports.AddSport")} <EditSports
show={addElement} onSubmit={async () => {
successText={t("sports.Add")} setAddElement(false);
onHide={() => { await getSports();
setAddElement(false); }}
}} ></EditSports>
onSuccess={() => {
setAddElement(undefined);
}}
>
<EditSports></EditSports>
</StaffModal> </StaffModal>
<StaffModal <StaffModal header={t("sports.EditSport")} show={!!editElement}>
header={t("sports.EditSport")} <EditSports
show={!!editElement} id={editElement?.id}
successText={t("sports.Edit")} name={editElement?.name}
onHide={() => { onSubmit={async () => {
setEditElement(undefined); setEditElement(null);
}} await getSports();
onSuccess={() => { }}
setEditElement(undefined); ></EditSports>
}}
>
<EditSports id={editElement?.id} name={editElement?.name}></EditSports>
</StaffModal> </StaffModal>
<StaffModal <StaffModal
header={t("sports.DeleteSport")} header={t("sports.DeleteSport")}
hideColor="secondary" hideColor="secondary"
successText={t("sports.Delete")} successText={t("sports.Delete")}
successColor="danger" successColor="danger"
show={deleteElement} show={!!deleteElement}
onHide={() => { onSuccess={deleteSport}
setDeleteElement(undefined);
}}
onSuccess={() => {
setDeleteElement(undefined);
}}
> >
<span> <span>
{t("sports.messages.DeleteText", { val: deleteElement?.name })} {t("sports.messages.DeleteText", { val: deleteElement?.name })}
......
/// <reference types="react-scripts" /> /// <reference types="react-scripts" />
declare interface Sport {
id: number;
name: string;
}
...@@ -2,3 +2,9 @@ export interface Sport { ...@@ -2,3 +2,9 @@ export interface Sport {
id: number; id: number;
name: string; name: string;
} }
export interface Boat {
id: number;
name: string;
status: number;
type: number;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment