Files
mwitnessing/components/cartevent/CartEventForm.tsx
2024-05-05 20:43:47 +02:00

197 lines
7.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { CartEvent } from '@prisma/client';
import Link from "next/link";
import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import toast from "react-hot-toast";
import axiosInstance from '../../src/axiosSecure';
import DayOfWeek from "../DayOfWeek";
import common from 'src/helpers/common';
/*
model CartEvent {
id Int @id @default(autoincrement())
startTime DateTime
endTime DateTime
shiftDuration Int
shifts Shift[]
dayofweek DayOfWeek
isActive Boolean @default(true)
}*/
interface Location {
id: number;
name: string;
}
interface IProps {
item?: CartEvent;
locations: Location[];
inline?: false;
}
export default function CartEventForm(props: IProps) {
const router = useRouter();
console.log("init CartEventForm: " + JSON.stringify(props));
const urls = {
apiUrl: "/api/data/cartevents/",
indexUrl: "/cart/cartevents"
}
const [evt, setEvt] = useState(props.item || {
id: router.query.id,
startTime: "09:00",//8:00
endTime: "19:30",//20:00
shiftDuration: 90,//120
dayofweek: "Monday",
});
//const locations = props?.locations || [];
//get locations from api
const [locations, setLocations] = useState(props?.locations || []);
useEffect(() => {
const fetchLocations = async () => {
try {
console.log("fetching locations");
const { data } = await axiosInstance.get("/api/data/locations");
setLocations(data);
console.log(data);
} catch (error) {
console.error(error);
}
};
if (!locations.length) {
fetchLocations();
}
}, []);
useEffect(() => {
const fetch = async (id) => {
try {
console.log("fetching cart event from component " + router.query.id);
const { data } = await axiosInstance.get(urls.apiUrl + id);
data.startTime = common.getTimeFormatted(data.startTime)
data.endTime = common.getTimeFormatted(data.endTime)
setEvt(data);
console.log("id:" + evt.id);
//console.log(data);
} catch (error) {
console.error(error);
}
};
if (!props?.item) {
setEvt(prevEvt => ({ ...prevEvt, id: router.query.id as string }));
}
if (evt.id) {
fetch(parseInt(evt.id));
}
}, [router.query.id]);
const handleChange = ({ target }) => {
console.log("CartEventForm.handleChange() " + target.name + " = " + target.value);
if (target.type === "checkbox") {
setEvt({ ...evt, [target.name]: target.checked });
} else if (target.type === "number") {
console.log("setting " + target.name + " to " + parseInt(target.value));
setEvt({ ...evt, [target.name]: parseInt(target.value) });
} else {
setEvt({ ...evt, [target.name]: target.value });
}
console.log("CartEventForm.handleChange() " + JSON.stringify(evt));
}
const handleSubmit = async (e) => {
e.preventDefault();
try {
const eventId = evt.id;
delete evt.id;
evt.startTime = common.parseTimeHHmm(evt.startTime.toString());
evt.endTime = common.parseTimeHHmm(evt.endTime.toString());
console.log("calling api @ " + urls.apiUrl + evt.id);
console.log(evt);
if (eventId) { //update
// evt.location = {
// id: evt.locationId
// };
delete evt.locationId;
await axiosInstance.put(urls.apiUrl + router.query.id, {
...evt,
});
toast.success("Task Updated", {
position: "bottom-center",
});
} else {
evt.locationId = parseInt(evt.locationId?.toString());
await axiosInstance.post(urls.apiUrl, evt);
toast.success("Task Saved", {
position: "bottom-center",
});
}
// if (props.inline) {
// } else {
router.push(urls.indexUrl);
// }
} catch (error) {
// toast.error(error.response.data.message);
console.error(error);
}
};
return (
<div className="w-full max-w-xs mt-5 mx-auto shadow-md shadow-gray-500">
<h3 className='p-5 pb-0 text-center text-lg '>{evt.id ? "Edit '" + evt.dayofweek + "'" : "Create"} Cart Event</h3>
<form className="form mb-0" onSubmit={handleSubmit}>
<label className='label' htmlFor="location">Location</label>
{locations && (
<select name="locationId" id="locationId" onChange={handleChange} value={evt.locationId}>
{locations.map((loc: Location) => (
<option key={loc.id} value={loc.id} type="number">{loc.name}</option>
))}
</select>
)}
<label className='label' htmlFor="dayofweek">Day of Week</label>
<DayOfWeek onChange={handleChange} selected={evt.dayofweek} />
<label className='label' htmlFor="startTime">Start Time</label>
<input className="shadow border form-input" type="time" name="startTime" id="startTime" onChange={handleChange} value={evt.startTime} />
<label className='label' htmlFor="endTime">End Time</label>
<input className="shadow border form-input" type="time" name="endTime" id="endTime" onChange={handleChange} value={evt.endTime} />
<label className='label' htmlFor="shiftDuration">Shift Duration</label>
<input className="shadow border form-input" type="number" name="shiftDuration" id="shiftDuration" onChange={handleChange} value={evt.shiftDuration} />
<label className='label' htmlFor="numberOfPublishers">Max Shifts</label>
<input className="shadow border form-input" type="number" name="numberOfPublishers" id="numberOfPublishers" onChange={handleChange} value={evt.numberOfPublishers} />
<div className="mb-4">
<div className="form-check">
<input className="checkbox" type="checkbox" name="isActive" id="isActive" checked={evt.isActive} onChange={handleChange} />
<label className='label align-text-bottom' htmlFor="isActive">Active</label>
</div>
</div>
<div className="panel-actions">
{!props?.inline && <Link href={urls.indexUrl} className="action-button"> Отмени </Link>}
{evt.id &&
<button className="button bg-red-500 hover:bg-red-700 focus:outline-none focus:shadow-outline" type="button" onClick={async () => {
await axiosInstance.delete(urls.apiUrl + router.query.id);
router.push(urls.indexUrl);
}}>
Изтрий
</button>}
<button className="button bg-blue-500 hover:bg-blue-700 focus:outline-none focus:shadow-outline" type="submit"> {evt.id ? "Обнови" : "Създай"}</button>
</div>
</form >
</div >
)
}