diff --git a/Dockerfile.emergency b/Dockerfile.emergency index 72216e6..7df8569 100644 --- a/Dockerfile.emergency +++ b/Dockerfile.emergency @@ -10,4 +10,5 @@ COPY next.config.js ./next.config.js EXPOSE 3000 ENV PORT 3000 -CMD ["node_modules/.bin/next", "start"] \ No newline at end of file +CMD ["/app/node_modules/.bin/next", "start"] + diff --git a/components/ShiftComponent/ShiftCard/page.jsx b/components/ShiftComponent/ShiftCard/page.jsx index 9adcb0d..2421a06 100644 --- a/components/ShiftComponent/ShiftCard/page.jsx +++ b/components/ShiftComponent/ShiftCard/page.jsx @@ -109,7 +109,7 @@ const ShiftCard = () => { -
+ {/*
{e?.days.map((e) => (

@@ -118,7 +118,7 @@ const ShiftCard = () => {

))} -
+
*/} ))} diff --git a/datacalender.js b/datacalender.js new file mode 100644 index 0000000..5a0460b --- /dev/null +++ b/datacalender.js @@ -0,0 +1,401 @@ +export const PersianM = (month) => { + console.log("montssh", month); + switch (month) { + case (month = "1"): + return "month"; + case (month = "2"): + return "اردیبهشت"; + case (month = "3"): + return "خرداد"; + case (month = "4"): + return " تیر"; + case (month = "5"): + return "آمرداد"; + case (month = "6"): + return "شهریور"; + case (month = "7"): + return "مهر"; + case (month = "8"): + return "آبان"; + case (month = "9"): + return "آذر"; + case (month = "10"): + return "دی"; + case (month = "11"): + return "بهمن"; + case (month = "12"): + return "اسفند"; + default: + return "ماه"; + } +}; + +export const PersianDay = (dayOfWeek) => { + switch (dayOfWeek) { + case (dayOfWeek = "Sunday"): + return "یکشنبه"; + case (dayOfWeek = "Monday"): + return "دوشنبه"; + case (dayOfWeek = "Tuesday"): + return "سه شنبه"; + case (dayOfWeek = "Wednesday"): + return "چهار شنبه"; + case (dayOfWeek = "Thursday"): + return "پنج شنبه"; + case (dayOfWeek = "Friday"): + return "جمعه"; + case (dayOfWeek = "Saturday"): + return "شنبه"; + default: + return null; + } +}; +//Solution to find holidays in persian calendar +//https://www.time.ir/fa/eventyear-%D8%AA%D9%82%D9%88%DB%8C%D9%85-%D8%B3%D8%A7%D9%84%DB%8C%D8%A7%D9%86%D9%87 +// Array.from(document.querySelectorAll("li[class='eventHoliday ']"),(node=> ({date:'1402/'+( Array.from(document.querySelectorAll("div[class='col-md-12']>div>div>span>span>span"),node=>node.innerText).findIndex(x=>x === node.innerText.split(" ")[1]) +1).toString() +"/"+node.innerText.split(" ")[0].replace(/[۰-۹]/g, d => '۰۱۲۳۴۵۶۷۸۹'.indexOf(d)),description:node.innerText.split(" ").slice(2).join(" ")}) )) +export const holidays = { + y1404: [ + { + date: "1404/1/1", + description: "جشن نوروز/جشن سال نو", + }, + { + date: "1404/1/2", + description: "عیدنوروز", + }, + { + date: "1404/1/2", + description: "شهادت حضرت علی علیه السلام [ ٢١ رمضان ]", + }, + { + date: "1404/1/3", + description: "عیدنوروز", + }, + { + date: "1404/1/4", + description: "عیدنوروز", + }, + { + date: "1404/1/11", + description: "عید سعید فطر [ ١ شوال ]", + }, + { + date: "1404/1/12", + description: "روز جمهوری اسلامی", + }, + { + date: "1404/1/12", + description: "تعطیل به مناسبت عید سعید فطر [ ٢ شوال ]", + }, + { + date: "1404/1/13", + description: "جشن سیزده به در", + }, + { + date: "1404/2/4", + description: "شهادت امام جعفر صادق علیه السلام [ ٢٥ شوال ]", + }, + { + date: "1404/3/14", + description: "رحلت حضرت امام خمینی", + }, + { + date: "1404/3/15", + description: "قیام 15 خرداد", + }, + { + date: "1404/3/17", + description: "عید سعید قربان [ ١٠ ذوالحجه ]", + }, + { + date: "1404/3/25", + description: "عید سعید غدیر خم [ ١٨ ذوالحجه ]", + }, + { + date: "1404/4/14", + description: "تاسوعای حسینی [ ٩ محرم ]", + }, + { + date: "1404/4/15", + description: "عاشورای حسینی [ ١٠ محرم ]", + }, + { + date: "1404/5/24", + description: "اربعین حسینی [ ٢٠ صفر ]", + }, + { + date: "1404/6/1", + description: "رحلت رسول اکرم؛شهادت امام حسن مجتبی علیه السلام [ ٢٨ صفر ]", + }, + { + date: "1404/6/2", + description: "شهادت امام رضا علیه السلام [ ٢٩ صفر ]", + }, + { + date: "1404/6/10", + description: "شهادت امام حسن عسکری علیه السلام [ ٨ ربيع الاول ]", + }, + { + date: "1404/6/19", + description: + "میلاد رسول اکرم و امام جعفر صادق علیه السلام [ ١٧ ربيع الاول ]", + }, + { + date: "1404/9/4", + description: "شهادت حضرت فاطمه زهرا سلام الله علیها [ ٣ جمادي الثانيه ]", + }, + { + date: "1404/10/13", + description: "ولادت امام علی علیه السلام و روز پدر [ ١٣ رجب ]", + }, + { + date: "1404/10/27", + description: "مبعث رسول اکرم (ص) [ ٢٧ رجب ]", + }, + { + date: "1404/11/15", + description: + "ولادت حضرت قائم عجل الله تعالی فرجه و جشن نیمه شعبان [ ١٥ شعبان ]", + }, + { + date: "1404/11/22", + description: "پیروزی انقلاب اسلامی", + }, + { + date: "1404/12/20", + description: "شهادت حضرت علی علیه السلام [ ٢١ رمضان ]", + }, + { + date: "1404/12/29", + description: "روز ملی شدن صنعت نفت ایران", + }, + ], + y1403: [ + { + date: "1403/1/1", + description: "جشن نوروز/جشن سال نو", + }, + { + date: "1403/1/2", + description: "عیدنوروز", + }, + { + date: "1403/1/3", + description: "عیدنوروز", + }, + { + date: "1403/1/4", + description: "عیدنوروز", + }, + { + date: "1403/1/12", + description: "روز جمهوری اسلامی", + }, + { + date: "1403/1/13", + description: "جشن سیزده به در", + }, + { + date: "1403/1/13", + description: "شهادت حضرت علی علیه السلام [ ٢١ رمضان ]", + }, + { + date: "1403/1/23", + description: "عید سعید فطر [ ١ شوال ]", + }, + { + date: "1403/1/24", + description: "تعطیل به مناسبت عید سعید فطر [ ٢ شوال ]", + }, + { + date: "1403/2/16", + description: "شهادت امام جعفر صادق علیه السلام [ ٢٥ شوال ]", + }, + { + date: "1403/3/14", + description: "رحلت حضرت امام خمینی", + }, + { + date: "1403/3/15", + description: "قیام 15 خرداد", + }, + { + date: "1403/3/28", + description: "عید سعید قربان [ ١٠ ذوالحجه ]", + }, + { + date: "1403/4/5", + description: "عید سعید غدیر خم [ ١٨ ذوالحجه ]", + }, + { + date: "1403/4/26", + description: "تاسوعای حسینی [ ٩ محرم ]", + }, + { + date: "1403/4/27", + description: "عاشورای حسینی [ ١٠ محرم ]", + }, + { + date: "1403/6/4", + description: "اربعین حسینی [ ٢٠ صفر ]", + }, + { + date: "1403/6/12", + description: "رحلت رسول اکرم؛شهادت امام حسن مجتبی علیه السلام [ ٢٨ صفر ]", + }, + { + date: "1403/6/14", + description: "شهادت امام رضا علیه السلام [ ٣٠ صفر ]", + }, + { + date: "1403/6/22", + description: "شهادت امام حسن عسکری علیه السلام [ ٨ ربيع الاول ]", + }, + { + date: "1403/6/31", + description: + "میلاد رسول اکرم و امام جعفر صادق علیه السلام [ ١٧ ربيع الاول ]", + }, + { + date: "1403/9/15", + description: "شهادت حضرت فاطمه زهرا سلام الله علیها [ ٣ جمادي الثانيه ]", + }, + { + date: "1403/10/25", + description: "ولادت امام علی علیه السلام و روز پدر [ ١٣ رجب ]", + }, + { + date: "1403/11/9", + description: "مبعث رسول اکرم (ص) [ ٢٧ رجب ]", + }, + { + date: "1403/11/22", + description: "پیروزی انقلاب اسلامی", + }, + { + date: "1403/11/27", + description: + "ولادت حضرت قائم عجل الله تعالی فرجه و جشن نیمه شعبان [ ١٥ شعبان ]", + }, + { + date: "1403/12/29", + description: "روز ملی شدن صنعت نفت ایران", + }, + { + date: "1403/12/30", + description: "آخرین روز سال", + }, + ], + y1402: [ + { + date: "1402/1/1", + description: "جشن نوروز/جشن سال نو", + }, + { + date: "1402/1/2", + description: "عیدنوروز", + }, + { + date: "1402/1/3", + description: "عیدنوروز", + }, + { + date: "1402/1/4", + description: "عیدنوروز", + }, + { + date: "1402/1/12", + description: "روز جمهوری اسلامی", + }, + { + date: "1402/1/13", + description: "جشن سیزده به در", + }, + { + date: "1402/1/23", + description: "شهادت حضرت علی علیه السلام [ ٢١ رمضان ]", + }, + { + date: "1402/2/2", + description: "عید سعید فطر [ ١ شوال ]", + }, + { + date: "1402/2/3", + description: "تعطیل به مناسبت عید سعید فطر [ ٢ شوال ]", + }, + { + date: "1402/2/26", + description: "شهادت امام جعفر صادق علیه السلام [ ٢٥ شوال ]", + }, + { + date: "1402/3/14", + description: "رحلت حضرت امام خمینی", + }, + { + date: "1402/3/15", + description: "قیام 15 خرداد", + }, + { + date: "1402/4/8", + description: "عید سعید قربان [ ١٠ ذوالحجه ]", + }, + { + date: "1402/4/16", + description: "عید سعید غدیر خم [ ١٨ ذوالحجه ]", + }, + { + date: "1402/5/5", + description: "تاسوعای حسینی [ ٩ محرم ]", + }, + { + date: "1402/5/6", + description: "عاشورای حسینی [ ١٠ محرم ]", + }, + { + date: "1402/6/15", + description: "اربعین حسینی [ ٢٠ صفر ]", + }, + { + date: "1402/6/23", + description: "رحلت رسول اکرم؛شهادت امام حسن مجتبی علیه السلام [ ٢٨ صفر ]", + }, + { + date: "1402/6/25", + description: "شهادت امام رضا علیه السلام [ ٣٠ صفر ]", + }, + { + date: "1402/7/2", + description: "شهادت امام حسن عسکری علیه السلام [ ٨ ربيع الاول ]", + }, + { + date: "1402/7/11", + description: + "میلاد رسول اکرم و امام جعفر صادق علیه السلام [ ١٧ ربيع الاول ]", + }, + { + date: "1402/9/26", + description: "شهادت حضرت فاطمه زهرا سلام الله علیها [ ٣ جمادي الثانيه ]", + }, + { + date: "1402/11/5", + description: "ولادت امام علی علیه السلام و روز پدر [ ١٣ رجب ]", + }, + { + date: "1402/11/19", + description: "مبعث رسول اکرم (ص) [ ٢٧ رجب ]", + }, + { + date: "1402/11/22", + description: "پیروزی انقلاب اسلامی", + }, + { + date: "1402/12/6", + description: + "ولادت حضرت قائم عجل الله تعالی فرجه و جشن نیمه شعبان [ ١٥ شعبان ]", + }, + { + date: "1402/12/29", + description: "روز ملی شدن صنعت نفت ایران", + }, + ], +}; diff --git a/package.json b/package.json index 33f4147..4ed74bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "brizco", - "version": "0.1.0", + "version": "0.1.2", "private": true, "scripts": { "dev": "next dev", @@ -14,6 +14,7 @@ "autoprefixer": "10.4.15", "axios": "^1.5.1", "boring-avatars": "^1.10.1", + "core-util-is": "^1.0.3", "framer-motion": "^10.16.1", "jalali-moment": "^3.3.11", "next": "13.4.19", diff --git a/plugins/BottomSheet/BottomManageShift.jsx b/plugins/BottomSheet/BottomManageShift.jsx new file mode 100644 index 0000000..e03cffc --- /dev/null +++ b/plugins/BottomSheet/BottomManageShift.jsx @@ -0,0 +1,221 @@ +"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 DatePickerIran from "plugins/DatePickerIran/page"; +import moment from "jalali-moment"; +import validateIranPhone from "plugins/IranPhoneRegex"; +const jalaliMoment = require("jalali-moment"); + +const BottomManageShift = (props) => { + const CTX = useContext(AppContext); + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + const [phoneNumber, setPhoneNumber] = useState(""); + const [nationalId, setNationalId] = useState(""); + const [gender, setGender] = useState(parseInt(0)); + const [birthDate, setBirthDate] = useState(null); + const [roleSelectCurrntData, setRoleSelectCurrntData] = useState(""); + const [roleSelectData, setRoleSelectData] = useState([]); + const [, forceUpdate] = useState(); + + const validator = useRef( + new SimpleReactValidator({ + messages: { + required: "پر کردن این فیلد الزامی میباشد", + }, + element: (message) => ( + <> +
+ {message} +
+ + ), + }) + ); + const rolesChoose = CTX.state.rolesChoose; + const rolesData = CTX.state.rolesData; + const goToEditUser = CTX.state.goToEditUser; + const idEditUser = CTX.state.idEditUser; + const userData = CTX.state.userData; + + const body = { + phoneNumber, + firstName, + lastName, + birthDateTimeStamp: + birthDate && + moment + .utc( + [birthDate.year, birthDate.month, birthDate.day], + "jYYYY-jMM-jDDTHH" + ) + .unix(), + gender: parseInt(gender), + nationalId, + roleIds: rolesChoose, + }; + + const bodyUpdate = { + phoneNumber, + firstName, + lastName, + birthDateTimeStamp: + birthDate && + moment + .utc( + [birthDate.year, birthDate.month, birthDate.day], + "jYYYY-jMM-jDDTHH" + ) + .unix(), + gender: parseInt(gender), + nationalId, + roleIds: rolesChoose, + userId: userData.id, + }; + + console.log(bodyUpdate); + + const clear = () => { + setFirstName(""); + setLastName(""); + setPhoneNumber(""); + setNationalId(""); + setGender(""); + setBirthDate(""); + setRoleSelectCurrntData(""); + setRoleSelectData([]); + CTX.setRolesChoose([]); + }; + + const handleCreateUser = (update) => { + if (validateIranPhone(phoneNumber)) { + if (validator.current.allValid()) { + if (update == "UPDATE") { + CTX.UpdateUser(bodyUpdate); + } else { + CTX.CreateUser(body); + } + } else { + toast.error("پرکردن همه ی فیلد ها واجب است", { + position: "bottom-right", + autoClose: 2000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + }); + + validator.current.showMessages(); + forceUpdate(1); + } + } else { + toast.error("شماره تماس را درست وارد کنید", { + position: "bottom-right", + autoClose: 2000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + }); + } + }; + + const deleteRole = (id) => { + CTX.setRolesChoose(rolesChoose.filter((el) => el !== id)); + }; + + const handleBottomSheetCreateEmployeesOpen = (e) => { + setRoleSelectData( + rolesData.map((item) => ({ + key: item.persianName, + value: item.id, + })) + ); + + console.log(idEditUser); + + if (e.type == "OPEN") { + CTX.GetRoles(); + if (goToEditUser) { + CTX.GetUser(idEditUser); + } + } else if (e.type == "CLOSE") { + clear(); + CTX.setGoToEditUser(false); + CTX.setIdEditUser(null); + CTX.setUserData([]); + } + }; + + useEffect(() => { + if (goToEditUser) { + const date = moment + .unix(userData.birthDateTimeStamp) + .locale("fa") + .format("YYYY/MM/DD") + .split("/"); + + setFirstName(userData.firstName); + setLastName(userData.lastName); + setPhoneNumber(userData.phoneNumber); + setNationalId(userData.nationalId); + setGender(userData.gender); + setBirthDate({ + day: parseInt(date[2]), + month: parseInt(date[1]), + year: parseInt(date[0]), + }); + // setRoleSelectCurrntData(""); + CTX.setRolesChoose(userData.roleIds); + console.log("userData2", userData); + } + }, [userData]); + + return ( + handleBottomSheetCreateEmployeesOpen(e)} + open={CTX.state.BottomManageShiftOpen} + onDismiss={() => CTX.setBottomManageShiftOpen(false)} + blocking={false} + > +
+

+ تغییر حالت تسک ها یک شیفت خاص +

+
+ +
+
+ { + setFirstName(e.target.value); + validator.current.showMessageFor("firstName"); + }} + style="text-right" + validator={true} + validatorData={validator.current.message( + "firstName", + firstName, + "required" + )} + /> +
+
+
+ ); +}; + +export default BottomManageShift; diff --git a/plugins/BottomSheet/BottomSheetCreateShifts.jsx b/plugins/BottomSheet/BottomSheetCreateShifts.jsx index 99aa449..669e22a 100644 --- a/plugins/BottomSheet/BottomSheetCreateShifts.jsx +++ b/plugins/BottomSheet/BottomSheetCreateShifts.jsx @@ -15,23 +15,12 @@ const BottomSheetCreateShifts = (props) => { const [dayOfWeeksCurrent, setDayOfWeeksCurrent] = useState(""); const [, forceUpdate] = useState(); - const dayOfWeeksChoose = CTX.state.dayOfWeeksChoose; 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; - 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: { @@ -53,7 +42,6 @@ const BottomSheetCreateShifts = (props) => { setTitle(""); // CTX.setEndAtTimeShift(["00", "00"]); // CTX.setStartAtTimeShift(["00", "00"]); - CTX.setdayOfWeeksChoose([]); }; const body = { @@ -61,7 +49,6 @@ const BottomSheetCreateShifts = (props) => { description, endAt: endAtTimeShift[0] + ":" + endAtTimeShift[1] + ":00", startAt: startAtTimeShift[0] + ":" + startAtTimeShift[1] + ":00", - dayOfWeeks: dayOfWeeksChoose, }; const bodyUpdate = { @@ -69,7 +56,6 @@ const BottomSheetCreateShifts = (props) => { description, endAt: endAtTimeShift[0] + ":" + endAtTimeShift[1] + ":00", startAt: startAtTimeShift[0] + ":" + startAtTimeShift[1] + ":00", - dayOfWeeks: dayOfWeeksChoose, id: shiftData.id, }; @@ -96,11 +82,6 @@ const BottomSheetCreateShifts = (props) => { } }; - const deleteRole = (value) => { - console.log(value); - CTX.setDayOfWeeksChoose(dayOfWeeksChoose.filter((el) => el !== value)); - }; - console.log(body); const handleBottomSheetCreateShift = (e) => { @@ -128,8 +109,6 @@ const BottomSheetCreateShifts = (props) => { shiftData.endAt.split(":")[0], shiftData.endAt.split(":")[1], ]); - - CTX.setDayOfWeeksChoose(shiftData.days); } }, [shiftData]); @@ -218,60 +197,6 @@ const BottomSheetCreateShifts = (props) => { /> -
- { - 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 }, - ]} - /> - -
- {dayOfWeeksChoose && - dayOfWeeksChoose.map((e) => ( -
-
deleteRole(e)} - >
- -
-

- {week?.find((b) => b.value == e).key} -

-
-
- ))} -
-
-
=6.0'} dev: true - /classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - dev: false - /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -747,38 +727,12 @@ packages: engines: {node: '>= 10'} dev: false - /component-classes@1.2.6: - resolution: {integrity: sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==} - dependencies: - component-indexof: 0.0.3 - dev: false - - /component-indexof@0.0.3: - resolution: {integrity: sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==} - dev: false - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: false - /core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: false - - /create-react-class@15.7.0: - resolution: {integrity: sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: false - - /css-animation@1.6.1: - resolution: {integrity: sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==} - dependencies: - babel-runtime: 6.26.0 - component-classes: 1.2.6 + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false /css-loader@6.8.1(webpack@5.89.0): @@ -822,10 +776,6 @@ packages: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: false - /dom-align@1.12.4: - resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} - dev: false - /electron-to-chromium@1.4.503: resolution: {integrity: sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==} @@ -1134,10 +1084,6 @@ packages: engines: {node: '>=10'} dev: false - /jalaali-js@0.2.0: - resolution: {integrity: sha512-NnJVmUbesh1v3GXZsjPd18sGvxKaNmHQ7svwULNvYBSVQKdsEatUmXiUQZd7HzU10Ur2eX/83ZT5rEzc746dJw==} - dev: false - /jalaali-js@1.2.6: resolution: {integrity: sha512-io974va+Qyu+UfuVX3UIAgJlxLhAMx9Y8VMfh+IG00Js7hXQo1qNQuwSiSa0xxco0SVgx5HWNkaiCcV+aZ8WPw==} dev: false @@ -1255,13 +1201,6 @@ packages: brace-expansion: 1.1.11 dev: false - /moment-jalali@0.3.9: - resolution: {integrity: sha512-ffHEHJbyYsHImjABoVIq309nnNjMSnapnoTcLRIDsxNQNdrkqiAVmjTFn1EiQdts6XDwhKg9d/06vurVoChMyA==} - dependencies: - jalaali-js: 0.2.0 - moment: 2.29.4 - dev: false - /moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} dev: false @@ -1392,10 +1331,6 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: false - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: false - /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -1552,68 +1487,12 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: false - /raf@3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - dependencies: - performance-now: 2.1.0 - dev: false - /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true - /rc-align@2.4.5: - resolution: {integrity: sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==} - dependencies: - babel-runtime: 6.26.0 - dom-align: 1.12.4 - prop-types: 15.8.1 - rc-util: 4.21.1 - dev: false - - /rc-animate@2.11.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - css-animation: 1.6.1 - prop-types: 15.8.1 - raf: 3.4.1 - rc-util: 4.21.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-lifecycles-compat: 3.0.4 - dev: false - - /rc-trigger@1.11.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-MBuUPw1nFzA4K7jQOwb7uvFaZFjXGd00EofUYiZ+l/fgKVq8wnLC0lkv36kwqM7vfKyftRo2sh7cWVpdPuNnnw==} - dependencies: - babel-runtime: 6.26.0 - create-react-class: 15.7.0 - prop-types: 15.8.1 - rc-align: 2.4.5 - rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0) - rc-util: 4.21.1 - transitivePeerDependencies: - - react - - react-dom - dev: false - - /rc-util@4.21.1: - resolution: {integrity: sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==} - dependencies: - add-dom-event-listener: 1.1.0 - prop-types: 15.8.1 - react-is: 16.13.1 - react-lifecycles-compat: 3.0.4 - shallowequal: 1.1.0 - dev: false - /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -1624,23 +1503,10 @@ packages: scheduler: 0.23.0 dev: false - /react-duration-picker@1.1.1(react@18.2.0): - resolution: {integrity: sha512-1yzIjfpoSbRgJm88h8RF5VkTA0wa+sBRMmH9dudxzs7A8BC4LFvQiku51atx//JI5Yb4iwAelB9jjuWyxbkcqg==} - peerDependencies: - react: '>=16.8.0' - dependencies: - prop-types: 15.8.1 - react: 18.2.0 - dev: false - /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false - /react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - dev: false - /react-modern-calendar-datepicker@3.1.6(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lnMqEMj9Wn32/sm119tjCl5lOkq4u9vJE7wggi7hdXV4s8rPdKlH56FVVehlBi0dfYeWQVZ9npY384Zprjn4WA==} peerDependencies: @@ -1652,28 +1518,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /react-onclickoutside@5.11.1: - resolution: {integrity: sha512-iZKK+qUsGuqz+O3O/LtvDWkwmoqagC0EtRybhCJ3hawi9PF0ZaVrLnR24lqovbuvvUeA+cd1cWALOw+l1tfeaQ==} - dependencies: - create-react-class: 15.7.0 - dev: false - - /react-persian-datepicker@3.0.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Kg6eQlBqQOv+j8g3MTv5WOD+fpsBgfbWolrlQH2DLCiUnypWD/qLi5c+UptYjXNoQiCjo6ikN/gFiOb5eHb3lA==} - peerDependencies: - react: ^15.2.1 - react-dom: ^15.2.1 - dependencies: - classnames: 2.3.2 - moment-jalali: 0.3.9 - prop-types: 15.8.1 - rc-trigger: 1.11.5(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-onclickoutside: 5.11.1 - react-tether: 0.5.7(react-dom@18.2.0)(react@18.2.0) - dev: false - /react-spring-bottom-sheet@3.4.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yDFqiPMm/fjefjnOe6Q9zxccbCl6HMUKsK5bWgfGHJIj4zmXVKio5d4icQvmOLuwpuCA2pwv4J6nGWS6fUZidQ==} peerDependencies: @@ -1706,18 +1550,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /react-tether@0.5.7(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-oAZQLcABWpFXSV2El6WqFMoUuYdG8iKnE+CJcBI+WMPkvMGnguMC0lHx/cmyIcOxm/6JetTEmq2Q7T2bpoe69w==} - peerDependencies: - react: ^0.14.0 || ^15.0.0 - react-dom: ^0.14.0 || ^15.0.0 - dependencies: - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tether: 1.4.7 - dev: false - /react-toastify@9.1.3(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==} peerDependencies: @@ -1767,10 +1599,6 @@ packages: picomatch: 2.3.1 dev: false - /regenerator-runtime@0.11.1: - resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - dev: false - /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} dev: false @@ -1850,10 +1678,6 @@ packages: randombytes: 2.1.0 dev: true - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false - /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false @@ -2035,10 +1859,6 @@ packages: source-map-support: 0.5.21 dev: true - /tether@1.4.7: - resolution: {integrity: sha512-Z0J1aExjoFU8pybVkQAo/vD2wfSO63r+XOPfWQMC5qtf1bI7IWqNk4MiyBcgvvnY8kqnY06dVdvwTK2S3PU/Fw==} - dev: false - /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} diff --git a/src/app/layout.jsx b/src/app/layout.jsx index 2851375..8d90b23 100644 --- a/src/app/layout.jsx +++ b/src/app/layout.jsx @@ -17,6 +17,7 @@ import "react-toastify/dist/ReactToastify.css"; import Loading from "plugins/Loading/page"; import Chapar, { getToken } from "plugins/Chapar"; import TimePicker from "plugins/TimePicker/page"; +import axios from "axios"; const inter = Inter({ subsets: ["latin"] }); @@ -36,6 +37,8 @@ export default function RootLayout({ children }) { const [BottomSheetCreateShiftsOpen, setBottomSheetCreateShiftsOpen] = useState(false); + const [BottomManageShiftOpen, setBottomManageShiftOpen] = useState(false); + // BigPlus const [BigPlusOpen, setBigPlusOpen] = useState(false); const [BigPlusRotateIcon, setBigPlusRotateIcon] = useState(false); @@ -68,7 +71,6 @@ export default function RootLayout({ children }) { const [idEditUser, setIdEditUser] = useState(null); // shift - const [dayOfWeeksChoose, setDayOfWeeksChoose] = useState([]); const [startAtTimeShift, setStartAtTimeShift] = useState(["00", "00"]); const [endAtTimeShift, setEndAtTimeShift] = useState(["00", "00"]); const [shiftsData, setShiftsData] = useState([null]); @@ -76,6 +78,9 @@ export default function RootLayout({ children }) { const [goToEditShift, setGoToEditShift] = useState(false); const [idEditShift, setIdEditShift] = useState(null); + // shift manage-shift + const [searchUserChoose, setSearchUserChoose] = useState([]); + // TimePicker const [openTimePicker, setOpenTimePicker] = useState(false); const [TimePickerOrder, setTimePickerOrder] = useState(null); @@ -639,7 +644,6 @@ export default function RootLayout({ children }) { idEditUser, goToEditUser, userData, - dayOfWeeksChoose, openTimePicker, endAtTimeShift, startAtTimeShift, @@ -649,6 +653,8 @@ export default function RootLayout({ children }) { goToEditShift, shiftData, profile, + searchUserChoose, + BottomManageShiftOpen, }, setBottomSheetCreateRoleOpen, setBottomSheetCreateEmployeesOpen, @@ -686,7 +692,6 @@ export default function RootLayout({ children }) { DeleteUser, GetUser, UpdateUser, - setDayOfWeeksChoose, setOpenTimePicker, setEndAtTimeShift, setStartAtTimeShift, @@ -702,6 +707,8 @@ export default function RootLayout({ children }) { DeleteShift, setProfile, CheckUser, + setSearchUserChoose, + setBottomManageShiftOpen, }} > diff --git a/src/app/page.jsx b/src/app/page.jsx index f1dd3cc..44a3090 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -10,6 +10,8 @@ import core from "../../public/images/core.png"; import { useEffect, useState } from "react"; import PersianNumber from "../../plugins/PersianNumber"; import UnderDevelopeTimer from "../../components/UnderDevelopeTimer"; +import { version } from "../../package.json"; +import Link from "next/link"; export default function Home() { const [state, setstate] = useState(false); @@ -19,7 +21,7 @@ export default function Home() { }, []); return ( -
+
-

