web/plugins/BottomSheet/BottomSheetCreateTask.jsx

746 lines
22 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"use client";
import React, { useContext, useEffect, useRef, useState } from "react";
import { BottomSheet } from "react-spring-bottom-sheet";
import Input from "plugins/Input/page";
import AppContext from "@ctx/AppContext";
import SimpleReactValidator from "simple-react-validator";
import { toast } from "react-toastify";
import Buttonbriz from "plugins/Buttonbriz/page";
import { useRouter } from "next/navigation";
import DatePickerIran from "plugins/DatePickerIran/page";
import moment from "jalali-moment";
import Chapar from "plugins/Chapar";
const BottomSheetCreateTask = (props) => {
const CTX = useContext(AppContext);
const router = useRouter();
const [routinesSelectData, setRoutinesSelectData] = useState([]);
const [routineForTaskCurrent, setRoutineForTaskCurrent] = useState([]);
const [positionsSelectData, setPositionsSelectData] = useState([]);
const [positionsForTaskCurrent, setPositionsForTaskCurrent] = useState([]);
const [shiftsSelectData, setShiftsSelectData] = useState([]);
const [shiftsForTaskCurrent, setShiftsForTaskCurrent] = useState([]);
const [title, setTitle] = useState("");
const [description, setDescription] = useState("");
const [scheduleType, setScheduleType] = useState(1);
const [birthDateTimeStamp, setBirthDateTimeStamp] = useState(0);
const [shiftsDaysSelectData, setShiftsDaysSelectData] = useState(null);
const [shiftsDaysCurrent, setShiftsDaysCurrent] = useState(null);
const [, forceUpdate] = useState();
const routinesData = CTX.state.routinesData;
const positionsData = CTX.state.positionsData;
const shiftsData = CTX.state.shiftsData;
const routineForTaskChoose = CTX.state.routineForTaskChoose;
const positionsForTaskChoose = CTX.state.positionsForTaskChoose;
const shiftsForTaskChoose = CTX.state.shiftsForTaskChoose;
const shiftsDaysChoose = CTX.state.shiftsDaysChoose;
const goToEditTask = CTX.state.goToEditTask;
const taskData = CTX.state.taskData;
const idEditTask = CTX.state.idEditTask;
const schedule = [
{ key: "هفتگی", value: 1 },
{ key: "روزانه", value: 0 },
{ key: "مخصوص یک روز ", value: 2 },
];
const week = [
{ key: "شنبه", value: 6 },
{ key: "یکشنبه", value: 0 },
{ key: "دوشنبه", value: 1 },
{ key: "سه شنبه", value: 2 },
{ key: "چهار شنبه", value: 3 },
{ key: "پنج شنبه", value: 4 },
{ key: "جمعه", value: 5 },
];
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>
</>
),
})
);
const body = {
title,
description,
routines: routineForTaskChoose,
positions: positionsForTaskChoose,
shifts: shiftsForTaskChoose,
scheduleType,
setFor:
birthDateTimeStamp &&
moment
.utc(
[
birthDateTimeStamp.year,
birthDateTimeStamp.month,
birthDateTimeStamp.day,
],
"jYYYY-jMM-jDDTHH"
)
.unix(),
days: shiftsDaysChoose,
};
const bodyUpdate = {
title,
description,
routines: routineForTaskChoose,
positions: positionsForTaskChoose,
shifts: shiftsForTaskChoose,
scheduleType,
setFor:
birthDateTimeStamp &&
moment
.utc(
[
birthDateTimeStamp.year,
birthDateTimeStamp.month,
birthDateTimeStamp.day,
],
"jYYYY-jMM-jDDTHH"
)
.unix(),
days: shiftsDaysChoose,
id: idEditTask,
};
const clear = () => {
setPositionsForTaskCurrent([]);
// setPositionsSelectData([]);
setRoutineForTaskCurrent([]);
// setRoutinesSelectData([]);
setBirthDateTimeStamp(0);
setScheduleType([]);
setDescription("");
setTitle("");
setShiftsForTaskCurrent([]);
// setShiftsSelectData([]);
setShiftsDaysCurrent([]);
// setShiftsDaysSelectData([]);
CTX.setRoutineForTaskChoose([]);
CTX.setPositionsForTaskChoose([]);
CTX.setShiftsForTaskChoose([]);
CTX.setShiftsDaysChoose([]);
};
const CreateTask = async (body) => {
CTX.setLoading(true);
try {
const data = await Chapar.post(
`${process.env.NEXT_PUBLIC_API_URL}/task`,
JSON.stringify(body),
{
headers: {
Authorization: "Bearer " + localStorage.getItem("token"),
},
}
);
toast.success(`فعالیت ساخته شد`, {
position: "bottom-right",
closeOnClick: true,
});
clear();
CTX.setBottomSheetCreateTaskOpen(false);
CTX.setLoading(false);
} catch ({ error, status }) {
toast.error(`${error?.response?.data?.message}`, {
position: "bottom-right",
closeOnClick: true,
});
CTX.setLoading(false);
}
};
const UpdateTask = async (body) => {
CTX.setLoading(true);
try {
const data = await Chapar.put(
`${process.env.NEXT_PUBLIC_API_URL}/task`,
body,
{
headers: {
Authorization: "Bearer " + localStorage.getItem("token"),
},
}
);
toast.success(`فعالیت ویرایش شد`, {
position: "bottom-right",
closeOnClick: true,
});
// router->
CTX.setLoading(false);
CTX.setStopGetTasks(false);
CTX.setPageGetTasks(0);
CTX.setBottomSheetCreateTaskOpen(false);
} catch ({ error, status }) {
toast.error(`${error?.response?.data?.message}`, {
position: "bottom-right",
closeOnClick: true,
});
setLoading(false);
}
};
const handleCreateTask = (update) => {
if (scheduleType == 0) {
validator.current.message("shiftsDaysChoose", true, "required");
validator.current.message("birthDateTimeStamp", true, "required");
}
if (scheduleType == 1) {
validator.current.message("birthDateTimeStamp", true, "required");
}
if (scheduleType == 2) {
validator.current.message("shiftsDaysChoose", true, "required");
}
if (validator.current.allValid()) {
if (update == "UPDATE") {
UpdateTask(bodyUpdate);
} else {
CreateTask(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 deleteRoutineForTask = (value) => {
CTX.setRoutineForTaskChoose(
routineForTaskChoose.filter((el) => el !== value)
);
};
const deletePositionForTask = (value) => {
CTX.setPositionsForTaskChoose(
positionsForTaskChoose.filter((el) => el !== value)
);
};
const deleteShiftForTask = (value) => {
CTX.setShiftsForTaskChoose(
shiftsForTaskChoose.filter((el) => el !== value)
);
};
const deleteShiftsDaysForTask = (value) => {
CTX.setShiftsDaysChoose(shiftsDaysChoose.filter((el) => el !== value));
};
const handleBottomSheetCreateTaskOpen = (e) => {
if (e.type == "OPEN") {
CTX.GetRoutines();
CTX.GetPositions();
} else if (e.type == "CLOSE") {
clear();
}
};
useEffect(() => {
setRoutinesSelectData(
routinesData?.map((item) => ({
key: item?.name,
value: item?.id,
}))
);
}, [routinesData]);
useEffect(() => {
setPositionsSelectData(
positionsData?.map((item) => ({
key: item?.name,
value: item?.id,
}))
);
}, [positionsData]);
useEffect(() => {
setShiftsSelectData(
shiftsData?.map((item) => ({
key: item?.title,
value: item?.id,
}))
);
}, [shiftsData]);
useEffect(() => {
setShiftsDaysSelectData(
shiftsForTaskChoose?.length > 0 &&
shiftsData
?.find((e) => e?.id == shiftsForTaskChoose[0])
?.days?.map((item) => ({
key: week?.find((e) => e.value == item)?.key,
value: item,
}))
);
}, [shiftsForTaskChoose]);
useEffect(() => {
switch (scheduleType) {
case 0:
setBirthDateTimeStamp(0);
CTX.setShiftsDaysChoose([]);
break;
case 1:
setBirthDateTimeStamp(0);
break;
case 2:
CTX.setShiftsDaysChoose([]);
break;
default:
break;
}
}, [scheduleType]);
useEffect(() => {
if (goToEditTask) {
// const date = moment
// .unix(taskData.birthDateTimeStamp)
// .locale("fa")
// .format("YYYY/MM/DD")
// .split("/");
// setBirthDateTimeStamp({
// day: parseInt(date[2]),
// month: parseInt(date[1]),
// year: parseInt(date[0]),
// });
setScheduleType(taskData.scheduleType);
setDescription(taskData.description);
setTitle(taskData.title);
CTX.setRoutineForTaskChoose(
taskData.routines?.map((item) => item.routineId)
);
CTX.setPositionsForTaskChoose(
taskData.positions?.map((item) => item.positionId)
);
CTX.setShiftsDaysChoose(taskData.days?.map((item) => item.dayOfWeek));
CTX.setShiftsForTaskChoose(taskData.shifts?.map((item) => item.shiftId));
}
}, [taskData]);
return (
<BottomSheet
onSpringStart={(e) => handleBottomSheetCreateTaskOpen(e)}
open={CTX.state.BottomSheetCreateTaskOpen}
onDismiss={() => CTX.setBottomSheetCreateTaskOpen(false)}
blocking={true}
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">
افزودن تسک جدید{" "}
</p>
</div>
<div className="bg-white overflow-hidden p-5 rtl">
<div>
<div className="">
<Input
lable="عنوان فعالیت"
theme={1}
mt={6}
id="title-id"
name="title"
type={"text"}
value={title}
inputEvent={(e) => {
setTitle(e.target.value);
validator.current.showMessageFor("title");
}}
style="text-right"
validator={true}
validatorData={validator.current.message(
"title",
title,
"required"
)}
/>
</div>
<div className="">
<Input
lable=" توضیحات"
theme={1}
mt={6}
id="description-id"
name="description"
type={"text"}
value={description}
inputEvent={(e) => {
setDescription(e.target.value);
}}
textarea={true}
style="text-right"
/>
</div>
{/* ===========routine=============== */}
<div className="">
<Input
lable="روتین فعالیت"
theme={1}
mt={6}
id="routines-id"
name="routines"
type={"text"}
value={setRoutineForTaskCurrent}
inputEvent={(e) => {
setRoutineForTaskCurrent(e.target.value);
validator.current.showMessageFor("routines");
if (!!routineForTaskChoose.find((b) => b == e.target.value)) {
toast.error("روز تکراری است", {
position: "bottom-right",
closeOnClick: true,
});
} else {
CTX.setRoutineForTaskChoose(() => [e.target.value]);
}
}}
style="text-right"
validator={true}
validatorData={validator.current.message(
"routines",
routineForTaskChoose,
["required", { min: 1 }]
)}
select={true}
selectData={routinesSelectData}
defaultValue={"انتخاب کنید"}
/>
</div>
<div className="flex flex-wrap rtl">
{routineForTaskChoose &&
routineForTaskChoose.map((e, index) => (
<div
className="flex bg-gray-300 p-1 rounded-full m-1 justify-start mt-3"
key={index}
>
{/* <div
className="w-[30px] h-[30px] rounded-full bg-gray-400 "
onClick={() => deleteRoutineForTask(e)}
></div> */}
<div>
<p className="mb-0 px-3 text-sm">
{routinesData?.find((b) => b.id == e)?.name}
</p>
</div>
</div>
))}
</div>
{/* ===========position=============== */}
<div className="">
<Input
lable="پوزیشن فعالیت"
theme={1}
mt={6}
id="positions-id"
name="positions"
value={setPositionsForTaskCurrent}
type={"text"}
inputEvent={(e) => {
setPositionsForTaskCurrent(e.target.value);
validator.current.showMessageFor("positions");
if (positionsForTaskChoose.length >= 1) {
toast.error("شما فقط یک پوزیشن را میتوانید انتخاب کنید", {
position: "bottom-right",
closeOnClick: true,
});
} else {
if (
!!positionsForTaskChoose.find((b) => b == e.target.value)
) {
toast.error("پوزیشن تکراری است", {
position: "bottom-right",
closeOnClick: true,
});
} else {
CTX.setPositionsForTaskChoose((current) => [
...current,
e.target.value,
]);
}
}
}}
style="text-right"
validatorData={validator.current.message(
"positions",
positionsForTaskChoose,
["required", { min: 1 }]
)}
select={true}
selectData={positionsSelectData}
defaultValue={"انتخاب کنید"}
/>
</div>
<div className="flex flex-wrap rtl">
{positionsForTaskChoose &&
positionsForTaskChoose.map((e, index) => (
<div
className="flex bg-gray-300 p-1 rounded-full m-1 justify-start mt-3"
key={index}
>
<div
className="w-[20px] h-[20px] rounded-full bg-gray-400 "
onClick={() => deletePositionForTask(e)}
></div>
<div>
<p className="mb-0 px-3 text-sm ">
{positionsData?.find((b) => b.id == e)?.name}
</p>
</div>
</div>
))}
</div>
{/* ===========shifts=============== */}
<div className="">
<Input
lable="شیفت فعالیت"
theme={1}
mt={6}
id="shifts-id"
name="shifts"
type={"text"}
value={setShiftsForTaskCurrent}
inputEvent={(e) => {
setShiftsForTaskCurrent(e.target.value);
validator.current.showMessageFor("shifts");
if (!!shiftsForTaskChoose.find((b) => b == e.target.value)) {
toast.error("روز تکراری است", {
position: "bottom-right",
closeOnClick: true,
});
} else {
CTX.setShiftsForTaskChoose(() => [e.target.value]);
}
}}
style="text-right"
validatorData={validator.current.message(
"shifts",
shiftsForTaskChoose,
["required", { min: 1 }]
)}
select={true}
selectData={shiftsSelectData}
defaultValue={"انتخاب کنید"}
/>
</div>
<div className="flex flex-wrap rtl">
{shiftsForTaskChoose &&
shiftsForTaskChoose.map((e, index) => (
<div
className="flex bg-gray-300 p-1 rounded-full m-1 justify-start mt-3"
key={index}
>
{/* <div
className="w-[20px] h-[20px] rounded-full bg-gray-400 "
onClick={() => deleteShiftForTask(e)}
></div> */}
<div>
<p className="mb-0 px-3 text-sm ">
{shiftsData?.find((b) => b?.id == e)?.title}
</p>
</div>
</div>
))}
</div>
{/* ===========scheduleType=============== */}
<div className="">
<Input
lable="تکرار پذیری فعالیت"
id="scheduleType-id"
theme={1}
mt={6}
name="scheduleType"
type={"text"}
value={scheduleType}
inputEvent={(e) => {
setScheduleType(parseInt(e.target.value));
validator.current.showMessageFor("scheduleType");
}}
style="text-right"
validator={true}
validatorData={validator.current.message(
"scheduleType",
scheduleType,
["required"]
)}
select={true}
selectData={[
{ key: "هفتگی", value: 1 },
{ key: "روزانه", value: 0 },
{ key: "مخصوص یک روز ", value: 2 },
]}
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">
{schedule?.find((b) => b.value == scheduleType)?.key}
</p>
</div>
</div>
</div> */}
{/* ===========scheduleType setFor=============== */}
{scheduleType == 2 && (
<DatePickerIran
title="تاریخ مورد نظر فعالیت"
name="birthDateTimeStamp"
datePickerEvent={(e) => {
setBirthDateTimeStamp(e);
validator.current.showMessageFor("birthDateTimeStamp");
}}
date={birthDateTimeStamp}
zindex="z-[101]"
validator={true}
validatorData={validator.current.message(
"birthDateTimeStamp",
birthDateTimeStamp,
["required"]
)}
/>
)}
</div>
{/* ===========shiftsDaysTask=============== */}
{scheduleType == 1 && (
<>
<div className="">
<Input
lable="انتخاب روزهای این فعالیت در هفته"
theme={1}
mt={6}
id="shiftsDaysChoose-id"
name="shiftsDaysChoose"
type={"text"}
value={setShiftsDaysCurrent}
inputEvent={(e) => {
setShiftsDaysCurrent(e.target.value);
validator.current.showMessageFor("shiftsDaysChoose");
if (!!shiftsDaysChoose.find((b) => b == e.target.value)) {
toast.error("روز تکراری است", {
position: "bottom-right",
closeOnClick: true,
});
} else {
CTX.setShiftsDaysChoose((current) => [
...current,
parseInt(e.target.value),
]);
}
}}
validator={true}
validatorData={validator.current.message(
"shiftsDaysChoose",
shiftsDaysChoose,
["required", { min: 1 }]
)}
style="text-right"
select={true}
selectData={shiftsDaysSelectData}
defaultValue={"انتخاب کنید"}
/>
</div>
<div className="flex flex-wrap mt-3 rtl">
{shiftsDaysChoose &&
shiftsDaysChoose.map((e, index) => (
<div
className="flex bg-gray-300 p-1 rounded-full m-1 justify-start"
key={index}
>
<div
className="w-[20px] h-[20px] rounded-full bg-gray-400 "
onClick={() => deleteShiftsDaysForTask(e)}
></div>
<div>
<p className="mb-0 px-3 text-sm ">
{week?.find((b) => b.value == e).key}
</p>
</div>
</div>
))}
</div>
</>
)}
{goToEditTask ? (
<Buttonbriz
title="ویرایش فعالبت"
color="INFO"
icon="CHECK"
buttonEvent={() => handleCreateTask("UPDATE")}
subButton={true}
subButtonTitle="حذف فعالیت"
subButtonEvent={() => CTX.DeleteTask(idEditTask)}
/>
) : (
<Buttonbriz
title="ثبت فعالیت"
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCreateTask()}
/>
)}{" "}
</div>
</BottomSheet>
);
};
export default BottomSheetCreateTask;