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
|
|
|
|
|
2023-12-27 12:31:56 +03:30
|
|
|
|
console.log("----------------------------------", CTX.state.startAtTimeShift);
|
|
|
|
|
|
|
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"}
|
2023-12-27 12:31:56 +03:30
|
|
|
|
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"}
|
2023-12-27 12:31:56 +03:30
|
|
|
|
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;
|