- کارگران مشغول کارند -
- +

+ تا اینجا ورژن
{" "} - شهریــــــــــــــــــــــور میبینمتون

- + +

+ +

+

diff --git a/src/app/shifts/manage-shift/page.jsx b/src/app/shifts/manage-shift/page.jsx new file mode 100644 index 0000000..4ddbe5a --- /dev/null +++ b/src/app/shifts/manage-shift/page.jsx @@ -0,0 +1,337 @@ +"use client"; + +import React, { useContext, useEffect, useState } from "react"; +import moment from "jalali-moment"; +import "moment/locale/fa"; // Set the locale to Farsi (Persian) +import AppHeader from "@comp/AppHeader/page"; +import { Swiper, SwiperSlide } from "swiper/react"; +import PersianNumber from "plugins/PersianNumber"; +import { PersianD, PersianDay, PersianM, holidays } from "datacalender"; +import AppContext from "@ctx/AppContext"; +import Input from "plugins/Input/page"; +import { toast } from "react-toastify"; +import Avatar from "boring-avatars"; +import BottomManageShift from "plugins/BottomSheet/BottomManageShift"; + +const Calendar = () => { + const CTX = useContext(AppContext); + const shiftsData = CTX.state.shiftsData; + const searchUserChoose = CTX.state.searchUserChoose; + const usersData = CTX.state.usersData; + + console.log("usersData", usersData); + + const [searchUserCurrntData, setSearchUserCurrntData] = useState([]); + const [daysUntilEnd, setDaysUntilEnd] = useState([]); + const [selectDay, setSelectDay] = useState(null); + const [selectShift, setselectShift] = useState(0); + const [manageShiftEmployeesData, setManageShiftEmployeesData] = useState([]); + + const today = moment().format("jYYYY/jM/jD"); // Get the current Jalali date + const todayJustDay = moment().format("jD"); // Get the current Jalali date + + // Find the end of the current month + const endOfMonth = moment(today, "jYYYY/jM/jD").endOf("jMonth"); + + const daysInCurrentMonth = moment(today, "jYYYY/jM/jD") + .endOf("jMonth") + .jDate(); + + const daysEndOfMonth = () => { + const days = []; + for (let i = -1; i < daysInCurrentMonth - todayJustDay + 1; i++) { + const currentDate = moment(today, "jYYYY/jM/jD").add(i, "days"); + const isToday = currentDate.isSame(moment(), "day"); + days.push({ + checkDay: currentDate.format("jYYYY/jM/jD"), + date: currentDate.format("jD / jM"), + dayOfWeek: currentDate.format("dddd"), + today: isToday, // Set today: true if it's the current date + }); + } + + return setDaysUntilEnd(days); + }; + + console.log("daysUntilEnd", daysUntilEnd[selectDay]); + + const handleManageShiftEmployeesOpen = (e) => { + setManageShiftEmployeesData( + usersData.map((item) => ({ + key: + item.firstName + + " " + + item.lastName + + "( " + + item.roleNames[0] + + " )", + + value: item.userId, + })) + ); + }; + + const deleteSearchUser = (id) => { + CTX.setSearchUserChoose(searchUserChoose.filter((el) => el !== id)); + }; + + useEffect(() => { + daysEndOfMonth(); + setSelectDay(1); + CTX.GetShifts(); + CTX.GetUsers(); + }, []); + + useEffect(() => { + // if (!!CTX.GetUsers()) { + // + // } + handleManageShiftEmployeesOpen(); + }, [usersData]); + + console.log("searchUserChooseqqqqqqqqqqqqqqqqqqqqqqqqq", searchUserChoose); + + console.log(daysUntilEnd); + + return ( +
+ + +
+ console.log("slide change")} + onSwiper={(swiper) => console.log(swiper)} + > + {daysUntilEnd?.map((e, index) => ( + +
{ + setSelectDay(index); + console.log(index); + }} + > +
+

+ b.date == e.checkDay) + ? "text-red-500" + : "" + } `} + /> +

+
+ +
b.date == e.checkDay) + ? "bg-transparent text-red-500" + : "bg-white text-gray-500" + }`} + > +

