web/plugins/BottomSheet/BottomSheetCreateShifts.jsx

373 lines
11 KiB
React
Raw Normal View History

2023-10-19 11:44:56 +03:30
"use client";
2023-10-26 00:26:44 +03:30
import React, { useContext, useEffect, useRef, useState } from "react";
2023-10-19 11:44:56 +03:30
import { BottomSheet } from "react-spring-bottom-sheet";
import Input from "plugins/Input/page";
import AppContext from "@ctx/AppContext";
2023-10-26 00:26:44 +03:30
import SimpleReactValidator from "simple-react-validator";
import { toast } from "react-toastify";
import Buttonbriz from "plugins/Buttonbriz/page";
2023-10-19 11:44:56 +03:30
const BottomSheetCreateShifts = (props) => {
const CTX = useContext(AppContext);
2023-10-26 00:26:44 +03:30
const [title, setTitle] = useState("");
const [description, setDescription] = useState("");
const [dayOfWeeksCurrent, setDayOfWeeksCurrent] = useState("");
2023-11-20 00:07:55 +03:30
const [routineId, setRoutineId] = useState([]);
const [routineIdSelectData, setRoutineIdSelectData] = useState("");
2023-10-26 00:26:44 +03:30
const [, forceUpdate] = useState();
2023-11-14 16:22:32 +03:30
const dayOfWeeksChoose = CTX.state.dayOfWeeksChoose;
2023-10-26 00:26:44 +03:30
const startAtTimeShift = CTX.state.startAtTimeShift;
const endAtTimeShift = CTX.state.endAtTimeShift;
const goToEditShift = CTX.state.goToEditShift;
const idEditShift = CTX.state.idEditShift;
const shiftData = CTX.state.shiftData;
2023-11-20 00:07:55 +03:30
const routinesData = CTX.state.routinesData;
2023-10-26 00:26:44 +03:30
const validator = useRef(
new SimpleReactValidator({
messages: {
required: "پر کردن این فیلد الزامی میباشد",
},
element: (message) => (
<>
<div className="text-right px-1 ">
<small className="text-red-600 t-ig-small ">{message}</small>
</div>
</>
),
})
);
2023-11-14 16:22:32 +03:30
const week = [
{ key: "شنبه", value: 6 },
{ key: "یکشنبه", value: 0 },
{ key: "دوشنبه", value: 1 },
{ key: "سه شنبه", value: 2 },
{ key: "چهار شنبه", value: 3 },
{ key: "پنج شنبه", value: 4 },
{ key: "جمعه", value: 5 },
];
2023-10-26 00:26:44 +03:30
const clear = () => {
setDayOfWeeksCurrent("");
setDescription("");
setTitle("");
2023-11-20 00:07:55 +03:30
setRoutineId([]);
2023-11-14 16:22:32 +03:30
CTX.setEndAtTimeShift(["00", "00"]);
CTX.setStartAtTimeShift(["00", "00"]);
CTX.setDayOfWeeksChoose([]);
2023-10-26 00:26:44 +03:30
};
const body = {
title,
description,
endAt: endAtTimeShift[0] + ":" + endAtTimeShift[1] + ":00",
startAt: startAtTimeShift[0] + ":" + startAtTimeShift[1] + ":00",
2023-11-14 16:22:32 +03:30
dayOfWeeks: dayOfWeeksChoose,
2023-11-20 00:07:55 +03:30
routines: routineId,
2023-10-26 00:26:44 +03:30
};
const bodyUpdate = {
title,
description,
endAt: endAtTimeShift[0] + ":" + endAtTimeShift[1] + ":00",
startAt: startAtTimeShift[0] + ":" + startAtTimeShift[1] + ":00",
2023-11-14 16:22:32 +03:30
dayOfWeeks: dayOfWeeksChoose,
2023-10-26 00:26:44 +03:30
id: shiftData.id,
2023-11-20 00:07:55 +03:30
routines: routineId,
2023-10-26 00:26:44 +03:30
};
const handleCreateShift = (update) => {
if (validator.current.allValid()) {
if (update == "UPDATE") {
CTX.UpdateShift(bodyUpdate);
} else {
CTX.CreateShift(body);
}
} else {
toast.error("پرکردن همه ی فیلد ها واجب است", {
position: "bottom-right",
autoClose: 2000,
hideProgressBar: false,
closeOnClick: true,
pauseOnHover: true,
draggable: true,
progress: undefined,
});
validator.current.showMessages();
forceUpdate(1);
}
};
const handleBottomSheetCreateShift = (e) => {
2023-11-20 00:07:55 +03:30
setRoutineIdSelectData(
routinesData.map((item) => ({
key: item.name,
value: item.id,
}))
);
2023-10-26 00:26:44 +03:30
if (e.type == "OPEN") {
if (goToEditShift) {
CTX.GetShift(idEditShift);
}
} else if (e.type == "CLOSE") {
CTX.setGoToEditShift(false);
CTX.setIdEditShift(null);
CTX.setShiftData([]);
// clear();
}
};
2023-11-14 16:22:32 +03:30
const deleteRole = (value) => {
CTX.setDayOfWeeksChoose(dayOfWeeksChoose.filter((el) => el !== value));
};
2023-10-26 00:26:44 +03:30
useEffect(() => {
if (goToEditShift) {
setTitle(shiftData.title);
setDescription(shiftData.description);
CTX.setStartAtTimeShift([
shiftData.startAt.split(":")[0],
shiftData.startAt.split(":")[1],
]);
CTX.setEndAtTimeShift([
shiftData.endAt.split(":")[0],
shiftData.endAt.split(":")[1],
]);
2023-11-20 00:07:55 +03:30
setRoutineId(shiftData.routines.map((item) => item.routineId));
2023-11-14 16:22:32 +03:30
CTX.setDayOfWeeksChoose(shiftData.days);
2023-10-26 00:26:44 +03:30
}
}, [shiftData]);
2023-10-19 11:44:56 +03:30
return (
<BottomSheet
2023-10-26 00:26:44 +03:30
onSpringStart={(e) => handleBottomSheetCreateShift(e)}
2023-10-19 11:44:56 +03:30
open={CTX.state.BottomSheetCreateShiftsOpen}
onDismiss={() => CTX.setBottomSheetCreateShiftsOpen(false)}
2023-10-26 00:26:44 +03:30
blocking={false}
2023-10-19 11:44:56 +03:30
>
<div className="text-center py-2 bg-primary-300 ">
<p className="mb-0 text-white relative top-[-5px]">
افزودن شیفت کاری جدید
</p>
</div>
<div className="bg-body-100 p-4 ">
<div className="">
<Input
2023-10-26 00:26:44 +03:30
lable="نام شیفت مورد نظر"
id="title-id"
name="title"
2023-10-19 11:44:56 +03:30
type={"text"}
2023-10-26 00:26:44 +03:30
value={title}
inputEvent={(e) => {
setTitle(e.target.value);
validator.current.showMessageFor("title");
}}
style="text-right"
validator={true}
validatorData={validator.current.message(
"title",
title,
"required"
)}
2023-10-19 11:44:56 +03:30
/>
</div>
<div className="">
<Input
2023-10-26 00:26:44 +03:30
lable=" ساعت شروع شیفت"
id="startAtTimeShift-id"
name="startAtTimeShift"
2023-10-19 11:44:56 +03:30
type={"text"}
value={startAtTimeShift[0] + ":" + startAtTimeShift[1]}
2023-10-26 00:26:44 +03:30
inputEvent={(e) => {
validator.current.showMessageFor("startAt");
}}
2023-11-14 16:22:32 +03:30
inputFocus={(e) => {
if (goToEditShift) {
toast.error("ویرایش ساعت ممکن نیست", {
position: "bottom-right",
closeOnClick: true,
});
} else {
CTX.setOpenTimePicker(true);
CTX.setBottomSheetCreateShiftsOpen(false);
CTX.setTimePickerOrder("CREATE-SHIFT-START");
e.preventDefault();
}
2023-10-26 00:26:44 +03:30
}}
style="text-right"
validator={true}
validatorData={validator.current.message(
"startAtTimeShift",
startAtTimeShift,
"required"
)}
2023-12-07 13:46:57 +03:30
readOnly={true}
2023-10-19 11:44:56 +03:30
/>
</div>
<div className="">
<Input
2023-10-26 00:26:44 +03:30
lable=" ساعت پایان شیفت"
id="endAtTimeShift-id"
name="endAtTimeShift"
2023-10-19 11:44:56 +03:30
type={"text"}
value={endAtTimeShift[0] + ":" + endAtTimeShift[1]}
2023-10-26 00:26:44 +03:30
inputEvent={(e) => {
validator.current.showMessageFor("startAt");
}}
2023-11-14 16:22:32 +03:30
inputFocus={(e) => {
if (goToEditShift) {
toast.error("ویرایش ساعت ممکن نیست", {
position: "bottom-right",
closeOnClick: true,
});
} else {
CTX.setOpenTimePicker(true);
CTX.setBottomSheetCreateShiftsOpen(false);
CTX.setTimePickerOrder("CREATE-SHIFT-END");
e.preventDefault();
}
2023-10-26 00:26:44 +03:30
}}
style="text-right"
validator={true}
validatorData={validator.current.message(
"endAtTimeShift",
endAtTimeShift,
"required"
)}
2023-11-14 16:22:32 +03:30
readOnly={true}
2023-10-19 11:44:56 +03:30
/>
</div>
2023-11-14 16:22:32 +03:30
<div className="">
<Input
lable="انتخاب روزهای این شیفت در هفته"
id="dayOfWeeksCurrent-id"
name="dayOfWeeksCurrent"
type={"text"}
value={dayOfWeeksCurrent}
inputEvent={(e) => {
setDayOfWeeksCurrent(e.target.value);
if (!!dayOfWeeksChoose.find((b) => b == e.target.value)) {
toast.error("روز تکراری است", {
position: "bottom-right",
closeOnClick: true,
});
} else {
CTX.setDayOfWeeksChoose((current) => [
...current,
parseInt(e.target.value),
]);
}
}}
style="text-right"
select={true}
selectData={[
{ key: "شنبه", value: parseInt(6) },
{ key: "یکشنبه", value: 0 },
{ key: "دوشنبه", value: 1 },
{ key: "سه شنبه", value: 2 },
{ key: "چهار شنبه", value: 3 },
{ key: "پنج شنبه", value: 4 },
{ key: "جمعه", value: 5 },
]}
defaultValue={"انتخاب کنید"}
/>
</div>
<div className="flex flex-wrap mt-3 rtl">
{dayOfWeeksChoose &&
dayOfWeeksChoose.map((e) => (
<div className="flex bg-gray-300 p-1 rounded-full m-1 justify-start">
<div
className="w-[30px] h-[30px] rounded-full bg-gray-400 "
onClick={() => deleteRole(e)}
></div>
<div>
<p className="mb-0 px-3 text-sm mt-1">
{week?.find((b) => b.value == e).key}
</p>
</div>
</div>
))}
</div>
2023-11-20 00:07:55 +03:30
<div className="">
<Input
lable="روتین شیفت"
id="routineId-id"
name="routineId"
type={"text"}
inputEvent={(e) => {
setRoutineId([e.target.value]);
}}
style="text-right"
validatorData={validator.current.message(
"routineId",
routineId[0],
"required"
)}
select={true}
selectData={routineIdSelectData}
defaultValue={"انتخاب کنید"}
/>
</div>
<div className="flex flex-wrap mt-3 rtl">
<div className="flex bg-gray-300 p-1 rounded-full m-1 justify-start">
<div>
<p className="mb-0 px-3 text-sm mt-1">
{routinesData?.find((b) => b.id == routineId[0])?.name}
</p>
</div>
</div>
</div>
2023-11-14 16:22:32 +03:30
2023-10-19 11:44:56 +03:30
<div className="">
<Input
2023-10-26 00:26:44 +03:30
lable=" توضیحات"
id="description-id"
name="description"
2023-10-19 11:44:56 +03:30
type={"text"}
2023-10-26 00:26:44 +03:30
value={description}
inputEvent={(e) => {
setDescription(e.target.value);
validator.current.showMessageFor("description");
}}
2023-10-19 11:44:56 +03:30
textarea={true}
2023-10-26 00:26:44 +03:30
style="text-right"
2023-10-19 11:44:56 +03:30
/>
</div>
2023-10-26 00:26:44 +03:30
{goToEditShift ? (
<Buttonbriz
title="ویرایش شیفت"
color="INFO"
icon="CHECK"
buttonEvent={() => handleCreateShift("UPDATE")}
subButton={true}
subButtonTitle="حذف شیفت"
subButtonEvent={() => CTX.DeleteShift(idEditShift)}
/>
) : (
<Buttonbriz
title="ثبت شیفت"
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCreateShift()}
/>
)}
2023-10-19 11:44:56 +03:30
</div>
</BottomSheet>
);
};
export default BottomSheetCreateShifts;