+ {/* {PersianD.find((i) => i == e.dayOfWeek)} */} + {PersianDay(e.dayOfWeek)} +

+
+
+
+ ))} +
+
+ +
+ {shiftsData.length > 0 ? ( +
+ {shiftsData.map((e, index) => ( +
setselectShift(index)} + > +

{e?.title}

+
+ ))} +
+ ) : ( +
+
+ چیزی یافت نشد +
+
+ )} +
+ +
+
+
+

+ ویرایش برای{" "} + + {shiftsData && shiftsData[selectShift]?.title} + {" "} + تاریخ{" "} + + + {" "} + میباشد +

+
+
+ +
+ { + setSearchUserCurrntData(e.target.value); + + if (!!searchUserChoose.find((b) => b == e.target.value)) { + toast.error("نقش تکراری است", { + position: "bottom-right", + closeOnClick: true, + }); + } else { + CTX.setSearchUserChoose((current) => [ + ...current, + e.target.value, + ]); + } + }} + style="text-right" + // validatorData={validator.current.message( + // "phoneNumber", + // phoneNumber, + // "required" + // )} + select={true} + selectData={manageShiftEmployeesData} + theme={1} + /> +
+ +
0 ? "" : "justify-center" + }`} + > + {searchUserChoose.length > 0 ? ( + searchUserChoose.map((e) => ( +
+
deleteSearchUser(e)} + > + b.userId == e)?.firstName} + variant="beam" + colors={["#9d9f88", "#83af96", "#b2de93"]} + /> +
+ +
+

+ {usersData.find((b) => b.userId == e)?.firstName} +

+
+
+ )) + ) : ( +
+
+ چیزی یافت نشد +
+
+ )} +
+ +
+ + +
+
+ +
+ ); +}; + +export default Calendar; + +{ + /* {shiftsData.map((e, index) => ( +
+
+
+ + + +
+ +
+

{e?.title}

+

+ {e?.title} {} +

+
+
+
+ ))} */ +} diff --git a/src/app/shifts/page.jsx b/src/app/shifts/page.jsx index 57f5a6f..c7b0cf6 100644 --- a/src/app/shifts/page.jsx +++ b/src/app/shifts/page.jsx @@ -3,6 +3,7 @@ import AppHeader from "@comp/AppHeader/page"; import ShiftCard from "@comp/ShiftComponent/ShiftCard/page"; import AppContext from "@ctx/AppContext"; +import Link from "next/link"; import BottomSheetCreateShifts from "plugins/BottomSheet/BottomSheetCreateShifts"; import PersianNumber from "plugins/PersianNumber"; import React, { useContext, useEffect } from "react"; @@ -43,14 +44,18 @@ const Shifts = (props) => { نمایید و با توجه به نیاز های مجموعه خود شیفت بندی کنید .{" "}

- - + + + + + +
diff --git a/style/globals.css b/style/globals.css index f3310fc..1615561 100644 --- a/style/globals.css +++ b/style/globals.css @@ -204,3 +204,13 @@ body { inherits: true; initial-value: 0turn; } + +#swich-shifts::-webkit-scrollbar { + display: none; +} + +/* Hide scrollbar for IE, Edge and Firefox */ +#swich-shifts { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +}