add multi multi lang

main
حسین معصومی پور 2024-11-02 04:48:38 +03:30
parent d0cc908b25
commit f8b7ad0ff4
36 changed files with 1267 additions and 484 deletions

View File

@ -1,7 +1,6 @@
"use client";
import Avatar from "boring-avatars";
import Link from "next/link";
import { useRouter } from "next/navigation";
import React, { useContext } from "react";
import { useLongPress } from "@uidotdev/usehooks";
@ -9,6 +8,8 @@ import { toast } from "react-toastify";
import AppContext from "@ctx/AppContext";
import notifIcon from "@img/notif.png";
import Image from "next/image";
import { useLocale, useTranslations } from "next-intl";
import { Link } from "src/i18n/routing";
const AppHeader = ({
title,
@ -34,10 +35,21 @@ const AppHeader = ({
const CTX = useContext(AppContext);
const notifUnreadData = CTX.state.notifUnreadData;
const t = useTranslations("login");
const locale = useLocale();
const isRTL = locale === "fa";
const handlelogOut = () => {
CTX.setStepLogin(0);
localStorage.removeItem("token");
router.push("/app/login");
router.push(
locale === "zh"
? "/zh/app/login"
: locale === "fa"
? "/fa/app/login"
: "/app/login"
);
};
const attrs = useLongPress(() => handlelogOut(), {
@ -96,7 +108,7 @@ const AppHeader = ({
viewBox="0 0 11 18"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className="mx-auto mt-[7px]"
className={`mx-auto mt-[7px] ${isRTL ? "" : "rotate-180"}`}
>
<path d="M10 1L2 9L10 17" stroke="#555555" stroke-width="2" />
</svg>
@ -129,7 +141,11 @@ const AppHeader = ({
// ;
return (
<div className="bg-white flex justify-between rtl pt-4 px-4 w-full">
<div
className={`bg-white flex justify-between rtl pt-4 px-4 w-full ${
isRTL ? "rtl" : "ltr"
}`}
>
<Link href={"/app/acount"}>
<div className="flex">
{userIcon && (
@ -144,12 +160,13 @@ const AppHeader = ({
</div>
</div>
)}
<div className="mr-2 mt-1">
<div className="mx-2 mt-1">
<h2 className="mb-0 text-black font-bold text-base">{title}</h2>
<p className="mb-0 text-black text-sm">{sub}</p>
</div>
</div>
</Link>
{!userRole ? (
<div className="flex mt-2">
{logOut && (
@ -209,7 +226,7 @@ const AppHeader = ({
className="w-fit h-fit bg-gray-100 rounded-full mx-1 mt-2 "
onClick={iconEvent3}
>
<p className="mb-0 p-2 px-4">{iconName3}</p>
<p className="mb-0 p-2 px-4 text-sm">{iconName3}</p>
</div>
)}
</div>

View File

@ -5,11 +5,16 @@ import adjust from "@img/adjust.png";
import PersianNumber from "../../../plugins/PersianNumber";
import FormatJalaliDate from "plugins/FormatJalaliDate/page";
import moment from "jalali-moment";
import { useLocale } from "next-intl";
import FormatJalaliDateEn from "plugins/FormatJalaliDateEn/page";
const CoffeeBrewCard = ({ data, last }) => {
const today = new Date();
const locale = useLocale();
const isRTL = locale === "fa";
const formattedDate = FormatJalaliDate(data?.logAt, true);
const formattedDateEn = FormatJalaliDateEn(data?.logAt, true);
return (
<div
@ -17,23 +22,34 @@ const CoffeeBrewCard = ({ data, last }) => {
last ? "bg-gray-200 border border-primary-600" : "bg-gray-50"
} `}
>
<div className="flex justify-between">
<div
className={`flex justify-between ${isRTL ? "rtl" : "ltr ml-[45px]"}`}
>
<div>
<div className="flex">
<p className="mb-0 text-[13px] font-medium w-fit px-2 mt-1 border-l border-gray-400 ">
<small className="!text-[12px] text-gray-400">
<PersianNumber number={formattedDate} style={"!text-[12px]"} />
<p className="mb-0 text-[11px] font-medium w-fit px-1 mt-1 ">
<small className="!text-[10px] text-gray-400">
<PersianNumber
number={isRTL ? formattedDate : formattedDateEn}
style={"!text-[10px]"}
/>
</small>
</p>
<p className="mb-0 text-[13px] font-medium text-gray-400 w-fit px-2 mt-1 border-l border-gray-400 ">
<PersianNumber
number={moment(data?.logAt).locale("fa").format("HH:mm")}
style={"!text-[12px]"}
/>
</p>
<p className="mb-0 text-[13px] font-medium w-fit px-2 mt-1 ">
<small className="!text-[12px] text-gray-400">
<div className="bg-gray-300 h-3 w-[1px] mt-[6px]"></div>
<p className="mb-0 text-[10px] font-medium text-gray-400 w-fit px-1 mt-[6px] ">
{isRTL ? (
<PersianNumber
number={moment(data?.logAt).locale("fa").format("HH:mm")}
style={"!text-[10px]"}
/>
) : (
<>{moment(data?.logAt).locale("fa").format("HH:mm")}</>
)}
</p>
<div className="bg-gray-300 h-3 w-[1px] mt-[6px]"></div>
<p className="mb-0 text-[11px] font-medium w-fit px-1 mt-1 ">
<small className="!text-[10px] text-gray-400">
{data?.logBy}{" "}
</small>
</p>

View File

@ -33,7 +33,7 @@ const UsersEmployees = () => {
colors={["#9d9f88", "#83af96", "#b2de93"]}
/>
</div>
<div className=" flex justify-between w-full mr-2 ">
<div className=" flex justify-between w-full mx-2 ">
<div className="flex mt-1">
<h4 className="text-sm font-bold text-secondary-950">
{e.firstName} {e.lastName}

View File

@ -1,6 +1,7 @@
"use client";
import AppContext from "@ctx/AppContext";
import { useLocale, useTranslations } from "next-intl";
import Buttonbriz from "plugins/Buttonbriz/page";
import Input from "plugins/Input/page";
import validateIranPhone from "plugins/IranPhoneRegex";
@ -13,6 +14,10 @@ const LoginStep = (props) => {
const CTX = useContext(AppContext);
const phoneNumber = CTX.state.phoneNumber;
const t = useTranslations("login");
const locale = useLocale();
const isRTL = locale === "fa";
const handleConfirmPhoneNumber = () => {
setAlertRolCheckBox(false);
@ -46,7 +51,7 @@ const LoginStep = (props) => {
<div className="mt-3">
<Input
lable=".شماره تلفن خود را وارد کنید"
lable={t("loginInput")}
theme={1}
id="phoneNumber-id"
name="phoneNumber"
@ -57,16 +62,16 @@ const LoginStep = (props) => {
</div>
<Buttonbriz
title="تایید شماره تلفن"
title={t("loginButton")}
color="SECONDARY"
icon="PHONE"
buttonEvent={() => handleConfirmPhoneNumber()}
/>
<div
className={`flex rtl mt-4 tr03 border-[2px] border-transparent py-2 ${
className={`flex mt-4 tr03 border-[2px] border-transparent py-2 ${
alertRolCheckBox ? "animate-pulse-1 " : ""
}`}
} ${isRTL ? "rtl" : "ltr"}`}
>
<div>
<input
@ -78,9 +83,12 @@ const LoginStep = (props) => {
onClick={(e) => setRoleCheckBox(e.target.checked)}
/>
</div>
<p className={`mb-0 text-white mt-1 text-right text-sm `}>
با تایید شماره تلفن با همه شرایط حریم خصوص اپلیکیشن بریز موافقت می کنم
.
<p
className={`mb-0 text-white mt-1 text-sm ${
isRTL ? "text-right" : "text-left"
}`}
>
{t("acceptRule")}
</p>
</div>
</div>

View File

@ -9,12 +9,17 @@ import React, { useContext, useEffect, useRef, useState } from "react";
import { toast } from "react-toastify";
import SimpleReactValidator from "simple-react-validator";
import { useSearchParams } from "next/navigation";
import { useLocale, useTranslations } from "next-intl";
const SignUp = (props) => {
const CTX = useContext(AppContext);
const router = useRouter();
const query = useSearchParams();
const t = useTranslations("login");
const locale = useLocale();
const isRTL = locale === "fa";
const [firstName, setFirstName] = useState("");
const [lastName, setLastName] = useState("");
const [complexName, setComplexName] = useState("");
@ -74,14 +79,17 @@ const SignUp = (props) => {
return (
<div className="px-5 pt-6">
<p className="mb-0 text-white mt-1 text-right text-sm ">
برای ورود یا ثبت نام به اپلیکیشن مدیریت وظایف رستوران باید شماره تلفن
همراه خود را وارد کنید
<p
className={`mb-0 text-white mt-1 text-sm ${
isRTL ? "text-right" : "text-left"
} `}
>
{t("singUpDesc")}
</p>
<div className="mt-8">
<Input
lable="نام"
lable={t("singUpFirstNameInput")}
mt={5}
theme={1}
id="firstName-id"
@ -103,7 +111,7 @@ const SignUp = (props) => {
</div>
<div className="mt-8">
<Input
lable="نام خانوادگی"
lable={t("signUpLastNameInput")}
mt={5}
theme={1}
id="lastName-id"
@ -126,7 +134,7 @@ const SignUp = (props) => {
<div className="mt-8">
<Input
lable="نام مجموعه"
lable={t("signUpComplexNameInput")}
mt={5}
theme={1}
id="complexName-id"
@ -148,7 +156,7 @@ const SignUp = (props) => {
</div>
<div className="mt-3">
<Input
lable="شماره تماس مدیریت مجموعه"
lable={t("signUpSupportPhoneNumberInput")}
mt={5}
theme={1}
id="supportPhoneNumber-id"
@ -162,7 +170,7 @@ const SignUp = (props) => {
</div>
<div className="mt-3">
<Input
lable="ادرس مجموعه "
lable={t("signUpComplexAddressInput")}
mt={5}
theme={1}
id="complexAddress-id"
@ -184,7 +192,7 @@ const SignUp = (props) => {
</div>
<Buttonbriz
title="تایید اطلاعات"
title={t("signUpButton")}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleSingnUp()}

View File

@ -1,6 +1,7 @@
"use client";
import AppContext from "@ctx/AppContext";
import { useLocale, useTranslations } from "next-intl";
import Buttonbriz from "plugins/Buttonbriz/page";
import Input from "plugins/Input/page";
import PersianNumber from "plugins/PersianNumber";
@ -11,6 +12,10 @@ const VerifyCodeStep = () => {
const phoneNumber = CTX.state.phoneNumber;
const verifyCode = CTX.state.verifyCode;
const t = useTranslations("login");
const locale = useLocale();
const isRTL = locale === "fa";
const handleSendVerify = () => {
if (verifyCode.length <= 5) {
toast.error(" کد را صحیح وارد کنید ", {
@ -24,18 +29,23 @@ const VerifyCodeStep = () => {
return (
<div className="px-5 mt-6">
<p className="mb-0 text-white mt-1 text-right text-sm">
{" "}
کد تایید برای شماره
<strong className="mx-1">
<PersianNumber number={phoneNumber} />
</strong>
ارسال شده است
</p>
{isRTL ? (
<p className="mb-0 text-white mt-1 text-right text-sm">
کد تایید برای شماره
<strong className="mx-1">
<PersianNumber number={phoneNumber} />
</strong>
ارسال شده است
</p>
) : (
<p className="mb-0 text-white mt-1 text-center text-sm">
{t("confirmText")}{" "}
</p>
)}
<div className="mt-3">
<Input
lable="کد ارسال شده را وارد کنید"
lable={t("confirmInput")}
id="verifyCode-id"
name="verifyCode"
type={"number"}
@ -47,7 +57,7 @@ const VerifyCodeStep = () => {
</div>
<Buttonbriz
title="تایید شماره تلفن"
title={t("loginButton")}
color="SECONDARY"
icon="PHONE"
buttonEvent={() => handleSendVerify()}

View File

@ -1,6 +1,5 @@
"use client";
import Link from "next/link";
import React, { useContext, useEffect, useState } from "react";
import { usePathname } from "next/navigation";
import Image from "next/image";
@ -8,6 +7,7 @@ import logo from "@img/logo.png";
import setting from "@img/setting.png";
import AppContext from "@ctx/AppContext";
import HasPermission from "plugins/HasPermission/page";
import { Link } from "src/i18n/routing";
const NavBAr = (props) => {
const usePath = usePathname();

View File

@ -1,7 +1,7 @@
"use client";
import React from "react";
import "../../style/globals.css";
import { Inter } from "next/font/google";
import { Exo_2, Inter } from "next/font/google";
import "../../style/fontiran.css";
import NavBAr from "@comp/NavBar/NavBAr";
import "swiper/css";
@ -22,10 +22,13 @@ import "rc-slider/assets/index.css";
import BottomSheetReport from "plugins/BottomSheet/BottomSheetReport";
import BottomSheetReportManageShift from "plugins/BottomSheet/BottomSheetReportManageShift";
import moment from "jalali-moment";
import { useLocale } from "next-intl";
const inter = Inter({ subsets: ["latin"] });
const RootData = ({ children }) => {
const locale = useLocale();
// BottomSheet
const [BottomSheetCreateRoleOpen, setBottomSheetCreateRoleOpen] =
useState(false);
@ -170,7 +173,20 @@ const RootData = ({ children }) => {
const pathname = usePathname();
const router = useRouter();
const hiddenUrls = ["/app/login", "/pricing", "/about-us", "/"];
const hiddenUrls = [
"/app/login",
"/zh/app/login",
"/fa/app/login",
"/pricing",
"/fa/pricing",
"/zh/pricing",
"/about-us",
"/fa/about-us",
"/zh/about-us",
"/fa",
"/zh",
"/",
];
const shouldRenderComponent = !hiddenUrls.includes(pathname);
const closeBigPlusPage = () => {
@ -217,7 +233,13 @@ const RootData = ({ children }) => {
position: "bottom-right",
closeOnClick: true,
});
router.push("/app/home");
router.push(
locale === "zh"
? "/zh/app/home"
: locale === "fa"
? "/fa/app/home"
: "/app/home"
);
}
} catch ({ error, status }) {
toast.error(`${error?.response?.data?.message}`, {
@ -253,7 +275,13 @@ const RootData = ({ children }) => {
// localStorage.removeItem("token");
localStorage.setItem("token", data.access_token);
router.push("/app/home");
router.push(
locale === "zh"
? "/zh/app/home"
: locale === "fa"
? "/fa/app/home"
: "/app/home"
);
}
} catch ({ error, status }) {
toast.error(`${error?.response?.data?.message}`, {
@ -1149,7 +1177,13 @@ const RootData = ({ children }) => {
setLoading(false);
router.push("/app/tasks");
router.push(
locale === "zh"
? "/zh/app/tasks"
: locale === "fa"
? "/fa/app/tasks"
: "/app/tasks"
);
} catch ({ error, status }) {
toast.error(`${error?.response?.data?.message}`, {
position: "bottom-right",
@ -1179,7 +1213,13 @@ const RootData = ({ children }) => {
// router->
setLoading(false);
router.push("/app/tasks");
router.push(
locale === "zh"
? "/zh/app/tasks"
: locale === "fa"
? "/fa/app/tasks"
: "/app/tasks"
);
} catch ({ error, status }) {
toast.error(`${error?.response?.data?.message}`, {
position: "bottom-right",

View File

@ -1,8 +1,8 @@
import React, { version } from "react";
import logo2 from "../../../src/assets/logo2.png";
import Image from "next/image";
import Link from "next/link";
import { useLocale } from "next-intl";
import { Link } from "src/i18n/routing";
const Footer = () => {
const locale = useLocale();

View File

@ -1,6 +1,6 @@
import { useTranslations } from "next-intl";
import Link from "next/link";
import React, { useState } from "react";
import { Link } from "src/i18n/routing";
const PricingHero = () => {
const [oneMonth, setOneMonth] = useState(0);

View File

@ -137,10 +137,144 @@
"login": {
"title": "Briz",
"desc": "Harmonic management of routines",
"acceptRule": "By confirming the phone number, I agree to all the privacy conditions of the Breeze application",
"acceptRule": "By confirming the phone number, I agree to all the privacy conditions of the Briz application",
"loginInput": "Enter your phone number",
"loginButton": "Confirm phone number",
"confirmText": "The confirmation code has been sent to the number",
"confirmInput": "Enter the code sent"
"confirmText": "The confirmation code has been sent ",
"confirmInput": "Enter the code sent",
"singUpDesc": "You need a phone number to enter or register in the restaurant task management application Enter your mobile number",
"singUpFirstNameInput": "First name",
"signUpLastNameInput": "Last name",
"signUpComplexNameInput": "Complex name",
"signUpSupportPhoneNumberInput": "Management contact",
"signUpComplexAddressInput": "Address",
"signUpButton": "Verification of information"
},
"homePage": {
"activityText": " activities today",
"shiftText": " shifts today",
"shiftBoxAllactivities": "All activities",
"shiftBoxActivityDone": "Activity done",
"shiftBoxActivityNotDone": "Activity not done",
"shiftBoxShiftPercentage": "Shift progress percentage",
"shiftBoxEmpty": "You don't have an open shift",
"surpriseText": "surprise",
"addAdjust": "Add new adjust",
"historyReports": "History reports",
"titleReport1": "Activities",
"subTitleReport1": "Excel output",
"titleReport2": "Week shifts",
"subTitleReport2": "Text output"
},
"coffee-brew": {
"title": "Adjust coffee",
"subTitle": "Coffee adjustment mechanism",
"coffeeGramInput": "BCG | Coffee gram",
"extractionTimeInput": "OEG | Extraction time",
"outputExtractGrammageInput": "ET | Output extract grammage",
"coffeeBrewButton": "registration",
"historyTitle": "History of adjustments",
"coffeeGramChart": "Coffee gram",
"extractionTimeChart": "Extraction time",
"outputExtractGrammageChart": "Output extract "
},
"BottomSheet": {
"BottomSheetReport": "reports",
"BottomSheetReportDesc": "You are getting the activity report",
"BottomSheetReportbutton": "submit",
"BottomSheetReportManageShiftTitle": "reports",
"BottomSheetReportManageShiftType1": "this week",
"BottomSheetReportManageShiftType2": "next week",
"BottomSheetReportManageShiftButton": "Copy text",
"BottomSheetAddUserToPositionShiftPlanTitle": "Add user to position",
"BottomSheetCreateRoutineTitle": "Add new routine",
"BottomSheetCreateRoutineNameInput": "Routine name",
"BottomSheetCreateRoutineDescInput": "Routine description",
"BottomSheetCreateRoutineRegButton": "Submit Rutine",
"BottomSheetCreateRoutineEditButton": "Edit Rutine",
"BottomSheetCreateRoutineDeleteButton": "Delete ",
"BottomSheetCreateSectionTitle": "Add new section",
"BottomSheetCreateSectionNameInput": "Section name",
"BottomSheetCreateSectionDescInput": "Section description",
"BottomSheetCreateSectionRegButton": "Submit section",
"BottomSheetCreateSectionEditButton": "Edit section",
"BottomSheetCreateSectionDeleteButton": "Delete ",
"BottomSheetCreatePositionTitle": "Add new Position",
"BottomSheetCreatePositionNameInput": "Position name",
"BottomSheetCreatePositionDescInput": "Position description",
"BottomSheetCreatePositionSectionInput": "Connected section",
"chooseText": " choose",
"BottomSheetCreatePositionRegButton": "Submit position",
"BottomSheetCreatePositionEditButton": "Edit position",
"BottomSheetCreatePositionDeleteButton": "Delete ",
"BottomSheetCreateEmployeesTitle": "Add new staff",
"BottomSheetCreateEmployeesFirstNameInput": "First name",
"BottomSheetCreateEmployeesLastNameInput": "Last name",
"BottomSheetCreateEmployeesGenderInput": "Gender",
"BottomSheetCreateEmployeesPhoneNumberInput": "Phone number",
"BottomSheetCreateEmployeesJobTitleInput": "Job Title",
"BottomSheetCreateEmployeesRegButton": "Submit staff",
"BottomSheetCreateEmployeesEditButton": "Edit staff",
"BottomSheetCreateEmployeesDeleteButton": "Delete ",
"BottomSheetCreateShiftsTitle": "Add new shifts",
"BottomSheetCreateShiftsShiftNameInput": "Shift name",
"BottomSheetCreateShiftsStartTimeInput": "Start of the shift",
"BottomSheetCreateShiftsEndTimeInput": "End of the shift",
"BottomSheetCreateShiftsShiftInWeekInput": "Choose the shift day of the week",
"BottomSheetCreateShiftsRutineShiftInput": "Shift routine",
"BottomSheetCreateShiftsDescInput": "Shift description",
"BottomSheetCreateShiftsRegButton": "Submit shifts",
"BottomSheetCreateShiftsEditButton": "Edit shifts",
"BottomSheetCreateShiftsDeleteButton": "Delete "
},
"shifts": {
"title": "Complex shifts ",
"subTitle": "Complex shift management",
"ManageShiftButton": "Management week shift",
"weekFilter": "Week shifts",
"monthFilter": "Month shifts",
"nextWeekFilter": "Next week shifts",
"nextMonthFilter": "Next month's shifts",
"lastWeekFilter": "last week shifts",
"lastMonthkFilter": "last month shifts",
"shiftText": "shift",
"todayText": "today",
"surpriseText": "surprise",
"closeShiftButton": "Close and confirm the shift"
},
"manage-shift": {
"title": "Weekly complex shifts ",
"subTitle": "shift management",
"routineTitle": "Select a routine",
"dateTitle": "Select a date",
"shiftTitle": "Select a shift",
"personnelTitle": "Select personnel",
"surpriseTitle": "Select surprise",
"surpriseInput": " surprise",
"surpriseInputDef": " choose",
"surpriseSubTitle": "The shift is closed by the supervisor. Please specify it for each shift",
"404Shift": "You do not have a shift on this day",
"manageShiftRegButton": "Activity registration",
"manageShiftEditButton": "Edit activity",
"editText": "You are editing"
},
"complete-shift": {
"title": "Shift closing operation ",
"subTitle": " check the completion of tasks",
"todayText": "today",
"reportText": "report",
"completeShiftButton": "Closing with points"
},
"employees": {
"title": "Management of staffs and roles ",
"subTitle": "The core of the complex settings",
"routinesTitle": "Management of routines",
"sectionsTitle": "Management of sections",
"positionsTitle": " Management of positions",
"staffsTitle": " Management of staffs",
"shiftsTitle": "Management of shifts",
"taskTitle": "Add a task"
}
}

View File

@ -1,148 +1,277 @@
{
"page": {
"title": "عملیات ساده و روان",
"desc": "ک راه حل مدیریت کار و شیفت برای کافی شاپ ها که مدیریت وظایف واضح و قابل ردیابی و نظارت بر عملیات فروشگاه را ارائه می دهد. ",
"desc": "یک راه حل مدیریت وظایف و شیفت برای کافی‌شاپ‌ها که مدیریت وظایف شفاف و قابل پیگیری و نظارت بر عملیات فروشگاه را فراهم می‌کند.",
"button": "شروع کنید",
"brand": "برندهایی که به ما اعتماد دارند و از BRIZ برای مدیریت خود استفاده می کنند."
"brand": "برندهایی که به ما اعتماد دارند و از BRIZ برای مدیریت خود استفاده میکنند."
},
"home": {
"title": "Hello, Next.js i18n",
"desc": "This is a demo of Next.js i18n"
"title": "سلام، Next.js i18n",
"desc": "این یک نمایشی از i18n در Next.js است"
},
"navLinks": {
"ourSolution": "راه حل ما",
"product": "محصول",
"pricing": "قیمت",
"pricing": "قیمت‌گذاری",
"aboutUs": "درباره ما",
"button": "شروع کنید"
},
"services": {
"title": "بخشی از تست استرس ما باشید",
"desc": "خشی از تست استرس ما باشید و ما را به عنوان یک آداپتور اولیه امتحان کنید",
"desc": "بخشی از تست استرس ما باشید و به عنوان یک پیش‌کاربر ما را امتحان کنید",
"inputValue": "شماره خود را وارد کنید",
"button": "عضو شوید",
"successInput": "با تشکر از اعتماد شما، ما با شما تماس خواهیم گرفت",
"streamlinedOperations": "عملیات ساده",
"empoweredDecision": "تصمیم قدرتمند",
"unwaveringSupport": "پشتیبانی بی دریغ",
"seamlessIntegration": "یکپارچه سازی "
"button": "اشتراک",
"successInput": "از اعتماد شما متشکریم، با شما تماس خواهیم گرفت",
"streamlinedOperations": "عملیات بهینه‌شده",
"empoweredDecision": "تصمیم‌گیری توانمند",
"unwaveringSupport": "پشتیبانی بی‌وقفه",
"seamlessIntegration": "یکپارچگی بدون درز"
},
"experiences": {
"title": "منطق پایه",
"taskText": "تعداد کارهای انجام شده در بریز",
"LiveNumberTask": "فعالیت های انجام شده با بریز",
"taskText": "تعداد وظایف انجام شده در Briz",
"LiveNumberTask": "فعالیت‌های انجام شده با Briz",
"insertTasks": {
"title": ظایف را وارد کنید و تعیین کنید",
"points": "وظایف را وارد کنید و آنها را به موقعیت هایی در فروشگاه اختصاص دهید"
"title": ارد کردن وظایف و اختصاص دادن",
"points": "وظایف را وارد کرده و به موقعیت‌های فروشگاه اختصاص دهید"
},
"createShiftPlan": {
"title": "یک برنامه شفاف ایجاد کنید",
"points": "برای هر هفته یک برنامه شیفت روشن ایجاد کنید و برای هر شیفت یک سرپرست تعیین کنید."
"title": "ایجاد برنامه شیفت واضح",
"points": "برای هر هفته یک برنامه شیفت واضح ایجاد کرده و یک ناظر به هر شیفت اختصاص دهید."
},
"specificPerson": {
"title": "فعالیتی که به شخص خاصی اختصاص داده شده است",
"points": "پس از برنامه ریزی نوبت، هر وظیفه به فعالیتی تبدیل می شود که به یک فرد خاص واگذار می شود."
"title": "فعالیت اختصاص داده شده به شخص خاص",
"points": "پس از برنامه‌ریزی شیفت، هر وظیفه به عنوان یک فعالیت به شخص خاص اختصاص داده می‌شود."
},
"realTime": {
"title": "به لحظه",
"points": دیابی روال عملیات در سیستم در زمان واقعی.."
"title": "زمان واقعی",
"points": وتین عملیات را به صورت زمان واقعی در سیستم پیگیری کنید."
},
"confirmsCompletion": {
"title": کمیل را تایید می کند",
"points": "پس از بستن شیفت، سرپرست شما تمام وظایف را بررسی می کند، تکمیل را تایید می کند و به کارکنان امتیاز می دهد."
"title": ایید تکمیل",
"points": "پس از بستن شیفت، ناظر شما تمام وظایف را بررسی کرده، تکمیل آن‌ها را تایید و به کارکنان امتیاز می‌دهد."
}
},
"phiData": {
"title": "phi",
"desc": "طعم قهوه همیشه بیشترین اهمیت را دارد. با PHI، همیشه عالی خواهد بود. فی به معنای نسبت طلایی است. اگر قهوه خود را با نسبت طلایی دم کنید، همیشه طعم خوبی خواهد داشت. در قسمت Phi، سه کادر وجود دارد که باریستای شیفت باید آنها را پر کند. اینها عناصر اصلی برای تنظیم دستور پخت قهوه روزانه هستند:",
"endDesc": "باریستای شما دستور پخت روزانه را وارد می کند که در پایگاه داده شما ثبت می شود. می توانید نمودار تنظیم خود را مشاهده کنید و ببینید در نوار شما چه اتفاقی می افتد و کیفیت سرو قهوه خود را در فروشگاه خود بررسی کنید.",
"title": "فی",
"desc": "طعم قهوه همیشه مهم‌ترین عامل است. با PHI، همیشه کامل خواهد بود. فی به معنای نسبت طلایی است. اگر قهوه خود را با نسبت طلایی تهیه کنید، همیشه طعم خوبی خواهد داشت. در بخش Phi، سه جعبه وجود دارد که باریستا در شیفت باید پر کند. این‌ها عناصر اصلی برای تنظیم دستور قهوه روزانه هستند:",
"endDesc": "باریستا شما دستور روزانه را وارد می‌کند که در پایگاه داده شما ثبت خواهد شد. شما می‌توانید نمودار تنظیمات خود را مشاهده کنید تا ببینید در بار شما چه اتفاقی می‌افتد و کیفیت سرو قهوه خود را در فروشگاه خود بررسی کنید.",
"bcg": {
"desc": "منظور مقدار دقیق قهوه آسیاب شده برای هر دم کردن است...",
"title": "گرم قهوه پایه (BCG)"
"desc": "این به مقدار دقیق قهوه آسیاب‌شده استفاده شده برای هر دم اشاره دارد...",
"title": "گرم پایه قهوه (BCG)"
},
"oeg": {
"desc": " وزن نهایی قهوه استخراج شده را پس از دم کردن اندازه گیری می کند.",
"title": "خروجی استخراج گراماژ(OEG)"
"desc": "این وزن نهایی قهوه استخراج‌شده پس از دم‌کردن را اندازه‌گیری می‌کند...",
"title": "وزن استخراج نهایی (OEG)"
},
"et": {
"desc": " کل زمان دم کردن قهوه از ابتدا تا انتها است...",
"desc": "این زمان کل لازم برای دم‌کردن قهوه از ابتدا تا انتها است...",
"title": "زمان استخراج (ET)"
}
},
"stepProducts": {
"endDesc": "اکنون فقط شیفت های خود را برای هفته آینده تنظیم کنید. در هر شیفت، کارکنان را به هر موقعیتی اختصاص دهید و یک سرپرست تعیین کنید.",
"endDesc": "حالا فقط شیفت‌های خود را برای هفته آینده تنظیم کنید. کارکنان را به هر موقعیت در هر شیفت اختصاص دهید و یک ناظر تعیین کنید.",
"setupRoutine": {
"desc": "شما می توانید به طور کامل سیستم عامل خود را سفارشی و تعریف کنید...",
"title": "روال خود را تنظیم کنید"
"desc": "می‌توانید سیستم عملیات خود را به طور کامل سفارشی‌سازی و تعریف کنید...",
"title": "تنظیم روتین خود"
},
"setupSections": {
"desc": "بخش های خود را برای به دست آوردن بینش بهتر در مورد عملیات خود تعریف کنید...",
"title": "بخش های خود را تنظیم کنید"
"desc": "بخش‌های خود را تعریف کنید تا بینش بهتری از عملیات خود به دست آورید...",
"title": "تنظیم بخش‌های خود"
},
"setupPositions": {
"desc": "موقعیت ها نقش مهمی در پلتفرم ما دارند...",
"title": "موقعیت های خود را تنظیم کنید"
"desc": "موقعیتها نقش حیاتی در پلتفرم ما دارند...",
"title": "تنظیم موقعیت‌های خود"
},
"setupStaffInfo": {
"desc": "شما باید اطلاعات کارکنان خود را تنظیم کنید ...",
"desc": "شما نیاز دارید اطلاعات کارکنان خود را تنظیم کنید...",
"title": "تنظیم اطلاعات کارکنان"
},
"setupShiftsLogic": {
"desc": "شما باید منطق شیفت خود را ایجاد کنید...",
"title": "منطق شیفت خود را تنظیم کنید"
"desc": "شما نیاز دارید منطق شیفت خود را تعیین کنید...",
"title": "تنظیم منطق شیفت‌های خود"
},
"insertTasks": {
"desc": "تمام وظایف خود را در این مرحله تنظیم کنید...",
"title": "همه وظایف خود را وارد کنید"
"desc": "در این مرحله همه وظایف خود را تنظیم کنید...",
"title": "وارد کردن همه وظایف"
}
},
"pricing": {
"title": "قیمت گذاری",
"desc": "مدیریت کافی شاپ خود را با برنامه های قیمت گذاری منعطف زمان ما تنظیم کنید. همه بسته‌ها ویژگی‌های جامع یکسانی را ارائه می‌دهند، که فقط از نظر مدت زمان متفاوت هستند تا با نیازهای تجاری شما مطابقت داشته باشند. از بین گزینه های ماهانه، سه ماهه یا سالانه که هر کدام برای سهولت و کارایی طراحی شده اند، انتخاب کنید.",
"title": "قیمتگذاری",
"desc": "مدیریت کافی‌شاپ خود را با طرح‌های قیمت‌گذاری انعطاف‌پذیر ما متناسب‌سازی کنید. تمام بسته‌ها ویژگی‌های جامع یکسانی ارائه می‌دهند و فقط در مدت زمان تفاوت دارند تا نیازهای کسب‌وکار شما را برآورده کنند. از گزینه‌های ماهانه، سه‌ماهه یا سالانه انتخاب کنید، هر کدام برای سهولت و کارایی طراحی شده‌اند.",
"oneMounth": {
"title": "یک ماه",
"pricing1": "15,000,000 R",
"pricing2": "24,000,000 R ",
"pricing3": "29,500,000 R",
"desc": "این می تواند بهترین بسته برای شما باشد، بنابراین از 14 روز آزمایشی رایگان استفاده کنید",
"users1": "بالای 10 کاربر",
"users2": "بالای 25 کاربر",
"users3": "بالای 50 کاربر",
"title": "1 ماه",
"pricing1": "15,000,000 ر",
"pricing2": "24,000,000 ر",
"pricing3": "29,500,000 ر",
"desc": "ممکن است بهترین بسته برای شما باشد، بنابراین از دوره آزمایشی 14 روزه رایگان استفاده کنید",
"users1": "تا 10 کاربر",
"users2": "تا 25 کاربر",
"users3": "تا 50 کاربر",
"button": "شروع کنید"
},
"threeMounth": {
"title": "سه ماهه",
"pricing1": "36,000,000 R",
"pricing2": "57,600,000 R",
"pricing3": "70,800,000 R",
"desc": "این می تواند بهترین بسته برای شما باشد، بنابراین از 14 روز آزمایشی رایگان استفاده کنید",
"users1": "بالای 10 کاربر",
"users2": "بالای 25 کاربر",
"users3": "بالای 50 کاربر",
"title": "3 ماه",
"pricing1": "36,000,000 ر",
"pricing2": "57,600,000 ر",
"pricing3": "70,800,000 ر",
"desc": "ممکن است بهترین بسته برای شما باشد، بنابراین از دوره آزمایشی 14 روزه رایگان استفاده کنید",
"users1": "تا 10 کاربر",
"users2": "تا 25 کاربر",
"users3": "تا 50 کاربر",
"button": "شروع کنید"
},
"sixMounth": {
"title": "یک سال",
"pricing1": "108,000,000 R",
"pricing2": "172,800,000 R ",
"pricing3": "212,400,000 R",
"desc": "این می تواند بهترین بسته برای شما باشد، بنابراین از 14 روز آزمایشی رایگان استفاده کنید",
"users1": "بالای 10 کاربر",
"users2": "بالای 25 کاربر",
"users3": "بالای 50 کاربر",
"title": "6 ماه",
"pricing1": "108,000,000 ر",
"pricing2": "172,800,000 ر",
"pricing3": "212,400,000 ر",
"desc": "ممکن است بهترین بسته برای شما باشد، بنابراین از دوره آزمایشی 14 روزه رایگان استفاده کنید",
"users1": "تا 10 کاربر",
"users2": "تا 25 کاربر",
"users3": "تا 50 کاربر",
"button": "شروع کنید"
}
},
"login": {
"title": "بریز",
"desc": "مدیریت هماهنگ وظایف روزمره",
"acceptRule": "با تأیید شماره تلفن، با تمامی شرایط حریم خصوصی اپلیکیشن بریز موافقت می‌کنم",
"title": "Briz",
"desc": "مدیریت هماهنگ روتین‌ها",
"acceptRule": "با تأیید شماره تلفن، من با تمام شرایط حفظ حریم خصوصی برنامه Briz موافقت می‌کنم",
"loginInput": "شماره تلفن خود را وارد کنید",
"loginButton": "تأیید شماره تلفن",
"confirmText": "کد تأیید به شماره شما ارسال شد",
"confirmInput": "کد ارسال شده را وارد کنید"
"confirmText": "کد تأیید ارسال شده است",
"confirmInput": "کد ارسال شده را وارد کنید",
"singUpDesc": "برای ورود یا ثبت‌نام در برنامه مدیریت وظایف رستوران نیاز به شماره تلفن دارید. شماره موبایل خود را وارد کنید",
"singUpFirstNameInput": "نام",
"signUpLastNameInput": "نام خانوادگی",
"signUpComplexNameInput": "نام مجتمع",
"signUpSupportPhoneNumberInput": "تماس مدیریت",
"signUpComplexAddressInput": "آدرس",
"signUpButton": "تأیید اطلاعات"
},
"homePage": {
"activityText": " فعالیت امروز",
"shiftText": " شیفت امروز",
"shiftBoxAllactivities": "همه فعالیت‌ها",
"shiftBoxActivityDone": "فعالیت انجام شده",
"shiftBoxActivityNotDone": "فعالیت انجام نشده",
"shiftBoxShiftPercentage": "درصد پیشرفت شیفت",
"shiftBoxEmpty": "شیفت باز ندارید",
"surpriseText": "شگفتی",
"addAdjust": "افزودن تنظیم جدید",
"historyReports": "گزارش‌های تاریخی",
"titleReport1": "فعالیت‌ها",
"subTitleReport1": "خروجی اکسل",
"titleReport2": "شیفت‌های هفته",
"subTitleReport2": "خروجی متنی"
},
"coffee-brew": {
"title": "تنظیم قهوه",
"subTitle": "مکانیزم تنظیم قهوه",
"coffeeGramInput": "BCG | گرم قهوه",
"extractionTimeInput": "OEG | زمان استخراج",
"outputExtractGrammageInput": "ET | وزن استخراج نهایی",
"coffeeBrewButton": "ثبت‌نام",
"historyTitle": "تاریخچه تنظیمات",
"coffeeGramChart": "گرم قهوه",
"extractionTimeChart": "زمان استخراج",
"outputExtractGrammageChart": "وزن استخراج"
},
"BottomSheet": {
"BottomSheetReport": "گزارش‌ها",
"BottomSheetReportDesc": "شما در حال دریافت گزارش فعالیت هستید",
"BottomSheetReportbutton": "ارسال",
"BottomSheetReportManageShiftTitle": "گزارش‌ها",
"BottomSheetReportManageShiftType1": "این هفته",
"BottomSheetReportManageShiftType2": "هفته آینده",
"BottomSheetReportManageShiftButton": "کپی متن",
"BottomSheetAddUserToPositionShiftPlanTitle": "افزودن کاربر به موقعیت",
"BottomSheetCreateRoutineTitle": "افزودن روتین جدید",
"BottomSheetCreateRoutineNameInput": "نام روتین",
"BottomSheetCreateRoutineDescInput": "توضیح روتین",
"BottomSheetCreateRoutineRegButton": "ثبت روتین",
"BottomSheetCreateRoutineEditButton": "ویرایش روتین",
"BottomSheetCreateRoutineDeleteButton": "حذف",
"BottomSheetCreateSectionTitle": "افزودن بخش جدید",
"BottomSheetCreateSectionNameInput": "نام بخش",
"BottomSheetCreateSectionDescInput": "توضیح بخش",
"BottomSheetCreateSectionRegButton": "ثبت بخش",
"BottomSheetCreateSectionEditButton": "ویرایش بخش",
"BottomSheetCreateSectionDeleteButton": "حذف",
"BottomSheetCreatePositionTitle": "افزودن موقعیت جدید",
"BottomSheetCreatePositionNameInput": "نام موقعیت",
"BottomSheetCreatePositionDescInput": "توضیح موقعیت",
"BottomSheetCreatePositionSectionInput": "بخش مرتبط",
"chooseText": "انتخاب کنید",
"BottomSheetCreatePositionRegButton": "ثبت موقعیت",
"BottomSheetCreatePositionEditButton": "ویرایش موقعیت",
"BottomSheetCreatePositionDeleteButton": "حذف",
"BottomSheetCreateEmployeesTitle": "افزودن کارکنان جدید",
"BottomSheetCreateEmployeesFirstNameInput": "نام",
"BottomSheetCreateEmployeesLastNameInput": "نام خانوادگی",
"BottomSheetCreateEmployeesGenderInput": "جنسیت",
"BottomSheetCreateEmployeesPhoneNumberInput": "شماره تلفن",
"BottomSheetCreateEmployeesJobTitleInput": "عنوان شغلی",
"BottomSheetCreateEmployeesRegButton": "ثبت کارکنان",
"BottomSheetCreateEmployeesEditButton": "ویرایش کارکنان",
"BottomSheetCreateEmployeesDeleteButton": "حذف",
"BottomSheetCreateShiftsTitle": "افزودن شیفت‌های جدید",
"BottomSheetCreateShiftsShiftNameInput": "نام شیفت",
"BottomSheetCreateShiftsStartTimeInput": "شروع شیفت",
"BottomSheetCreateShiftsEndTimeInput": "پایان شیفت",
"BottomSheetCreateShiftsShiftInWeekInput": "انتخاب روز شیفت هفته",
"BottomSheetCreateShiftsRutineShiftInput": "روتین شیفت",
"BottomSheetCreateShiftsDescInput": "توضیح شیفت",
"BottomSheetCreateShiftsRegButton": "ثبت شیفت",
"BottomSheetCreateShiftsEditButton": "ویرایش شیفت",
"BottomSheetCreateShiftsDeleteButton": "حذف"
},
"shifts": {
"title": "شیفت‌های پیچیده",
"subTitle": "مدیریت شیفت‌های پیچیده",
"ManageShiftButton": "مدیریت شیفت‌های هفته",
"weekFilter": "شیفت‌های هفته",
"monthFilter": "شیفت‌های ماه",
"nextWeekFilter": "شیفت‌های هفته آینده",
"nextMonthFilter": "شیفت‌های ماه آینده",
"lastWeekFilter": "شیفت‌های هفته گذشته",
"lastMonthkFilter": "شیفت‌های ماه گذشته",
"shiftText": "شیفت",
"todayText": "امروز",
"surpriseText": "شگفتی",
"closeShiftButton": "بستن و تایید شیفت"
},
"manage-shift": {
"title": "شیفت‌های پیچیده هفتگی",
"subTitle": "مدیریت شیفت",
"routineTitle": "انتخاب روتین",
"dateTitle": "انتخاب تاریخ",
"shiftTitle": "انتخاب شیفت",
"personnelTitle": "انتخاب پرسنل",
"surpriseTitle": "انتخاب شگفتی",
"surpriseInput": " شگفتی",
"surpriseInputDef": " انتخاب کنید",
"surpriseSubTitle": "شیفت توسط ناظر بسته می‌شود. لطفاً برای هر شیفت مشخص کنید",
"404Shift": "شیفتی در این روز ندارید",
"manageShiftRegButton": "ثبت فعالیت",
"manageShiftEditButton": "ویرایش فعالیت",
"editText": "شما در حال ویرایش هستید"
},
"complete-shift": {
"title": "عملیات بستن شیفت",
"subTitle": "بررسی تکمیل وظایف",
"todayText": "امروز",
"reportText": "گزارش",
"completeShiftButton": "بستن با امتیاز"
},
"employees": {
"title": "مدیریت کارکنان و نقش‌ها",
"subTitle": "هسته تنظیمات پیچیده",
"routinesTitle": "مدیریت روتین‌ها",
"sectionsTitle": "مدیریت بخش‌ها",
"positionsTitle": "مدیریت موقعیت‌ها",
"staffsTitle": "مدیریت کارکنان",
"shiftsTitle": "مدیریت شیفت‌ها",
"taskTitle": "افزودن وظیفه"
}
}

View File

@ -1,13 +1,13 @@
{
"page": {
"title": "简单畅的操作",
"desc": "一款咖啡店的任务和班次管理解决方案,提供清晰、可追踪的任务管理和店铺运营监控。",
"title": "简单畅的操作",
"desc": "为咖啡店提供清晰、可跟踪的任务管理和店铺运营监控的任务和班次管理解决方案。",
"button": "开始使用",
"brand": "信任我们并使用 BRIZ 进行管理的品牌。"
"brand": "信任我们的品牌并使用 BRIZ 进行管理。"
},
"home": {
"title": "你好Next.js i18n",
"desc": "这是 Next.js i18n 的演示"
"title": "你好Next.js 国际化",
"desc": "这是一个 Next.js 国际化的演示"
},
"navLinks": {
"ourSolution": "我们的解决方案",
@ -17,71 +17,70 @@
"button": "开始使用"
},
"services": {
"title": "参与我们的压力测试",
"desc": "成为我们的压力测试的一部分,作为早期适配者尝试我们",
"inputValue": "输入您的号码",
"title": "成为我们压力测试的一部分",
"desc": "成为我们压力测试的一部分,作为早期采用者尝试我们的服务",
"inputValue": "输入您的电话号码",
"button": "订阅",
"successInput": "感谢您的信任,我们与您联系",
"streamlinedOperations": "精简的操作",
"empoweredDecision": "赋权决策",
"unwaveringSupport": "坚定支持",
"successInput": "感谢您的信任,我们与您联系",
"streamlinedOperations": "精简的运营",
"empoweredDecision": "增强的决策",
"unwaveringSupport": "坚定支持",
"seamlessIntegration": "无缝集成"
},
"experiences": {
"title": "基逻辑",
"taskText": "在 Briz 完成的任务数量",
"LiveNumberTask": "使用 Briz 执行的活动",
"title": "基逻辑",
"taskText": "在 Briz 完成的任务数量",
"LiveNumberTask": "与 Briz 完成的活动",
"insertTasks": {
"title": "插入任务并分配",
"points": "插入任务并将其分配店铺中的职位"
"points": "插入任务并将其分配店铺中的职位"
},
"createShiftPlan": {
"title": "创建明确的班次计划",
"points": "为每周创建明确的班次计划,并为每个班次分配监督员。"
"title": "创建清晰的班次计划",
"points": "为每周创建一个清晰的班次计划,并为每个班次指定一个主管。"
},
"specificPerson": {
"title": "任务分配给特定人员",
"points": "班次计划后,每项任务将成为分配给特定人员的活动。"
"title": "活动分配给特定人员",
"points": "在班次计划之后,每个任务成为分配给特定人员的活动。"
},
"realTime": {
"title": "实时",
"points": "实时在系统中跟踪运营常规。"
"points": "实时跟踪系统中的运营例程。"
},
"confirmsCompletion": {
"title": "确认完成",
"points": "班次结束后,您的监督员检查所有任务,确认完成并评估员工表现。"
"points": "班次结束后,您的主管会检查所有任务,确认完成并对员工进行评分。"
}
},
"phiData": {
"title": "PHI",
"desc": "咖啡的味道永远是最重要的。有了 PHI它将永远完美。Phi 代表黄金比例。如果按照黄金比例冲泡咖啡,它将永远味道醇美。在 PHI 部分,有三个框需要当班咖啡师填写。这些是调整每日咖啡配方的主要元素:",
"endDesc": "您的咖啡师输入每日配方,这将被记录在您的数据库中。您可以查看您的调整图表,了解您的咖啡店情况,并检查店内的咖啡质量。",
"title": "Phi",
"desc": "咖啡的味道始终是最重要的。使用 PHI味道将永远完美。Phi 意味着黄金比例。如果您按照黄金比例冲泡咖啡,味道总是会很好。在 Phi 部分,有三个框需要值班的咖啡师填写。这些是调整每日咖啡配方的主要元素:",
"endDesc": "您的咖啡师输入每日配方,将记录在您的数据库中。您可以查看调整图表,了解您的酒吧发生了什么,并检查您店内咖啡的质量。",
"bcg": {
"desc": "的是每次冲泡使用的精确咖啡粉量...",
"desc": "指每次冲泡使用的精确咖啡粉量...",
"title": "基础咖啡克数 (BCG)"
},
"oeg": {
"desc": "这是冲泡后提取的咖啡的最终重量...",
"title": "输出提取克 (OEG)"
"desc": "测量冲泡后提取的咖啡最终重量...",
"title": "输出提取克 (OEG)"
},
"et": {
"desc": "这是从开始到结束冲泡咖啡所花费的总时间...",
"title": "取时间 (ET)"
"desc": "从开始到完成冲泡咖啡所需的总时间...",
"title": "取时间 (ET)"
}
},
"stepProducts": {
"endDesc": "现在为接下来的一周设置您的班次。为每个班次中的每个职位分配员工并指定监督员。",
"endDesc": "现在只需为接下来的一周设置您的班次。为每个班次中的每个职位分配员工并指定主管。",
"setupRoutine": {
"desc": "您可以完全自定义定义您的运营系统...",
"title": "设置您的常规操作"
"desc": "您可以完全自定义定义您的运营系统...",
"title": "设置您的例程"
},
"setupSections": {
"desc": "定义您的区域以更好地了解您的运营...",
"title": "设置您的区域"
"desc": "定义您的部分以获得更好的运营洞察...",
"title": "设置您的部分"
},
"setupPositions": {
"desc": "职位在我们的平台中扮演着重要角色...",
"desc": "职位在我们的平台中起着关键作用...",
"title": "设置您的职位"
},
"setupStaffInfo": {
@ -89,58 +88,190 @@
"title": "设置员工信息"
},
"setupShiftsLogic": {
"desc": "您需要确定您的班次逻辑...",
"desc": "您需要建立您的班次逻辑...",
"title": "设置您的班次逻辑"
},
"insertTasks": {
"desc": "在此阶段设置所有任务...",
"desc": "在此阶段设置所有任务...",
"title": "插入所有任务"
}
},
"pricing": {
"title": "定价",
"desc": "通过我们灵活的时间定价方案,定制您的咖啡店管理。所有套餐均提供相同的全面功能,仅在时长上有所不同,以满足您的业务需求。从每月、每季度或每年选项中选择,每种方案都旨在提供便捷和高效的体验。",
"desc": "使用我们灵活的定价计划定制您的咖啡店管理。所有套餐提供相同的全面功能,仅在持续时间上有所不同,以适应您的业务需求。您可以选择按月、季度或年度选项,每种选项都旨在提供简便和高效。",
"oneMounth": {
"title": "个月",
"pricing1": "15,000,000 R",
"pricing2": "24,000,000 R",
"pricing3": "29,500,000 R",
"desc": "这可能是最适合您的套餐,请随时使用14天的免费试用",
"users1": "超过10位用户",
"users2": "超过25位用户",
"users3": "超过50位用户",
"button": "开始"
"title": "1 个月",
"pricing1": "15,000,000 ر",
"pricing2": "24,000,000 ر",
"pricing3": "29,500,000 ر",
"desc": "这可能是最适合您的套餐,因此请随意使用 14 天免费试用",
"users1": "最多 10 用户",
"users2": "最多 25 用户",
"users3": "最多 50 用户",
"button": "开始使用"
},
"threeMounth": {
"title": "个月",
"pricing1": "36,000,000 R",
"pricing2": "57,600,000 R",
"pricing3": "70,800,000 R",
"desc": "这可能是最适合您的套餐,请随时使用14天的免费试用",
"users1": "超过10位用户",
"users2": "超过25位用户",
"users3": "超过50位用户",
"button": "开始"
"title": "3 个月",
"pricing1": "36,000,000 ر",
"pricing2": "57,600,000 ر",
"pricing3": "70,800,000 ر",
"desc": "这可能是最适合您的套餐,因此请随意使用 14 天免费试用",
"users1": "最多 10 用户",
"users2": "最多 25 用户",
"users3": "最多 50 用户",
"button": "开始使用"
},
"sixMounth": {
"title": "一年",
"pricing1": "108,000,000 R",
"pricing2": "172,800,000 R",
"pricing3": "212,400,000 R",
"desc": "这可能是最适合您的套餐,请随时使用14天的免费试用",
"users1": "超过10位用户",
"users2": "超过25位用户",
"users3": "超过50位用户",
"button": "开始"
"title": "6 个月",
"pricing1": "108,000,000 ر",
"pricing2": "172,800,000 ر",
"pricing3": "212,400,000 ر",
"desc": "这可能是最适合您的套餐,因此请随意使用 14 天免费试用",
"users1": "最多 10 用户",
"users2": "最多 25 用户",
"users3": "最多 50 用户",
"button": "开始使用"
}
},
"login": {
"title": "Breeze",
"desc": "日常事务的和谐管理",
"acceptRule": "通过确认电话号码我同意Breeze应用的所有隐私条款",
"title": "Briz",
"desc": "和谐的例程管理",
"acceptRule": "确认电话号码即表示我同意 Briz 应用的所有隐私条件",
"loginInput": "输入您的电话号码",
"loginButton": "确认电话号码",
"confirmText": "验证码已发送至该号码",
"confirmInput": "输入发送的验证码"
"confirmText": "确认码已发送",
"confirmInput": "输入发送的代码",
"singUpDesc": "您需要一个电话号码才能进入或注册餐厅任务管理应用程序。请输入您的手机号码",
"singUpFirstNameInput": "名字",
"signUpLastNameInput": "姓氏",
"signUpComplexNameInput": "综合名称",
"signUpSupportPhoneNumberInput": "管理联系电话",
"signUpComplexAddressInput": "地址",
"signUpButton": "验证信息"
},
"homePage": {
"activityText": " 今日活动",
"shiftText": " 今日班次",
"shiftBoxAllactivities": "所有活动",
"shiftBoxActivityDone": "已完成活动",
"shiftBoxActivityNotDone": "未完成活动",
"shiftBoxShiftPercentage": "班次进度百分比",
"shiftBoxEmpty": "您没有开放的班次",
"surpriseText": "惊喜",
"addAdjust": "添加新调整",
"historyReports": "历史报告",
"titleReport1": "活动",
"subTitleReport1": "Excel 输出",
"titleReport2": "本周班次",
"subTitleReport2": "文本输出"
},
"coffee-brew": {
"title": "调整咖啡",
"subTitle": "咖啡调整机制",
"coffeeGramInput": "BCG | 咖啡克数",
"extractionTimeInput": "OEG | 提取时间",
"outputExtractGrammageInput": "ET | 输出提取克数",
"coffeeBrewButton": "注册",
"historyTitle": "调整历史",
"coffeeGramChart": "咖啡克数",
"extractionTimeChart": "提取时间",
"outputExtractGrammageChart": "输出提取"
},
"BottomSheet": {
"BottomSheetReport": "报告",
"BottomSheetReportDesc": "您正在获取活动报告",
"BottomSheetReportbutton": "提交",
"BottomSheetReportManageShiftTitle": "报告",
"BottomSheetReportManageShiftType1": "本周",
"BottomSheetReportManageShiftType2": "下周",
"BottomSheetReportManageShiftButton": "复制文本",
"BottomSheetAddUserToPositionShiftPlanTitle": "将用户添加到职位",
"BottomSheetCreateRoutineTitle": "添加新例程",
"BottomSheetCreateRoutineNameInput": "例程名称",
"BottomSheetCreateRoutineDescInput": "例程描述",
"BottomSheetCreateRoutineRegButton": "提交例程",
"BottomSheetCreateRoutineEditButton": "编辑例程",
"BottomSheetCreateRoutineDeleteButton": "删除",
"BottomSheetCreateSectionTitle": "添加新部分",
"BottomSheetCreateSectionNameInput": "部分名称",
"BottomSheetCreateSectionDescInput": "部分描述",
"BottomSheetCreateSectionRegButton": "提交部分",
"BottomSheetCreateSectionEditButton": "编辑部分",
"BottomSheetCreateSectionDeleteButton": "删除",
"BottomSheetCreatePositionTitle": "添加新职位",
"BottomSheetCreatePositionNameInput": "职位名称",
"BottomSheetCreatePositionDescInput": "职位描述",
"BottomSheetCreatePositionSectionInput": "关联部分",
"chooseText": "选择",
"BottomSheetCreatePositionRegButton": "提交职位",
"BottomSheetCreatePositionEditButton": "编辑职位",
"BottomSheetCreatePositionDeleteButton": "删除",
"BottomSheetCreateEmployeesTitle": "添加新员工",
"BottomSheetCreateEmployeesFirstNameInput": "名字",
"BottomSheetCreateEmployeesLastNameInput": "姓氏",
"BottomSheetCreateEmployeesGenderInput": "性别",
"BottomSheetCreateEmployeesPhoneNumberInput": "电话号码",
"BottomSheetCreateEmployeesJobTitleInput": "职位名称",
"BottomSheetCreateEmployeesRegButton": "提交员工",
"BottomSheetCreateEmployeesEditButton": "编辑员工",
"BottomSheetCreateEmployeesDeleteButton": "删除",
"BottomSheetCreateShiftsTitle": "添加新班次",
"BottomSheetCreateShiftsShiftNameInput": "班次名称",
"BottomSheetCreateShiftsStartTimeInput": "班次开始时间",
"BottomSheetCreateShiftsEndTimeInput": "班次结束时间",
"BottomSheetCreateShiftsShiftInWeekInput": "选择班次星期几",
"BottomSheetCreateShiftsRutineShiftInput": "班次例程",
"BottomSheetCreateShiftsDescInput": "班次描述",
"BottomSheetCreateShiftsRegButton": "提交班次",
"BottomSheetCreateShiftsEditButton": "编辑班次",
"BottomSheetCreateShiftsDeleteButton": "删除"
},
"shifts": {
"title": "复杂班次",
"subTitle": "复杂班次管理",
"ManageShiftButton": "管理本周班次",
"weekFilter": "本周班次",
"monthFilter": "本月班次",
"nextWeekFilter": "下周班次",
"nextMonthFilter": "下个月班次",
"lastWeekFilter": "上周班次",
"lastMonthkFilter": "上个月班次",
"shiftText": "班次",
"todayText": "今天",
"surpriseText": "惊喜",
"closeShiftButton": "关闭并确认班次"
},
"manage-shift": {
"title": "每周复杂班次",
"subTitle": "班次管理",
"routineTitle": "选择例程",
"dateTitle": "选择日期",
"shiftTitle": "选择班次",
"personnelTitle": "选择人员",
"surpriseTitle": "选择惊喜",
"surpriseInput": " 惊喜",
"surpriseInputDef": " 选择",
"surpriseSubTitle": "班次由主管关闭。请为每个班次指定。",
"404Shift": "您这一天没有班次",
"manageShiftRegButton": "活动注册",
"manageShiftEditButton": "编辑活动",
"editText": "您正在编辑"
},
"complete-shift": {
"title": "班次关闭操作",
"subTitle": "检查任务完成情况",
"todayText": "今天",
"reportText": "报告",
"completeShiftButton": "带积分关闭"
},
"employees": {
"title": "员工和角色管理",
"subTitle": "复杂设置的核心",
"routinesTitle": "例程管理",
"sectionsTitle": "部分管理",
"positionsTitle": "职位管理",
"staffsTitle": "员工管理",
"shiftsTitle": "班次管理",
"taskTitle": "添加任务"
}
}

View File

@ -1,18 +1,18 @@
/** @type {import('next').NextConfig} */
const withPWA = require("@ducanh2912/next-pwa").default({
cacheOnFrontEndNav: true,
aggressiveFrontEndNavCaching: true,
reloadOnOnline: true,
swcMinify: true,
dest: "public",
fallbacks: {
document: "/offline", // fallback to custom page
},
workboxOptions: {
disableDevLogs: true,
},
});
// const withPWA = require("@ducanh2912/next-pwa").default({
// cacheOnFrontEndNav: true,
// aggressiveFrontEndNavCaching: true,
// reloadOnOnline: true,
// swcMinify: true,
// dest: "public",
// fallbacks: {
// document: "/offline", // fallback to custom page
// },
// workboxOptions: {
// disableDevLogs: true,
// },
// });
const createNextIntlPlugin = require("next-intl/plugin");
@ -23,4 +23,4 @@ const withNextIntl = createNextIntlPlugin();
const nextConfig = {};
// Export the combined configuration
module.exports = withNextIntl(withPWA(nextConfig));
module.exports = withNextIntl(nextConfig);

View File

@ -8,6 +8,7 @@ import SimpleReactValidator from "simple-react-validator";
import CheckBoxBriz from "plugins/CheckBoxBriz/page";
import Buttonbriz from "plugins/Buttonbriz/page";
import { toast } from "react-toastify";
import { useLocale, useTranslations } from "next-intl";
const BottomSheetAddUserToPositionShiftPlan = ({
setUserAndPositionIds,
@ -20,6 +21,10 @@ const BottomSheetAddUserToPositionShiftPlan = ({
const [, forceUpdate] = useState();
const t = useTranslations("BottomSheet");
const locale = useLocale();
const isRTL = locale === "fa";
const validator = useRef(
new SimpleReactValidator({
messages: {
@ -43,7 +48,14 @@ const BottomSheetAddUserToPositionShiftPlan = ({
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">
افزودن یوزر به پوزیشن {positionName}
{isRTL ? (
<> افزودن یوزر به پوزیشن {positionName}</>
) : (
<>
{" "}
{t("BottomSheetAddUserToPositionShiftPlanTitle")} {positionName}
</>
)}
</p>
</div>

View File

@ -10,10 +10,16 @@ import Buttonbriz from "plugins/Buttonbriz/page";
import DatePickerIran from "plugins/DatePickerIran/page";
import moment from "jalali-moment";
import validateIranPhone from "plugins/IranPhoneRegex";
import { useLocale, useTranslations } from "next-intl";
const jalaliMoment = require("jalali-moment");
const BottomSheetCreateEmployees = (props) => {
const CTX = useContext(AppContext);
const t = useTranslations("BottomSheet");
const locale = useLocale();
const isRTL = locale === "fa";
const [firstName, setFirstName] = useState("");
const [lastName, setLastName] = useState("");
const [phoneNumber, setPhoneNumber] = useState("");
@ -199,14 +205,14 @@ const BottomSheetCreateEmployees = (props) => {
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">
افزودن کاربر جدید
{t("BottomSheetCreateEmployeesTitle")}{" "}
</p>
</div>
<div className="bg-body-100 p-4 ">
<div className="">
<Input
lable="نام "
lable={t("BottomSheetCreateEmployeesFirstNameInput")}
id="firstName-id"
name="firstName"
type={"text"}
@ -227,7 +233,7 @@ const BottomSheetCreateEmployees = (props) => {
<div>
<Input
lable="نام خانوادگی"
lable={t("BottomSheetCreateEmployeesLastNameInput")}
id="lastName-id"
name="lastName"
type={"text"}
@ -248,7 +254,7 @@ const BottomSheetCreateEmployees = (props) => {
<div className="">
<Input
lable="جنسیت"
lable={t("BottomSheetCreateEmployeesGenderInput")}
id="gender-id"
name="gender"
type={"text"}
@ -259,8 +265,8 @@ const BottomSheetCreateEmployees = (props) => {
style="text-right"
select={true}
selectData={[
{ key: "مرد", value: 0 },
{ key: "زن", value: 1 },
{ key: isRTL ? "مرد" : "male", value: 0 },
{ key: isRTL ? "زن" : "female", value: 1 },
]}
/>
</div>
@ -273,7 +279,7 @@ const BottomSheetCreateEmployees = (props) => {
<div className="">
<Input
lable="شماره تماس"
lable={t("BottomSheetCreateEmployeesPhoneNumberInput")}
id="phoneNumber-id"
name="phoneNumber"
type={"number"}
@ -308,7 +314,7 @@ const BottomSheetCreateEmployees = (props) => {
<div className="">
<Input
lable="سمت شغلی"
lable={t("BottomSheetCreateEmployeesJobTitleInput")}
id="roleIds-id"
name="roleIds"
type={"text"}
@ -333,7 +339,7 @@ const BottomSheetCreateEmployees = (props) => {
)}
select={true}
selectData={roleSelectData}
defaultValue={"انتخاب کنید"}
defaultValue={t("chooseText")}
/>
</div>
@ -388,17 +394,17 @@ const BottomSheetCreateEmployees = (props) => {
{goToEditUser ? (
<Buttonbriz
title="ویرایش کاربر"
title={t("BottomSheetCreateEmployeesEditButton")}
color="INFO"
icon="CHECK"
buttonEvent={() => handleCreateUser("UPDATE")}
subButton={true}
subButtonTitle="حذف کاربر"
subButtonTitle={t("BottomSheetCreateEmployeesDeleteButton")}
subButtonEvent={() => CTX.DeleteUser(idEditUser)}
/>
) : (
<Buttonbriz
title="ثبت کاربر"
title={t("BottomSheetCreateEmployeesRegButton")}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCreateUser()}

View File

@ -7,9 +7,14 @@ import AppContext from "@ctx/AppContext";
import SimpleReactValidator from "simple-react-validator";
import { toast } from "react-toastify";
import Buttonbriz from "plugins/Buttonbriz/page";
import { useLocale, useTranslations } from "next-intl";
const BottomSheetCreatePosition = (props) => {
const CTX = useContext(AppContext);
const t = useTranslations("BottomSheet");
const locale = useLocale();
const isRTL = locale === "fa";
const [title, setTitle] = useState("");
const [description, setDescription] = useState("");
const [sectionId, setSectionId] = useState("");
@ -125,14 +130,14 @@ const BottomSheetCreatePosition = (props) => {
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">
افزودن پوزیشن جدید{" "}
{t("BottomSheetCreatePositionTitle")}{" "}
</p>
</div>
<div className="bg-body-100 p-4 ">
<div className="">
<Input
lable="نام پوزیشن "
lable={t("BottomSheetCreatePositionNameInput")}
id="title-id"
name="title"
type={"text"}
@ -152,7 +157,7 @@ const BottomSheetCreatePosition = (props) => {
</div>
<div className="">
<Input
lable=" توضیحات"
lable={t("BottomSheetCreatePositionDescInput")}
id="description-id"
name="description"
type={"text"}
@ -174,7 +179,7 @@ const BottomSheetCreatePosition = (props) => {
<div className="">
<Input
lable="سکشن مد نظر"
lable={t("BottomSheetCreatePositionSectionInput")}
id="sectionId-id"
name="sectionId"
type={"text"}
@ -202,7 +207,7 @@ const BottomSheetCreatePosition = (props) => {
)}
select={true}
selectData={sectionIdSelectData}
defaultValue={"انتخاب کنید"}
defaultValue={t("chooseText")}
/>
</div>
@ -223,17 +228,17 @@ const BottomSheetCreatePosition = (props) => {
{goToEditPosition ? (
<Buttonbriz
title="ویرایش پوزیشن"
title={t("BottomSheetCreatePositionEditButton")}
color="INFO"
icon="CHECK"
buttonEvent={() => handleCreatePosition("UPDATE")}
subButton={true}
subButtonTitle="حذف پوزیشن"
subButtonTitle={t("BottomSheetCreatePositionDeleteButton")}
subButtonEvent={() => CTX.DeletePosition(idEditPosition)}
/>
) : (
<Buttonbriz
title="ثبت پوزیشن"
title={t("BottomSheetCreatePositionRegButton")}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCreatePosition()}

View File

@ -7,6 +7,7 @@ import AppContext from "@ctx/AppContext";
import SimpleReactValidator from "simple-react-validator";
import { toast } from "react-toastify";
import Buttonbriz from "plugins/Buttonbriz/page";
import { useLocale, useTranslations } from "next-intl";
const BottomSheetCreateRoutine = (props) => {
const CTX = useContext(AppContext);
@ -14,6 +15,9 @@ const BottomSheetCreateRoutine = (props) => {
const [description, setDescription] = useState("");
const [, forceUpdate] = useState();
const t = useTranslations("BottomSheet");
const locale = useLocale();
const isRTL = locale === "fa";
const validator = useRef(
new SimpleReactValidator({
@ -102,14 +106,14 @@ const BottomSheetCreateRoutine = (props) => {
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">
افزودن روتین جدید{" "}
{t("BottomSheetCreateRoutineTitle")}{" "}
</p>
</div>
<div className="bg-body-100 p-4 ">
<div className="">
<Input
lable="نام روتین "
lable={t("BottomSheetCreateRoutineNameInput")}
id="title-id"
name="title"
type={"text"}
@ -129,7 +133,7 @@ const BottomSheetCreateRoutine = (props) => {
</div>
<div className="">
<Input
lable=" توضیحات"
lable={t("BottomSheetCreateRoutineDescInput")}
id="description-id"
name="description"
type={"text"}
@ -151,17 +155,17 @@ const BottomSheetCreateRoutine = (props) => {
{goToEditRoutine ? (
<Buttonbriz
title="ویرایش روتین"
title={t("BottomSheetCreateRoutineEditButton")}
color="INFO"
icon="CHECK"
buttonEvent={() => handleCreateRoutine("UPDATE")}
subButton={true}
subButtonTitle="حذف روتین"
subButtonTitle={t("BottomSheetCreateRoutineDeleteButton")}
subButtonEvent={() => CTX.DeleteRoutine(idEditRoutine)}
/>
) : (
<Buttonbriz
title="ثبت روتین"
title={t("BottomSheetCreateRoutineRegButton")}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCreateRoutine()}

View File

@ -7,12 +7,17 @@ import AppContext from "@ctx/AppContext";
import SimpleReactValidator from "simple-react-validator";
import { toast } from "react-toastify";
import Buttonbriz from "plugins/Buttonbriz/page";
import { useLocale, useTranslations } from "next-intl";
const BottomSheetCreateSection = (props) => {
const CTX = useContext(AppContext);
const [title, setTitle] = useState("");
const [description, setDescription] = useState("");
const t = useTranslations("BottomSheet");
const locale = useLocale();
const isRTL = locale === "fa";
const [, forceUpdate] = useState();
const validator = useRef(
@ -102,14 +107,14 @@ const BottomSheetCreateSection = (props) => {
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">
افزودن سکشن جدید{" "}
{t("BottomSheetCreateSectionTitle")}{" "}
</p>
</div>
<div className="bg-body-100 p-4 ">
<div className="">
<Input
lable="نام سکشن "
lable={t("BottomSheetCreateSectionNameInput")}
id="title-id"
name="title"
type={"text"}
@ -129,7 +134,7 @@ const BottomSheetCreateSection = (props) => {
</div>
<div className="">
<Input
lable=" توضیحات"
lable={t("BottomSheetCreateSectionDescInput")}
id="description-id"
name="description"
type={"text"}
@ -151,17 +156,17 @@ const BottomSheetCreateSection = (props) => {
{goToEditSection ? (
<Buttonbriz
title="ویرایش سکشن"
title={t("BottomSheetCreateSectionEditButton")}
color="INFO"
icon="CHECK"
buttonEvent={() => handleCreateSection("UPDATE")}
subButton={true}
subButtonTitle="حذف سکشن"
subButtonTitle={t("BottomSheetCreateSectionEditButton")}
subButtonEvent={() => CTX.DeleteSection(idEditSection)}
/>
) : (
<Buttonbriz
title="ثبت سکشن"
title={t("BottomSheetCreateSectionRegButton")}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCreateSection()}

View File

@ -7,9 +7,14 @@ import AppContext from "@ctx/AppContext";
import SimpleReactValidator from "simple-react-validator";
import { toast } from "react-toastify";
import Buttonbriz from "plugins/Buttonbriz/page";
import { useLocale, useTranslations } from "next-intl";
const BottomSheetCreateShifts = (props) => {
const CTX = useContext(AppContext);
const t = useTranslations("BottomSheet");
const locale = useLocale();
const isRTL = locale === "fa";
const [title, setTitle] = useState("");
const [description, setDescription] = useState("");
const [dayOfWeeksCurrent, setDayOfWeeksCurrent] = useState("");
@ -42,13 +47,13 @@ const BottomSheetCreateShifts = (props) => {
);
const week = [
{ key: "شنبه", value: 6 },
{ key: "یکشنبه", value: 0 },
{ key: "دوشنبه", value: 1 },
{ key: "سه شنبه", value: 2 },
{ key: "چهار شنبه", value: 3 },
{ key: "پنج شنبه", value: 4 },
{ key: "جمعه", value: 5 },
{ key: isRTL ? "شنبه" : "Saturday ", value: 6 },
{ key: isRTL ? "یکشنبه" : "Sunday ", value: 0 },
{ key: isRTL ? "دوشنبه" : "Monday ", value: 1 },
{ key: isRTL ? "سه شنبه" : "Tuesday ", value: 2 },
{ key: isRTL ? "چهار شنبه" : "Wednesday ", value: 3 },
{ key: isRTL ? "پنج شنبه" : "Thursday ", value: 4 },
{ key: isRTL ? "جمعه" : "Friday ", value: 5 },
];
const clear = () => {
@ -153,14 +158,14 @@ const BottomSheetCreateShifts = (props) => {
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">
افزودن شیفت کاری جدید
{t("BottomSheetCreateShiftsTitle")}{" "}
</p>
</div>
<div className="bg-body-100 p-4 ">
<div className="">
<Input
lable="نام شیفت مورد نظر"
lable={t("BottomSheetCreateShiftsShiftNameInput")}
id="title-id"
name="title"
type={"text"}
@ -181,7 +186,7 @@ const BottomSheetCreateShifts = (props) => {
<div className="">
<Input
lable=" ساعت شروع شیفت"
lable={t("BottomSheetCreateShiftsStartTimeInput")}
id="startAtTimeShift-id"
name="startAtTimeShift"
type={"text"}
@ -215,7 +220,7 @@ const BottomSheetCreateShifts = (props) => {
<div className="">
<Input
lable=" ساعت پایان شیفت"
lable={t("BottomSheetCreateShiftsEndTimeInput")}
id="endAtTimeShift-id"
name="endAtTimeShift"
type={"text"}
@ -249,7 +254,7 @@ const BottomSheetCreateShifts = (props) => {
<div className="">
<Input
lable="انتخاب روزهای این شیفت در هفته"
lable={t("BottomSheetCreateShiftsShiftInWeekInput")}
id="dayOfWeeksCurrent-id"
name="dayOfWeeksCurrent"
type={"text"}
@ -272,15 +277,15 @@ const BottomSheetCreateShifts = (props) => {
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 },
{ key: isRTL ? "شنبه" : "Saturday ", value: parseInt(6) },
{ key: isRTL ? "یکشنبه" : "Sunday", value: 0 },
{ key: isRTL ? "دوشنبه" : "Monday", value: 1 },
{ key: isRTL ? "سه شنبه" : "Tuesday", value: 2 },
{ key: isRTL ? "چهار شنبه" : "Wednesday", value: 3 },
{ key: isRTL ? "پنج شنبه" : "Thursday", value: 4 },
{ key: isRTL ? "جمعه" : "Friday", value: 5 },
]}
defaultValue={"انتخاب کنید"}
defaultValue={t("chooseText")}
/>
</div>
<div className="flex flex-wrap mt-3 rtl">
@ -302,7 +307,7 @@ const BottomSheetCreateShifts = (props) => {
</div>
<div className="">
<Input
lable="روتین شیفت"
lable={t("BottomSheetCreateShiftsRutineShiftInput")}
id="routineId-id"
name="routineId"
type={"text"}
@ -317,7 +322,7 @@ const BottomSheetCreateShifts = (props) => {
)}
select={true}
selectData={routineIdSelectData}
defaultValue={"انتخاب کنید"}
defaultValue={t("chooseText")}
/>
</div>
@ -333,7 +338,7 @@ const BottomSheetCreateShifts = (props) => {
<div className="">
<Input
lable=" توضیحات"
lable={t("BottomSheetCreateShiftsDescInput")}
id="description-id"
name="description"
type={"text"}
@ -348,17 +353,17 @@ const BottomSheetCreateShifts = (props) => {
</div>
{goToEditShift ? (
<Buttonbriz
title="ویرایش شیفت"
title={t("BottomSheetCreateShiftsEditButton")}
color="INFO"
icon="CHECK"
buttonEvent={() => handleCreateShift("UPDATE")}
subButton={true}
subButtonTitle="حذف شیفت"
subButtonTitle={t("BottomSheetCreateShiftsDeleteButton")}
subButtonEvent={() => CTX.DeleteShift(idEditShift)}
/>
) : (
<Buttonbriz
title="ثبت شیفت"
title={t("BottomSheetCreateShiftsRegButton")}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCreateShift()}

View File

@ -8,10 +8,14 @@ import SimpleReactValidator from "simple-react-validator";
import CheckBoxBriz from "plugins/CheckBoxBriz/page";
import Buttonbriz from "plugins/Buttonbriz/page";
import { toast } from "react-toastify";
import { useLocale, useTranslations } from "next-intl";
const BottomSheetReport = (props) => {
const CTX = useContext(AppContext);
const reportDetail = CTX.state.reportDetail;
const t = useTranslations("BottomSheet");
const locale = useLocale();
const isRTL = locale === "fa";
const handleSendReport_SHIFTPLAN = () => {
CTX.ReportShiftPlan(reportDetail?.shiftId);
@ -30,20 +34,21 @@ const BottomSheetReport = (props) => {
blocking={true}
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">گزارشات </p>
<p className="mb-0 text-primary-300 relative top-[-5px]">
{" "}
{t("BottomSheetReportTitle")}{" "}
</p>
</div>
<div className="px-3 pt-10 ">
<p className="mb-0 text-center text-sm font-light">
شما در حال گرفتن گزارش برای
<small className="text-sm font-medium"> {reportDetail?.title} </small>
هستید
{t("BottomSheetReportDesc")}
</p>
</div>
<div className=" p-4">
<Buttonbriz
title="گرفتن گزارش"
title={t("BottomSheetReportbutton")}
color="INFO"
icon="CHECK"
buttonEvent={() => {

View File

@ -10,10 +10,15 @@ import Buttonbriz from "plugins/Buttonbriz/page";
import { toast } from "react-toastify";
import PersianNumber from "plugins/PersianNumber";
import moment from "jalali-moment";
import { useLocale, useTranslations } from "next-intl";
const BottomSheetReportManageShift = (props) => {
const CTX = useContext(AppContext);
const shiftplansData = CTX.state.shiftPlansData;
const t = useTranslations("BottomSheet");
const locale = useLocale();
const isRTL = locale === "fa";
const [shiftplans, setShiftplans] = useState([]);
const [type, setType] = useState(0);
@ -118,7 +123,10 @@ const BottomSheetReportManageShift = (props) => {
blocking={true}
>
<div className="text-center py-2 bg-secondary-950 ">
<p className="mb-0 text-primary-300 relative top-[-5px]">گزارشات </p>
<p className="mb-0 text-primary-300 relative top-[-5px]">
{" "}
{t("BottomSheetReportManageShiftTitle")}{" "}
</p>
</div>
<div className="flex bg-gray-100 rounded-xl m-3 rtl">
@ -133,7 +141,7 @@ const BottomSheetReportManageShift = (props) => {
type == 0 ? "text-white" : " text-secondary-900"
}`}
>
همین هفته{" "}
{t("BottomSheetReportManageShiftType1")}{" "}
</p>
</div>
<div
@ -147,7 +155,7 @@ const BottomSheetReportManageShift = (props) => {
type == 1 ? "text-white" : " text-secondary-900"
}`}
>
هفته بعد{" "}
{t("BottomSheetReportManageShiftType2")}{" "}
</p>
</div>
</div>
@ -199,7 +207,7 @@ const BottomSheetReportManageShift = (props) => {
<div className=" p-4">
<Buttonbriz
title="کپی کردن متن "
title={t("BottomSheetReportManageShiftButton")}
color="INFO"
icon="CHECK"
buttonEvent={() => {

View File

@ -2,8 +2,8 @@ import moment from "jalali-moment";
import React from "react";
const FormatJalaliDate = (date, noYear) => {
const jalaliDateDay = moment(date).locale("fa").format("jD");
const jalaliDateYear = moment(date).locale("fa").format("jYYYY");
const jalaliDateDay = moment(date).locale("fa").format("D");
const jalaliDateYear = moment(date).locale("fa").format("YYYY");
// Extract day name
const dayName = moment(date).locale("fa").format("dddd");
@ -15,7 +15,7 @@ const FormatJalaliDate = (date, noYear) => {
// Get the Persian day name
// Extract month name
const monthName = moment(date).locale("fa").format("jMMMM");
const monthName = moment(date).locale("fa").format("MMMM");
if (noYear) {
result = `${dayName} ${jalaliDateDay} ${monthName}`;

View File

@ -0,0 +1,29 @@
import moment from "jalali-moment";
import React from "react";
const FormatJalaliDateEn = (date, noYear) => {
const jalaliDateDay = moment(date).format("D");
const jalaliDateYear = moment(date).format("YYYY");
// Extract day name
const dayName = moment(date).format("dddd");
let result = null;
// Map English day names to Persian
// Get the Persian day name
// Extract month name
const monthName = moment(date).format("MMMM");
if (noYear) {
result = `${dayName} ${jalaliDateDay} ${monthName}`;
} else {
result = `${dayName} ${jalaliDateDay} ${monthName} ${jalaliDateYear}`;
}
return result;
};
export default FormatJalaliDateEn;

View File

@ -1,3 +1,4 @@
import { useLocale } from "next-intl";
import React from "react";
const Input = ({
@ -20,18 +21,20 @@ const Input = ({
selectData,
defaultValue,
}) => {
const locale = useLocale();
const isRTL = locale === "fa";
return (
<div
class={`relative ${mt ? `mt-${mt}` : "mt-8"} ${
disabled ? "opacity-40" : ""
}`}
} ${isRTL ? "!text-right" : "!text-left"}`}
>
{textarea ? (
<textarea
type="text"
className={`peer w-full border-b placeholder:text-transparent relative rtl !text-sm ${
theme == 1 ? "form-control-white" : "form-control"
}`}
} ${isRTL ? "!text-right" : "!text-left"}`}
placeholder={name}
disabled={disabled ? true : false}
readOnly={readOnly ? true : false}
@ -43,7 +46,9 @@ const Input = ({
<select
className={`peer w-full border-b placeholder:text-transparent rtl text-sm ${
theme == 1 ? "form-control-white" : "form-control"
} ${style ? style : ""} relative`}
} ${style ? style : ""} relative ${
isRTL ? "!text-right" : "!text-left"
}`}
placeholder={name}
disabled={disabled ? true : false}
readOnly={readOnly ? true : false}
@ -71,7 +76,9 @@ const Input = ({
id={id}
className={`peer w-full border-b placeholder:text-transparent rtl !text-sm ${
theme == 1 ? "form-control-white" : "form-control"
} ${style ? style : ""} relative`}
} ${style ? style : ""} relative ${
isRTL ? "!text-right" : "!text-left"
}`}
placeholder={name}
disabled={disabled ? true : false}
readOnly={readOnly ? true : false}
@ -90,8 +97,10 @@ const Input = ({
<label
htmlFor={id}
className={`absolute right-0 mr-3 px-1 -translate-y-3 ${
className={`absolute mr-3 px-1 -translate-y-3 ${
theme == 1 ? "bg-white" : "bg-body-100"
} ${
isRTL ? "right-0" : "left-3"
} text-sm duration-100 ease-linear peer-placeholder-shown:translate-y-[15px] peer-placeholder-shown:text-base peer-placeholder-shown:text-gray-500 peer-focus:mr-6 peer-focus:-translate-y-3 peer-focus:px-1 peer-focus:text-sm`}
>
{lable}

View File

@ -16,7 +16,7 @@
\************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\nself.fallback = async (_)=>{\n let { destination: e, url: A } = _, s = {\n document: \"/offline\",\n image: false,\n audio: false,\n video: false,\n font: false\n }[e];\n return s ? caches.match(s, {\n ignoreSearch: !0\n }) : \"\" === e && false && 0 ? 0 : Response.error();\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGR1Y2FuaDI5MTIvbmV4dC1wd2EvZGlzdC9mYWxsYmFjay5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQSxVQUFVLHlCQUF5QjtBQUNuQyxrQkFBa0IsVUFBcUM7QUFDdkQsZUFBZSxLQUFrQztBQUNqRCxlQUFlLEtBQWtDO0FBQ2pELGVBQWUsS0FBa0M7QUFDakQsY0FBYyxLQUFpQztBQUMvQyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUssZ0JBQWdCLEtBQWlDLElBQUksQ0FBd0MsR0FBRyxDQUUvRjtBQUNOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZHVjYW5oMjkxMi9uZXh0LXB3YS9kaXN0L2ZhbGxiYWNrLmpzP2U4YjAiXSwic291cmNlc0NvbnRlbnQiOlsic2VsZi5mYWxsYmFjayA9IGFzeW5jIChfKT0+e1xuICAgIGxldCB7IGRlc3RpbmF0aW9uOiBlLCB1cmw6IEEgfSA9IF8sIHMgPSB7XG4gICAgICAgIGRvY3VtZW50OiBwcm9jZXNzLmVudi5fX1BXQV9GQUxMQkFDS19ET0NVTUVOVF9fLFxuICAgICAgICBpbWFnZTogcHJvY2Vzcy5lbnYuX19QV0FfRkFMTEJBQ0tfSU1BR0VfXyxcbiAgICAgICAgYXVkaW86IHByb2Nlc3MuZW52Ll9fUFdBX0ZBTExCQUNLX0FVRElPX18sXG4gICAgICAgIHZpZGVvOiBwcm9jZXNzLmVudi5fX1BXQV9GQUxMQkFDS19WSURFT19fLFxuICAgICAgICBmb250OiBwcm9jZXNzLmVudi5fX1BXQV9GQUxMQkFDS19GT05UX19cbiAgICB9W2VdO1xuICAgIHJldHVybiBzID8gY2FjaGVzLm1hdGNoKHMsIHtcbiAgICAgICAgaWdub3JlU2VhcmNoOiAhMFxuICAgIH0pIDogXCJcIiA9PT0gZSAmJiBwcm9jZXNzLmVudi5fX1BXQV9GQUxMQkFDS19EQVRBX18gJiYgQS5tYXRjaCgvXFwvX25leHRcXC9kYXRhXFwvLitcXC8uK1xcLmpzb24kL2kpID8gY2FjaGVzLm1hdGNoKHByb2Nlc3MuZW52Ll9fUFdBX0ZBTExCQUNLX0RBVEFfXywge1xuICAgICAgICBpZ25vcmVTZWFyY2g6ICEwXG4gICAgfSkgOiBSZXNwb25zZS5lcnJvcigpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@ducanh2912/next-pwa/dist/fallback.js\n"));
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\nself.fallback = async (_)=>{\n let { destination: e, url: A } = _, s = {\n document: \"/offline\",\n image: false,\n audio: false,\n video: false,\n font: false\n }[e];\n return s ? caches.match(s, {\n ignoreSearch: !0\n }) : \"\" === e && false && 0 ? 0 : Response.error();\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGR1Y2FuaDI5MTIvbmV4dC1wd2EvZGlzdC9mYWxsYmFjay5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQSxVQUFVLHlCQUF5QjtBQUNuQyxrQkFBa0IsVUFBcUM7QUFDdkQsZUFBZSxLQUFrQztBQUNqRCxlQUFlLEtBQWtDO0FBQ2pELGVBQWUsS0FBa0M7QUFDakQsY0FBYyxLQUFpQztBQUMvQyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUssZ0JBQWdCLEtBQWlDLElBQUksQ0FBd0MsR0FBRyxDQUUvRjtBQUNOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZHVjYW5oMjkxMi9uZXh0LXB3YS9kaXN0L2ZhbGxiYWNrLmpzP2NlNGIiXSwic291cmNlc0NvbnRlbnQiOlsic2VsZi5mYWxsYmFjayA9IGFzeW5jIChfKT0+e1xuICAgIGxldCB7IGRlc3RpbmF0aW9uOiBlLCB1cmw6IEEgfSA9IF8sIHMgPSB7XG4gICAgICAgIGRvY3VtZW50OiBwcm9jZXNzLmVudi5fX1BXQV9GQUxMQkFDS19ET0NVTUVOVF9fLFxuICAgICAgICBpbWFnZTogcHJvY2Vzcy5lbnYuX19QV0FfRkFMTEJBQ0tfSU1BR0VfXyxcbiAgICAgICAgYXVkaW86IHByb2Nlc3MuZW52Ll9fUFdBX0ZBTExCQUNLX0FVRElPX18sXG4gICAgICAgIHZpZGVvOiBwcm9jZXNzLmVudi5fX1BXQV9GQUxMQkFDS19WSURFT19fLFxuICAgICAgICBmb250OiBwcm9jZXNzLmVudi5fX1BXQV9GQUxMQkFDS19GT05UX19cbiAgICB9W2VdO1xuICAgIHJldHVybiBzID8gY2FjaGVzLm1hdGNoKHMsIHtcbiAgICAgICAgaWdub3JlU2VhcmNoOiAhMFxuICAgIH0pIDogXCJcIiA9PT0gZSAmJiBwcm9jZXNzLmVudi5fX1BXQV9GQUxMQkFDS19EQVRBX18gJiYgQS5tYXRjaCgvXFwvX25leHRcXC9kYXRhXFwvLitcXC8uK1xcLmpzb24kL2kpID8gY2FjaGVzLm1hdGNoKHByb2Nlc3MuZW52Ll9fUFdBX0ZBTExCQUNLX0RBVEFfXywge1xuICAgICAgICBpZ25vcmVTZWFyY2g6ICEwXG4gICAgfSkgOiBSZXNwb25zZS5lcnJvcigpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@ducanh2912/next-pwa/dist/fallback.js\n"));
/***/ })

File diff suppressed because one or more lines are too long

View File

@ -16,7 +16,7 @@
\*******************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\nself.onmessage = async (e)=>{\n switch(e.data.type){\n case \"__START_URL_CACHE__\":\n {\n let t = e.data.url, a = await fetch(t);\n if (!a.redirected) return (await caches.open(\"start-url\")).put(t, a);\n return Promise.resolve();\n }\n case \"__FRONTEND_NAV_CACHE__\":\n {\n let t = e.data.url, a = await caches.open(\"pages\");\n if (await a.match(t, {\n ignoreSearch: !0\n })) return;\n let s = await fetch(t);\n if (!s.ok) return;\n if (a.put(t, s.clone()), e.data.shouldCacheAggressively && s.headers.get(\"Content-Type\")?.includes(\"text/html\")) try {\n let e = await s.text(), t = [], a = await caches.open(\"static-style-assets\"), r = await caches.open(\"next-static-js-assets\"), c = await caches.open(\"static-js-assets\");\n for (let [s, r] of e.matchAll(/<link.*?href=['\"](.*?)['\"].*?>/g))/rel=['\"]stylesheet['\"]/.test(s) && t.push(a.match(r).then((e)=>e ? Promise.resolve() : a.add(r)));\n for (let [, a] of e.matchAll(/<script.*?src=['\"](.*?)['\"].*?>/g)){\n let e = /\\/_next\\/static.+\\.js$/i.test(a) ? r : c;\n t.push(e.match(a).then((t)=>t ? Promise.resolve() : e.add(a)));\n }\n return await Promise.all(t);\n } catch {}\n return Promise.resolve();\n }\n default:\n return Promise.resolve();\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGR1Y2FuaDI5MTIvbmV4dC1wd2EvZGlzdC9zdy1lbnRyeS13b3JrZXIuanMiLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGR1Y2FuaDI5MTIvbmV4dC1wd2EvZGlzdC9zdy1lbnRyeS13b3JrZXIuanM/YjIzYiJdLCJzb3VyY2VzQ29udGVudCI6WyJzZWxmLm9ubWVzc2FnZSA9IGFzeW5jIChlKT0+e1xuICAgIHN3aXRjaChlLmRhdGEudHlwZSl7XG4gICAgICAgIGNhc2UgXCJfX1NUQVJUX1VSTF9DQUNIRV9fXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBlLmRhdGEudXJsLCBhID0gYXdhaXQgZmV0Y2godCk7XG4gICAgICAgICAgICAgICAgaWYgKCFhLnJlZGlyZWN0ZWQpIHJldHVybiAoYXdhaXQgY2FjaGVzLm9wZW4oXCJzdGFydC11cmxcIikpLnB1dCh0LCBhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJfX0ZST05URU5EX05BVl9DQUNIRV9fXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBlLmRhdGEudXJsLCBhID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJwYWdlc1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgYS5tYXRjaCh0LCB7XG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZVNlYXJjaDogITBcbiAgICAgICAgICAgICAgICB9KSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGxldCBzID0gYXdhaXQgZmV0Y2godCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzLm9rKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGEucHV0KHQsIHMuY2xvbmUoKSksIGUuZGF0YS5zaG91bGRDYWNoZUFnZ3Jlc3NpdmVseSAmJiBzLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmNsdWRlcyhcInRleHQvaHRtbFwiKSkgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBhd2FpdCBzLnRleHQoKSwgdCA9IFtdLCBhID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJzdGF0aWMtc3R5bGUtYXNzZXRzXCIpLCByID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJuZXh0LXN0YXRpYy1qcy1hc3NldHNcIiksIGMgPSBhd2FpdCBjYWNoZXMub3BlbihcInN0YXRpYy1qcy1hc3NldHNcIik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IFtzLCByXSBvZiBlLm1hdGNoQWxsKC88bGluay4qP2hyZWY9WydcIl0oLio/KVsnXCJdLio/Pi9nKSkvcmVsPVsnXCJdc3R5bGVzaGVldFsnXCJdLy50ZXN0KHMpICYmIHQucHVzaChhLm1hdGNoKHIpLnRoZW4oKGUpPT5lID8gUHJvbWlzZS5yZXNvbHZlKCkgOiBhLmFkZChyKSkpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBbLCBhXSBvZiBlLm1hdGNoQWxsKC88c2NyaXB0Lio/c3JjPVsnXCJdKC4qPylbJ1wiXS4qPz4vZykpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSAvXFwvX25leHRcXC9zdGF0aWMuK1xcLmpzJC9pLnRlc3QoYSkgPyByIDogYztcbiAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChlLm1hdGNoKGEpLnRoZW4oKHQpPT50ID8gUHJvbWlzZS5yZXNvbHZlKCkgOiBlLmFkZChhKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbCh0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICB7fVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@ducanh2912/next-pwa/dist/sw-entry-worker.js\n"));
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\nself.onmessage = async (e)=>{\n switch(e.data.type){\n case \"__START_URL_CACHE__\":\n {\n let t = e.data.url, a = await fetch(t);\n if (!a.redirected) return (await caches.open(\"start-url\")).put(t, a);\n return Promise.resolve();\n }\n case \"__FRONTEND_NAV_CACHE__\":\n {\n let t = e.data.url, a = await caches.open(\"pages\");\n if (await a.match(t, {\n ignoreSearch: !0\n })) return;\n let s = await fetch(t);\n if (!s.ok) return;\n if (a.put(t, s.clone()), e.data.shouldCacheAggressively && s.headers.get(\"Content-Type\")?.includes(\"text/html\")) try {\n let e = await s.text(), t = [], a = await caches.open(\"static-style-assets\"), r = await caches.open(\"next-static-js-assets\"), c = await caches.open(\"static-js-assets\");\n for (let [s, r] of e.matchAll(/<link.*?href=['\"](.*?)['\"].*?>/g))/rel=['\"]stylesheet['\"]/.test(s) && t.push(a.match(r).then((e)=>e ? Promise.resolve() : a.add(r)));\n for (let [, a] of e.matchAll(/<script.*?src=['\"](.*?)['\"].*?>/g)){\n let e = /\\/_next\\/static.+\\.js$/i.test(a) ? r : c;\n t.push(e.match(a).then((t)=>t ? Promise.resolve() : e.add(a)));\n }\n return await Promise.all(t);\n } catch {}\n return Promise.resolve();\n }\n default:\n return Promise.resolve();\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGR1Y2FuaDI5MTIvbmV4dC1wd2EvZGlzdC9zdy1lbnRyeS13b3JrZXIuanMiLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGR1Y2FuaDI5MTIvbmV4dC1wd2EvZGlzdC9zdy1lbnRyeS13b3JrZXIuanM/NmM4NCJdLCJzb3VyY2VzQ29udGVudCI6WyJzZWxmLm9ubWVzc2FnZSA9IGFzeW5jIChlKT0+e1xuICAgIHN3aXRjaChlLmRhdGEudHlwZSl7XG4gICAgICAgIGNhc2UgXCJfX1NUQVJUX1VSTF9DQUNIRV9fXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBlLmRhdGEudXJsLCBhID0gYXdhaXQgZmV0Y2godCk7XG4gICAgICAgICAgICAgICAgaWYgKCFhLnJlZGlyZWN0ZWQpIHJldHVybiAoYXdhaXQgY2FjaGVzLm9wZW4oXCJzdGFydC11cmxcIikpLnB1dCh0LCBhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJfX0ZST05URU5EX05BVl9DQUNIRV9fXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBlLmRhdGEudXJsLCBhID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJwYWdlc1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgYS5tYXRjaCh0LCB7XG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZVNlYXJjaDogITBcbiAgICAgICAgICAgICAgICB9KSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGxldCBzID0gYXdhaXQgZmV0Y2godCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzLm9rKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGEucHV0KHQsIHMuY2xvbmUoKSksIGUuZGF0YS5zaG91bGRDYWNoZUFnZ3Jlc3NpdmVseSAmJiBzLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmNsdWRlcyhcInRleHQvaHRtbFwiKSkgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBhd2FpdCBzLnRleHQoKSwgdCA9IFtdLCBhID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJzdGF0aWMtc3R5bGUtYXNzZXRzXCIpLCByID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJuZXh0LXN0YXRpYy1qcy1hc3NldHNcIiksIGMgPSBhd2FpdCBjYWNoZXMub3BlbihcInN0YXRpYy1qcy1hc3NldHNcIik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IFtzLCByXSBvZiBlLm1hdGNoQWxsKC88bGluay4qP2hyZWY9WydcIl0oLio/KVsnXCJdLio/Pi9nKSkvcmVsPVsnXCJdc3R5bGVzaGVldFsnXCJdLy50ZXN0KHMpICYmIHQucHVzaChhLm1hdGNoKHIpLnRoZW4oKGUpPT5lID8gUHJvbWlzZS5yZXNvbHZlKCkgOiBhLmFkZChyKSkpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBbLCBhXSBvZiBlLm1hdGNoQWxsKC88c2NyaXB0Lio/c3JjPVsnXCJdKC4qPylbJ1wiXS4qPz4vZykpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSAvXFwvX25leHRcXC9zdGF0aWMuK1xcLmpzJC9pLnRlc3QoYSkgPyByIDogYztcbiAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChlLm1hdGNoKGEpLnRoZW4oKHQpPT50ID8gUHJvbWlzZS5yZXNvbHZlKCkgOiBlLmFkZChhKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbCh0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICB7fVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@ducanh2912/next-pwa/dist/sw-entry-worker.js\n"));
/***/ })

View File

@ -12,6 +12,7 @@ import Chapar from "plugins/Chapar";
import { toast } from "react-toastify";
import CoffeeBrewChart from "plugins/Charts/CoffeeBrewChart";
import NothingFound from "plugins/NothingFound/page";
import { useLocale, useTranslations } from "next-intl";
const page = () => {
const router = useRouter();
@ -23,6 +24,10 @@ const page = () => {
const [finalYield, setFinalYield] = useState("");
const [, forceUpdate] = useState();
const t = useTranslations("coffee-brew");
const locale = useLocale();
const isRTL = locale === "fa";
const validator = useRef(
new SimpleReactValidator({
messages: {
@ -101,8 +106,8 @@ const page = () => {
{" "}
<div className="pb-20">
<AppHeader
title="ادجاست قهوه"
sub="مکانیزم ادجاست قهوه"
title={t("title")}
sub={t("subTitle")}
// icon1={true}
// iconName1="PLUS"
// iconHref1="#"
@ -120,7 +125,7 @@ const page = () => {
<div className="bg-white overflow-hidden p-5 rtl">
<div className="">
<Input
lable=" BCG | گرماژ قهوه "
lable={t("coffeeGramInput")}
id="ratio-id"
theme={1}
name="ratio"
@ -142,7 +147,7 @@ const page = () => {
</div>
<div className="">
<Input
lable=" OEG | زمان عصاره گیری"
lable={t("extractionTimeInput")}
id="extractionTime-id"
theme={1}
name="extractionTime"
@ -164,7 +169,7 @@ const page = () => {
</div>
<div className="">
<Input
lable="ET | گرماژ عصاره خروجی"
lable={t("outputExtractGrammageInput")}
id="finalYield-id"
theme={1}
name="finalYield"
@ -187,7 +192,7 @@ const page = () => {
<div>
{" "}
<Buttonbriz
title="ثبت"
title={t("coffeeBrewButton")}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => CreateBrew()}
@ -198,7 +203,7 @@ const page = () => {
coffeeBrewData?.currentRecipe?.logAt != "0001-01-01T00:00:00" ? (
<>
<h3 className="text-right px-3 pb-1 font-medium mt-7 text-sm">
تاریخچه ادجاست ها
{t("historyTitle")}
</h3>
<div className="flex justify-between mt-4">
<div className=" ">
@ -206,7 +211,7 @@ const page = () => {
<div className="w-5 p-1 rounded-full bg-[#4bc0c0]"></div>
<div>
<p className="mb-0 text-gray-400 text-[12px] mt-1 font-medium text-center">
گرماژ قهوه{" "}
{t("coffeeGramChart")}
</p>
</div>
</div>
@ -219,7 +224,7 @@ const page = () => {
<div>
<p className="mb-0 text-gray-400 text-[12px] mt-1 font-medium text-center">
زمان عصاره گیری{" "}
{t("extractionTimeChart")}
</p>
</div>
</div>
@ -232,7 +237,7 @@ const page = () => {
<div>
<p className="mb-0 text-gray-400 text-[12px] mt-1 font-medium text-center">
گرماژ عصاره خروجی{" "}
{t("outputExtractGrammageChart")}
</p>
</div>
</div>

View File

@ -23,6 +23,7 @@ import HasPermission from "plugins/HasPermission/page";
import { useRouter } from "next/navigation";
import TasksEmployees from "@comp/EmployeesComponent/Tasks/page";
import BottomSheetCreateTask from "plugins/BottomSheet/BottomSheetCreateTask";
import { useLocale, useTranslations } from "next-intl";
// import second from "@img/test.png";
@ -31,6 +32,10 @@ const Employees = (props) => {
const permissions = CTX.state.profile?.permissions;
const pageGetTasks = CTX.state.pageGetTasks;
const t = useTranslations("employees");
const locale = useLocale();
const isRTL = locale === "fa";
const router = useRouter();
const [activeSection, setActiveSection] = useState(0);
@ -88,12 +93,9 @@ const Employees = (props) => {
return (
<div className="pb-20">
<AppHeader
title=" مدیریت کارکنان و نقش ها"
sub=" هسته اصلی تنظیمات مجموعه"
/>
<AppHeader title={t("title")} sub={t("subTitle")} />
<div className="bg-white overflow-hidden p-5 rtl">
<div className={`bg-white overflow-hidden p-5 ${isRTL ? "rtl" : "ltr"}`}>
{" "}
<div
className={` ${
@ -112,8 +114,8 @@ const Employees = (props) => {
<PersianNumber number={1} style="!text-[15px] " />
</p>
</div>
<div className="pt-1 pr-2 ">
<h4 className="text-sm font-bold">مدیریت روتین های مجموعه</h4>
<div className="pt-2 px-2 ">
<h4 className="text-sm font-bold">{t("routinesTitle")}</h4>
</div>
</div>
{HasPermission("ManageRoutines", permissions) && (
@ -121,7 +123,7 @@ const Employees = (props) => {
{" "}
{activeSection == 0 ? (
<div
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 ml-3 "
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 mx-3 "
onClick={() => CTX.setBottomSheetCreateRoutineOpen(true)}
>
<svg
@ -167,8 +169,8 @@ const Employees = (props) => {
<PersianNumber number={2} style="!text-[15px] " />
</p>
</div>
<div className="pt-1 pr-2 ">
<h4 className="text-sm font-bold">مدیریت سکشن های مجموعه</h4>
<div className="pt-2 px-2 ">
<h4 className="text-sm font-bold">{t("sectionsTitle")}</h4>
</div>
</div>
@ -176,7 +178,7 @@ const Employees = (props) => {
<>
{activeSection == 1 ? (
<div
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 ml-3 "
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 mx-3 "
onClick={() => CTX.setBottomSheetCreateSectionOpen(true)}
>
<svg
@ -218,8 +220,8 @@ const Employees = (props) => {
<PersianNumber number={3} style="!text-[15px] " />
</p>
</div>
<div className="pt-1 pr-2 ">
<h4 className="text-sm font-bold">مدیریت پوزیشن های مجموعه</h4>
<div className="pt-2 px-2 ">
<h4 className="text-sm font-bold">{t("positionsTitle")}</h4>
</div>
</div>
@ -227,7 +229,7 @@ const Employees = (props) => {
<>
{activeSection == 2 ? (
<div
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 ml-3 "
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 mx-3 "
onClick={() => CTX.setBottomSheetCreatePositionOpen(true)}
>
<svg
@ -272,8 +274,8 @@ const Employees = (props) => {
<PersianNumber number={4} style="!text-[15px] " />
</p>
</div>
<div className="pt-1 pr-2 ">
<h4 className="text-sm font-bold">مدیریت کارکنان مجموعه</h4>
<div className="pt-2 px-2 ">
<h4 className="text-sm font-bold">{t("staffsTitle")}</h4>
</div>
</div>
@ -281,7 +283,7 @@ const Employees = (props) => {
<>
{activeSection == 3 ? (
<div
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 ml-3 "
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 mx-3 "
onClick={() => CTX.setBottomSheetCreateEmployeesOpen(true)}
>
<svg
@ -326,8 +328,8 @@ const Employees = (props) => {
<PersianNumber number={5} style="!text-[15px] " />
</p>
</div>
<div className="pt-1 pr-2 ">
<h4 className="text-sm font-bold">مدیریت شیفت های مجموعه</h4>
<div className="pt-2 px-2 ">
<h4 className="text-sm font-bold">{t("shiftsTitle")}</h4>
</div>
</div>
@ -335,7 +337,7 @@ const Employees = (props) => {
<>
{activeSection == 4 ? (
<div
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 ml-3 "
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 mx-3 "
onClick={() => CTX.setBottomSheetCreateShiftsOpen(true)}
>
<svg
@ -380,8 +382,8 @@ const Employees = (props) => {
<PersianNumber number={6} style="!text-[15px] " />
</p>
</div>
<div className="pt-1 pr-2 ">
<h4 className="text-sm font-bold">افزودن تسک مجموعه</h4>
<div className="pt-2 px-2 ">
<h4 className="text-sm font-bold">{t("taskTitle")}</h4>
</div>
</div>
@ -389,7 +391,7 @@ const Employees = (props) => {
<>
{activeSection == 5 ? (
<div
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 ml-3 "
className="w-[30px] h-[30px] bg-secondary-50 shadow-sm rounded-lg mt-2 mx-3 "
onClick={() => {
CTX.setTaskData([]);
CTX.setIdEditTask("");

View File

@ -3,7 +3,6 @@
import AppHeader from "@comp/AppHeader/page";
// import TaskCard from "@comp/TaskCard/page";
import AppContext from "@ctx/AppContext";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { getToken } from "plugins/Chapar";
import ParseJwt from "plugins/ParseJwt/page";
@ -19,6 +18,9 @@ import moment from "jalali-moment";
import CoffeeBrewCard from "@comp/CoffeeBrew/CoffeeBrewCard/page";
import FormatJalaliDate from "plugins/FormatJalaliDate/page";
import { useState } from "react";
import { useLocale, useTranslations } from "next-intl";
import FormatJalaliDateEn from "plugins/FormatJalaliDateEn/page";
import { Link } from "src/i18n/routing";
ChartJS.register(ArcElement, Tooltip, Legend);
@ -29,6 +31,10 @@ const Home = (props) => {
const latesCoffeeBrewData = CTX.state.latesCoffeeBrewData;
const profile = CTX.state.profile;
const t = useTranslations("homePage");
const locale = useLocale();
const isRTL = locale === "fa";
const [activeShiftPlanHome, setActiveShiftPlanHome] = useState(-1);
useEffect(() => {
@ -76,6 +82,7 @@ const Home = (props) => {
const today = new Date();
const formattedDate = FormatJalaliDate(today);
const formattedDateEn = FormatJalaliDateEn(today);
console.log(latesCoffeeBrewData);
@ -95,11 +102,11 @@ const Home = (props) => {
}
/>
<div className="bg-white overflow-hidden p-5 rtl">
<div className={`bg-white overflow-hidden p-5 ${isRTL ? "rtl" : "ltr"} `}>
<div className="px-3 text-right flex">
<div>
<h3 className=" text-[14px] font-medium">
<PersianNumber number={formattedDate} />
<PersianNumber number={isRTL ? formattedDate : formattedDateEn} />
</h3>
<p className="mb-0 text-[12px] text-gray-500">
@ -114,11 +121,20 @@ const Home = (props) => {
<div className=" p-3 rounded-2xl">
<div>
<p className="mb-0 text-[12px] mt-3 font-medium text-center">
<PersianNumber
number={homePageData?.totalActivitiesToday}
style={"!text-[25px] font-bold ml-2 "}
/>
کل فعالیت های امروز{" "}
{isRTL ? (
<PersianNumber
number={homePageData?.totalActivitiesToday}
style={"!text-[25px] font-bold ml-2 "}
/>
) : (
<>
<span className="!text-[18px] font-bold mx-2">
{" "}
{homePageData?.totalActivitiesToday}
</span>
</>
)}
{t("activityText")}{" "}
</p>
</div>
</div>
@ -129,11 +145,20 @@ const Home = (props) => {
<div className=" p-3 rounded-2xl">
<div>
<p className="mb-0 text-black text-[12px] mt-3 font-medium text-center">
<PersianNumber
number={homePageData?.totalShiftToday}
style={"!text-[25px] font-bold ml-2"}
/>
کل شیفت های امروز{" "}
{isRTL ? (
<PersianNumber
number={homePageData?.totalShiftToday}
style={"!text-[25px] font-bold ml-2"}
/>
) : (
<>
<span className="!text-[20px] font-bold mx-2">
{" "}
{homePageData?.totalShiftToday}
</span>
</>
)}
{t("shiftText")}{" "}
</p>
</div>
</div>
@ -150,7 +175,7 @@ const Home = (props) => {
<Link href={"/app/coffee-brew"}>
<div className="bg-gray-50 rounded-lg p-6 mt-3 text-center text-gray-500 ">
<p className="bg-white p-2 w-fit mx-auto rounded-2xl text-sm">
افزودن ادجاست جدید
{t("addAdjust")}
</p>
</div>
</Link>
@ -202,12 +227,18 @@ const Home = (props) => {
<div className="w-full">
<div className=" p-1 rounded-2xl">
<div>
<p className="mb-0 text-black text-[12px] mt-3 font-medium text-center">
<PersianNumber
number={e.totalActivitiesCount}
style={"!text-[22px] font-bold ml-2"}
/>
کل اکتیویتی های{" "}
<p className="mb-0 text-black text-[12px] mt-3 font-medium text-center">
{isRTL ? (
<PersianNumber
number={e.totalActivitiesCount}
style={"!text-[22px] font-bold ml-2"}
/>
) : (
<span className="!text-[18px] font-bold mx-2">
{e.totalActivitiesCount}
</span>
)}
{t("shiftBoxAllactivities")}{" "}
</p>
</div>
</div>
@ -215,11 +246,17 @@ const Home = (props) => {
<div className=" p-1 rounded-2xl">
<div>
<p className="mb-0 text-black text-[12px] mt-3 font-medium text-center">
<PersianNumber
number={e.doneActivitiesCount}
style={"!text-[22px] font-bold ml-2"}
/>
اکتیویتی انجام شده{" "}
{isRTL ? (
<PersianNumber
number={e.doneActivitiesCount}
style={"!text-[22px] font-bold ml-2"}
/>
) : (
<span className="!text-[18px] font-bold mx-2">
{e.doneActivitiesCount}
</span>
)}
{t("shiftBoxActivityDone")}{" "}
</p>
</div>
</div>
@ -227,11 +264,17 @@ const Home = (props) => {
<div className=" p-1 pb-5 rounded-2xl">
<div>
<p className="mb-0 text-black text-[12px] mt-3 font-medium text-center">
<PersianNumber
number={e.undoneActivitiesCount}
style={"!text-[22px] font-bold ml-2"}
/>
اکتیویتی انجام نشده{" "}
{isRTL ? (
<PersianNumber
number={e.undoneActivitiesCount}
style={"!text-[22px] font-bold ml-2"}
/>
) : (
<span className="!text-[18px] font-bold mx-2">
{e.undoneActivitiesCount}
</span>
)}
{t("shiftBoxActivityNotDone")}{" "}
</p>
</div>
</div>
@ -245,14 +288,26 @@ const Home = (props) => {
<div className="flex justify-center ">
<div className="absolute mt-[40px]">
<h2 className="text-lg text-black">
<PersianNumber
number={Math.floor(
percentage(
e.totalActivitiesCount,
e.doneActivitiesCount
)
)}
/>
{isRTL ? (
<PersianNumber
number={Math.floor(
percentage(
e.totalActivitiesCount,
e.doneActivitiesCount
)
)}
/>
) : (
<>
{Math.floor(
percentage(
e.totalActivitiesCount,
e.doneActivitiesCount
)
)}
</>
)}
<small className="text-black text-[11px] ml-1">
%
</small>
@ -272,14 +327,14 @@ const Home = (props) => {
<div className="mt-3">
<p className="mb-0 text-black text-[12px] text-center">
درصد پیشرفت شیفت
{t("shiftBoxShiftPercentage")}{" "}
</p>
</div>
</>
) : (
<div className="mt-20">
<p className="mb-0 text-gray-200 text-[12px] text-center">
شما شیفت بازی ندارید
{t("shiftBoxEmpty")}{" "}
</p>
</div>
)}
@ -312,7 +367,7 @@ const Home = (props) => {
<div className="flex bg-primary-400 p-1 rounded-full m-1 justify-start mb-2 w-fit ">
<div className="px-4 h-[30px] rounded-full bg-primary-200 ">
<p className="mb-0 text-center mt-[2px] text-sm">
سوپروایزر
{t("surpriseText")}
</p>
</div>
@ -328,11 +383,15 @@ const Home = (props) => {
</>
))}
<h3 className="text-right p-3 font-medium mt-4 text-sm">
گزارش های مجموعه
<h3
className={` p-3 font-medium mt-4 text-sm ${
isRTL ? "text-right" : "text-left"
}`}
>
{t("historyReports")}
</h3>
<div className="rtl mt-2">
<div className={` mt-2 ${isRTL ? "rtl" : "ltr"}`}>
<div className="flex ">
<div className="w-[50px] h-[50px] rounded-2xl bg-white shadow">
<svg
@ -359,15 +418,15 @@ const Home = (props) => {
</svg>
</div>
<div className="mx-2 mt-1" onClick={() => handleGoToReport()}>
<h3 className="text-sm font-bold "> فعالیت ها </h3>
<h3 className="text-sm font-bold "> {t("titleReport1")} </h3>
<p className="mb-0 text-right text-sm text-gray-500">
خروجی اکسل
{t("subTitleReport1")}{" "}
</p>
</div>
</div>
</div>
<div className="rtl mt-2">
<div className={` mt-2 ${isRTL ? "rtl" : "ltr"}`}>
<div className="flex ">
<div className="w-[50px] h-[50px] rounded-2xl bg-white shadow">
<svg
@ -397,9 +456,9 @@ const Home = (props) => {
className="mx-2 mt-1"
onClick={() => CTX.setBottomSheetReportManageShiftOpen(true)}
>
<h3 className="text-sm font-bold "> شیفت های هفته</h3>
<h3 className="text-sm font-bold "> {t("titleReport2")}</h3>
<p className="mb-0 text-right text-sm text-gray-500">
خروجی متن
{t("subTitleReport2")}{" "}
</p>
</div>
</div>

View File

@ -8,13 +8,15 @@ import AppContext from "@ctx/AppContext";
import VerifyCodeStep from "@comp/LoginComponents/VerifyCodeStep";
import SignUp from "@comp/LoginComponents/SignUp";
import { useRouter } from "next/navigation";
import { useTranslations } from "next-intl";
import { useLocale, useTranslations } from "next-intl";
const Login = (props) => {
const CTX = useContext(AppContext);
const stepLogin = CTX.state.stepLogin;
const router = useRouter();
const t = useTranslations("login");
const locale = useLocale();
const isRTL = locale === "fa";
const [isLogoCentered, setIsLogoCentered] = useState(true);
@ -22,7 +24,13 @@ const Login = (props) => {
if (typeof window !== "undefined") {
const item = localStorage.token;
if (!!item) {
router.push("/app/home");
router.push(
locale === "zh"
? "/zh/app/home"
: locale === fa
? "/fa/app/home"
: "/app/home"
);
}
}
@ -70,7 +78,7 @@ const Login = (props) => {
} transition-opacity duration-1000`}
>
<h2 className="text-white text-[50px] font-bold">{t("title")}</h2>
<p className="mb-0 text-white">" "</p>
<p className="mb-0 text-white">" {t("desc")} "</p>
</div>
</div>
)}

View File

@ -4,6 +4,7 @@ import ActivityCard from "@comp/TaskPage/ActivityCard/page";
import ActivityCardCloseShift from "@comp/TaskPage/ActivityCardCloseShift/page";
import AppContext from "@ctx/AppContext";
import moment from "jalali-moment";
import { useLocale, useTranslations } from "next-intl";
import { useParams, useSearchParams } from "next/navigation";
import Buttonbriz from "plugins/Buttonbriz/page";
import GoBack from "plugins/GoBack/page";
@ -19,6 +20,10 @@ const CompleteShift = () => {
const searchParams = useSearchParams();
const day = searchParams.get("day");
const t = useTranslations("complete-shift");
const locale = useLocale();
const isRTL = locale === "fa";
const [closeShiftScore, setCloseShiftScore] = useState(50);
const [activeShifPlan, setActiveShifPlan] = useState(-1);
const [dateQueryFilterValue, setDateQueryFilterValue] = useState(1);
@ -64,17 +69,30 @@ const CompleteShift = () => {
const getTodayPersianDate = () => {
return moment().locale("fa").format("D MMMM YYYY");
};
const getTodayDate = () => {
return moment().format(" D MMMM YYYY ");
};
const getYesterdayPersianDate = () => {
const yesterday = moment().locale("fa").subtract(1, "day");
return yesterday.format("D MMMM YYYY");
};
const getYesterdayDate = () => {
const yesterday = moment().subtract(1, "day");
return yesterday.format("D MMMM YYYY");
};
const getTomorrowPersianDate = () => {
const tomorrow = moment().locale("fa").add(1, "day");
return tomorrow.format("D MMMM YYYY");
};
const getTomorrowDate = () => {
const tomorrow = moment().add(1, "day");
return tomorrow.format("D MMMM YYYY");
};
//handleOpenShift
const handleOpenShift = (isCompleted, id, index, hasCurrentShiftPlan) => {
CTX.setStopGetActivities(false);
@ -193,8 +211,8 @@ const CompleteShift = () => {
return (
<div className="pb-20">
<AppHeader
title=" عملیات بستن شیفت"
sub="عملیات بستن شیفت برای بررسی تکمیل وظایف"
title={t("title")}
sub={t("subTitle")}
icon2={true}
iconName2="ARROW"
iconHref2="#"
@ -204,28 +222,42 @@ const CompleteShift = () => {
/>
<div className="bg-white overflow-hidden px-5 rtl">
<div className="flex overflow-auto whitespace-nowrap mb-7 mt-4">
<div
className={`flex overflow-auto whitespace-nowrap mb-7 mt-4 ${
isRTL ? "rtl" : "ltr"
}`}
>
<div
className={` shadow-sm relative block max-w-max ml-2 rounded-full mt-2 px-4 py-1 tr03 border-2 ${
dateQueryFilterValue == 2
? " bg-primary-200 border-secondary-300"
: "opacity-50 border-secondary-400"
}`}
} ${isRTL ? "rtl" : "ltr"}`}
onClick={() => handleDayCloseShift(2)}
>
<PersianNumber number={getYesterdayPersianDate()} />
{isRTL ? (
<PersianNumber number={getYesterdayPersianDate()} />
) : (
<>{getYesterdayDate()}</>
)}
</div>
<div
className={` shadow-sm relative block max-w-max ml-2 rounded-full mt-2 px-4 py-1 tr03 border-2 ${
dateQueryFilterValue == 1
? " bg-primary-200 border-secondary-300"
: "opacity-50 border-secondary-400"
}`}
} ${isRTL ? "rtl" : "ltr"}`}
onClick={() => handleDayCloseShift(1)}
>
<p className="mb-0">
<PersianNumber number={getTodayPersianDate()} />
<small className="text-sm mx-2"> ( امروز )</small>
{isRTL ? (
<PersianNumber number={getTodayPersianDate()} />
) : (
<>{getTodayDate()}</>
)}
<small className="text-sm mx-2"> ( {t("todayText")} )</small>
</p>
</div>
@ -234,10 +266,14 @@ const CompleteShift = () => {
dateQueryFilterValue == 3
? " bg-primary-200 border-secondary-300"
: "opacity-50 border-secondary-400"
}`}
} ${isRTL ? "rtl" : "ltr"}`}
onClick={() => handleDayCloseShift(3)}
>
<PersianNumber number={getTomorrowPersianDate()} />
{isRTL ? (
<PersianNumber number={getTomorrowPersianDate()} />
) : (
<>{getTomorrowDate()}</>
)}
</div>
</div>
@ -246,7 +282,7 @@ const CompleteShift = () => {
<div
className={`bg-gray-50 p-2 rounded-xl flex justify-between ${
activeShifPlan == index ? "bg-gray-300 " : "bg-gray-200 "
} `}
} ${isRTL ? "rtl" : "ltr"} `}
>
<div
className="flex w-full justify-between"
@ -306,7 +342,7 @@ const CompleteShift = () => {
>
<p className="mb-0 text-[12px] p-1 text-white text-center mt-[2px]">
{" "}
گزارش{" "}
{t("reportText")}
</p>
</div>
)}
@ -332,7 +368,7 @@ const CompleteShift = () => {
activeStaff == indexStaff
? " rounded-b-0 rounded-t-xl"
: "rounded-xl"
}`}
} ${isRTL ? "rtl" : "ltr"}`}
// onClick={() => handleListTaskActive(e?.id, index)}
>
<p className="mb-0 text-[13px] mt-1">
@ -365,7 +401,7 @@ const CompleteShift = () => {
<>
{activeStaff == indexStaff && (
<div className=" mt-3">
<div className=" mt-3 ltr">
{activities.length != 0 ? (
<InfiniteScroll
dataLength={activities.length}
@ -399,7 +435,7 @@ const CompleteShift = () => {
</div>
<Buttonbriz
title={` بستن شیفت با امتیاز ${closeShiftScore}`}
title={` ${t("completeShiftButton")} ${closeShiftScore}`}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCloseShift()}

View File

@ -16,6 +16,7 @@ import BottomSheetAddUserToPositionShiftPlan from "plugins/BottomSheet/BottomShe
import Buttonbriz from "plugins/Buttonbriz/page";
import GoBack from "plugins/GoBack/page";
import Chapar from "plugins/Chapar";
import { useLocale, useTranslations } from "next-intl";
const Calendar = () => {
const CTX = useContext(AppContext);
@ -26,6 +27,10 @@ const Calendar = () => {
const shiftPlanData = CTX.state.shiftPlanData;
const shiftplansData = CTX.state.shiftPlansData;
const t = useTranslations("manage-shift");
const locale = useLocale();
const isRTL = locale === "fa";
const [daysUntilWeek, setDaysUntilWeek] = useState([]);
const [selectDay, setSelectDay] = useState(null);
const [selectShift, setselectShift] = useState(-1);
@ -52,11 +57,15 @@ const Calendar = () => {
const daysArray = [];
return responseArray.map((item) => {
const date = moment(item.dateTime).locale("fa");
const dateEn = moment(item.dateTime);
const isToday = date.isSame(moment(), "day");
daysArray.push({
checkDay: date.format("jYYYY/jM/jD"),
date: date.format("jD / jM"),
checkDayEn: dateEn.format("YYYY/M/D"),
dateEn: dateEn.format("D / M"),
dayOfWeekEn: dateEn.format("dddd"),
dayOfWeek: date.format("dddd"),
isToday: isToday,
totalShiftPercent: (item.totalShiftPlans / item.totalShifts) * 100,
@ -308,15 +317,12 @@ const Calendar = () => {
);
}, [usersData]);
// console.log(
// "hiftsCurrentDaysData[selectShift]",
// shiftsCurrentDaysData[selectShift]
// );
console.log("hiftsCurrentDaysData[selectShift]", daysUntilWeek);
return (
<div className="pb-20">
<AppHeader
title=" شیفت بندی های هفتگی"
sub={`شیفت بندی`}
title={t("title")}
sub={t("subTitle")}
icon2={true}
iconName2="ARROW"
iconHref2="#"
@ -326,20 +332,24 @@ const Calendar = () => {
/>
<div className="bg-white overflow-hidden px-5 rtl">
<div className="font-medium text-right mt-5">
<p className="mb-0 text-sm">روتین را انتخاب کنید:</p>
<div
className={`font-medium mt-5 ${isRTL ? "text-right" : "text-left"}`}
>
<p className="mb-0 text-sm">: {t("routineTitle")}</p>
</div>
<div
className="flex overflow-auto whitespace-nowrap "
className={`flex overflow-auto whitespace-nowrap ${
isRTL ? "rtl" : "ltr"
}`}
id="swich-shifts"
>
{routinesData?.map((e, index) => (
<div
className={` shadow-sm relative block max-w-max ml-2 rounded-full mt-2 px-4 py-1 tr03 border-2 ${
className={` shadow-sm relative block max-w-max rounded-full mt-2 px-4 py-1 tr03 border-2 ${
selectRoutine == index
? " bg-primary-200 border-secondary-300"
: "opacity-50 border-secondary-400"
}`}
} ${isRTL ? "ml-2" : "mr-2"}`}
onClick={() => {
if (shiftPlanSteps >= 1) {
toast.error("برای تغییر روتین باید رفرش کنید", {
@ -365,14 +375,19 @@ const Calendar = () => {
{shiftPlanSteps >= 1 && (
<div className=" overflow-hidden px-5 rtl mt-5 ">
<>
<div className="font-medium text-right ">
<p className="mb-0 text-sm">تاریخ را انتخاب کنید:</p>
<div
className={`font-medium mt-5 ${
isRTL ? "text-right" : "text-left"
}`}
>
<p className="mb-0 text-sm">: {t("dateTitle")}</p>
</div>
<Swiper
spaceBetween={10}
slidesPerView={4.3}
// onSlideChange={() => }
// onSwiper={(swiper) => }
className={` ${isRTL ? "rtl" : "ltr"}`}
>
{daysUntilWeek?.map((e, index) => (
<SwiperSlide>
@ -396,18 +411,22 @@ const Calendar = () => {
>
<div className="pt-3">
<p className="mb-0 text-center ">
<PersianNumber
number={e.date}
style={`text-[20px] ${
selectDay == index
? "font-bold"
: !!holidays.y1402?.find(
(b) => b.date == e.checkDay
)
? "text-red-500"
: ""
} `}
/>
{isRTL ? (
<PersianNumber
number={e.date}
style={`text-[20px] ${
selectDay == index
? "font-bold"
: !!holidays.y1402?.find(
(b) => b.date == e.checkDay
)
? "text-red-500"
: ""
} `}
/>
) : (
<>{e.dateEn}</>
)}
</p>
</div>
@ -418,9 +437,14 @@ const Calendar = () => {
: " text-gray-600"
}`}
>
<p className="mb-0 text-center text-sm ">
<p
className={`mb-0 text-center ${
isRTL ? "" : "text-[10px]"
}`}
>
{/* {PersianD.find((i) => i == e.dayOfWeek)} */}
{e.dayOfWeek}
{isRTL ? e.dayOfWeek : e.dayOfWeekEn}
</p>
</div>
@ -465,17 +489,23 @@ const Calendar = () => {
<>
<div className=" overflow-hidden px-5 mt-5 rtl">
<>
<div className="font-medium text-right ">
<p className="mb-0 text-sm">شیفت را انتخاب کنید:</p>
<div
className={`font-medium mt-5 ${
isRTL ? "text-right" : "text-left"
}`}
>
<p className="mb-0 text-sm">: {t("shiftTitle")}</p>
</div>
{shiftsCurrentDaysData.length > 0 ? (
<div
className="flex overflow-auto whitespace-nowrap"
className={`flex overflow-auto whitespace-nowrap ${
isRTL ? "rtl" : "ltr"
}`}
id="swich-shifts"
>
{shiftsCurrentDaysData?.map((e, index) => (
<div
className={` shadow-sm relative block max-w-max ml-2 rounded-full mt-2 px-4 py-1 tr03 border-2 ${
className={` shadow-sm relative block max-w-max rounded-full mt-2 px-4 py-1 tr03 border-2 ${
selectShift == index
? " bg-primary-200 border-secondary-300"
: " border-secondary-400"
@ -483,7 +513,7 @@ const Calendar = () => {
e.hasCurrentShiftPlan
? "!bg-primary-600 text-white !border-secondary-50"
: ""
}`}
} ${isRTL ? "ml-2" : "mr-2"}`}
onClick={() => {
handleSelectShift(index);
}}
@ -496,7 +526,7 @@ const Calendar = () => {
<div className="flex justify-center ">
<div className="bg-gray-300 mt-5 w-fit rounded-full p-2 !px-4">
<p className="mb-0 text-gray-600 text-sm">
شما شیفتی دراین روز ندارید
{t("404Shift")}
</p>
</div>
</div>
@ -509,30 +539,57 @@ const Calendar = () => {
{shiftPlanSteps >= 3 && (
<div className=" p-4 rtl sm:h-auto pb-20">
<div className=" flex justify-start mb-5">
<div className=" rounded-xl w-fit mr-0 px-3">
<p className="mb-0 text-right text-sm rtl opacity-80">
ویرایش برای{" "}
<small className=" text-sm font-bold">
{shiftsCurrentDaysData[selectShift]?.title}
</small>{" "}
تاریخ{" "}
<small className=" text-sm font-bold text-primary-500 bg-white px-2 rounded-full">
<PersianNumber
number={daysUntilWeek && daysUntilWeek[selectDay]?.checkDay}
/>
</small>{" "}
میباشد
</p>
<div className=" rounded-xl w-fit mr-0 px-3 w-full">
{isRTL ? (
<p className="mb-0 text-right text-sm rtl opacity-80">
ویرایش برای{" "}
<small className=" text-sm font-bold">
{shiftsCurrentDaysData[selectShift]?.title}
</small>{" "}
تاریخ{" "}
<small className=" text-sm font-bold text-primary-500 bg-white px-2 rounded-full">
<PersianNumber
number={
daysUntilWeek && daysUntilWeek[selectDay]?.checkDay
}
/>
</small>{" "}
میباشد
</p>
) : (
<p className="mb-0 text-left text-sm rtl opacity-60 ltr">
{t("editText")} |
<small className=" text-sm ">
{shiftsCurrentDaysData[selectShift]?.title}
</small>{" "}
|
<small className=" text-sm text-primary-500 bg-white px-2 rounded-full">
<PersianNumber
number={
daysUntilWeek && daysUntilWeek[selectDay]?.checkDay
}
/>
</small>{" "}
</p>
)}
</div>
</div>
<div className="font-medium text-right pb-4">
<p className="mb-0 text-sm">پرسنل را انتخاب کنید:</p>
<div
className={`font-medium mt-5 ${
isRTL ? "text-right" : "text-left"
}`}
>
<p className="mb-0 text-sm">: {t("personnelTitle")}</p>
</div>
{positionsData.map((e) => (
<div className="">
<div className="flex justify-between border-b border-gray-200 p-2 ">
<div
className={`flex justify-between border-b border-gray-200 p-2 ${
isRTL ? "rtl" : "ltr"
} `}
>
<div className="flex p-2">
<div className="">
<h4 className="text-sm font-bold mt-[2px]">{e.name} </h4>
@ -612,18 +669,24 @@ const Calendar = () => {
</div>
))}
<div className="mt-8">
<div className=" text-right mt-3">
<p className="mb-0 font-medium font-sm">
سوپروایزر را انتخاب کنید
</p>
<p className="mb-0 text-right text-[11px] text-secondary-700">
شیفت توسط سوپروایزر بسته میشود لطفا برای هر شیفت آن را مشخص کنید
<div
className={`font-medium mt-3 ${
isRTL ? "text-right" : "text-left"
}`}
>
<p className="mb-0 text-sm">: {t("surpriseTitle")}</p>
<p
className={`mb-0 text-[11px] text-secondary-700 ${
isRTL ? "text-right" : "text-left"
}`}
>
{t("surpriseSubTitle")}{" "}
</p>
</div>
<div className="">
<Input
lable="سوپروایزر"
lable={t("surpriseInput")}
id="superId-id"
name="superId"
type={"text"}
@ -634,7 +697,7 @@ const Calendar = () => {
style="text-right"
select={true}
selectData={superData}
defaultValue={"انتخاب کنید"}
defaultValue={t("surpriseInputDef")}
theme={1}
mt={5}
/>
@ -644,14 +707,14 @@ const Calendar = () => {
<div className="mt-5">
{editManageShift ? (
<Buttonbriz
title="ویرایش فعالیت"
title={t("manageShiftEditButton")}
color="INFO"
icon="CHECK"
buttonEvent={() => handleCreateShiftPlan("UPDATE")}
/>
) : (
<Buttonbriz
title="ثبت فعالیت"
title={t("manageShiftRegButton")}
color="PRIMARY"
icon="CHECK"
buttonEvent={() => handleCreateShiftPlan()}

View File

@ -4,20 +4,25 @@ import AppHeader from "@comp/AppHeader/page";
import AppContext from "@ctx/AppContext";
import Avatar from "boring-avatars";
import moment from "jalali-moment";
import { useLocale, useTranslations } from "next-intl";
import Image from "next/image";
import Link from "next/link";
import { useRouter } from "next/navigation";
import FormatJalaliDate from "plugins/FormatJalaliDate/page";
import FormatJalaliDateEn from "plugins/FormatJalaliDateEn/page";
import HasPermission from "plugins/HasPermission/page";
import NothingFound from "plugins/NothingFound/page";
import PersianNumber from "plugins/PersianNumber";
import React, { useContext, useEffect, useState } from "react";
import { Link } from "src/i18n/routing";
const Shifts = (props) => {
const CTX = useContext(AppContext);
const router = useRouter();
const permissions = CTX.state.profile?.permissions;
const t = useTranslations("shifts");
const locale = useLocale();
const isRTL = locale === "fa";
const [shiftplans, setShiftplans] = useState([]);
const [shiftPlansSelect, setShiftPlansSelect] = useState(0);
@ -116,8 +121,8 @@ const Shifts = (props) => {
<>
<div className="pb-20">
<AppHeader
title="شیفتــــ های مجموعه"
sub="شما 12 نفر شیفت متفاوت دارید"
title={t("title")}
sub={t("subTitle")}
// icon1={true}
// iconName1="PLUS"
// iconHref1="#"
@ -132,14 +137,16 @@ const Shifts = (props) => {
<Link href={"/app/shifts/manage-shift"}>
<div className="bg-secondary-950 p-4 rounded-2xl ">
<p className="mb-0 text-center text-white text-sm font-medium">
شیفت بندی هفته{" "}
{t("ManageShiftButton")}
</p>
</div>
</Link>
</>
)}
<div
className="flex justify-start whitespace-nowrap overflow-auto pb-4 mt-1"
className={`flex justify-start whitespace-nowrap overflow-auto pb-4 mt-1 ${
isRTL ? "rtl" : "ltr"
}`}
id="swich-shifts"
>
<div
@ -152,7 +159,7 @@ const Shifts = (props) => {
>
<div className="mr-1">
<p className="mb-0 text-[12px] text-secondary-900 font-medium">
شیفت های هفته{" "}
{t("weekFilter")}
</p>
</div>
</div>
@ -167,7 +174,7 @@ const Shifts = (props) => {
>
<div className="mr-1">
<p className="mb-0 text-[12px] text-secondary-900 font-medium">
شیفت های ماه{" "}
{t("monthFilter")}
</p>
</div>
</div>
@ -182,7 +189,7 @@ const Shifts = (props) => {
>
<div className="mr-1">
<p className="mb-0 text-[12px] text-secondary-900 font-medium">
شیفت های هفته بعد{" "}
{t("nextWeekFilter")}
</p>
</div>
</div>
@ -197,7 +204,7 @@ const Shifts = (props) => {
>
<div className="mr-1">
<p className="mb-0 text-[12px] text-secondary-900 font-medium">
شیفت های هفته قبل{" "}
{t("lastWeekFilter")}
</p>
</div>
</div>
@ -212,7 +219,7 @@ const Shifts = (props) => {
>
<div className="mr-1">
<p className="mb-0 text-[12px] text-secondary-900 font-medium">
شیفت های ماه قبل{" "}
{t("lastMonthkFilter")}
</p>
</div>
</div>
@ -227,7 +234,7 @@ const Shifts = (props) => {
>
<div className="mr-1">
<p className="mb-0 text-[12px] text-secondary-900 font-medium">
شیفت های ماه بعد{" "}
{t("nextMonthFilter")}{" "}
</p>
</div>
</div>
@ -246,14 +253,18 @@ const Shifts = (props) => {
}`}
>
<div
className={`flex justify-between ${
className={`flex justify-between ${
shiftPlansSelect == index ? "" : ""
}`}
} ${isRTL ? "rtl" : "ltr"}`}
onClick={() => setShiftPlansSelect(index)}
>
<div className="flex">
<PersianNumber
number={FormatJalaliDate(e.planFor, true)}
number={
isRTL
? FormatJalaliDate(e.planFor, true)
: FormatJalaliDateEn(e.planFor, true)
}
/>
<div className="w-[2px] h-5 mx-2 bg-primary-200 opacity-75 "></div>
@ -263,14 +274,14 @@ const Shifts = (props) => {
number={e.data.length}
style={"ml-1"}
/>
شیفت
{t("shiftText")}
</p>
</div>
<p className="mb-0 mt-[-3px] mx-1">
{checkDateStatus(e.planFor).today ? (
<small className="!text-primary-300 ">
(امروز)
( {t("todayText")} )
</small>
) : (
""
@ -305,7 +316,11 @@ const Shifts = (props) => {
<>
{e.data.map((e) => (
<div>
<div className="flex justify-between">
<div
className={`flex justify-between ${
isRTL ? "rtl" : "ltr"
}`}
>
<div className="ml-2 rounded-xl mt-3 p-2">
<p className="text-sm mb-0 text-gray-700 font-medium">
{" "}
@ -314,9 +329,15 @@ const Shifts = (props) => {
</div>
</div>
<div className="flex flex-wrap">
<div
className={`flex flex-wrap ${
isRTL ? "rtl" : "ltr"
}`}
>
{e.users.map((i) => (
<div className="flex bg-gray-50 p-1 rounded-full m-1 justify-start mb-2 w-fit ">
<div
className={`flex bg-gray-50 p-1 rounded-full m-1 justify-start mb-2 w-fit `}
>
<div className="w-[25px] h-[25px] rounded-full bg-gray-400 ">
<Avatar
size={25}
@ -337,7 +358,7 @@ const Shifts = (props) => {
<div className="flex bg-primary-400 p-1 rounded-full m-1 justify-start mb-2 w-fit ">
<div className="px-4 h-[30px] rounded-full bg-primary-200 ">
<p className="mb-0 text-center mt-[2px] text-sm">
سوپروایزر
{t("surpriseText")}{" "}
</p>
</div>
@ -357,7 +378,7 @@ const Shifts = (props) => {
>
<div className="mt-6">
<button className="btn bg-secondary-950 text-primary-300 w-full font-bold rounded-2xl text-sm p-3">
بستن و تایید شیفت
{t("closeShiftButton")}
</button>
</div>
</Link>
@ -367,7 +388,7 @@ const Shifts = (props) => {
<Link href={"/app/shifts/complete-shift"}>
<div className="mt-6">
<button className="btn bg-secondary-950 text-primary-300 w-full font-bold rounded-2xl text-sm p-3">
بستن و تایید شیفت
{t("closeShiftButton")}{" "}
</button>
</div>
</Link>
@ -379,7 +400,7 @@ const Shifts = (props) => {
>
<div className="mt-6">
<button className="btn bg-secondary-950 text-primary-300 w-full font-bold rounded-2xl text-sm p-3">
بستن و تایید شیفت
{t("closeShiftButton")}{" "}
</button>
</div>
</Link>

View File

@ -13,11 +13,13 @@ import moment from "jalali-moment";
import { useRouter, useSearchParams } from "next/navigation";
import GoBack from "plugins/GoBack/page";
import Chapar from "plugins/Chapar";
import { useLocale } from "next-intl";
const AddTask = () => {
const CTX = useContext(AppContext);
const query = useSearchParams();
const router = useRouter();
const locale = useLocale();
const [routinesSelectData, setRoutinesSelectData] = useState([]);
const [routineForTaskCurrent, setRoutineForTaskCurrent] = useState([]);
@ -198,7 +200,13 @@ const AddTask = () => {
window.scrollTo(0, 0);
CTX.setStopGetTasks(false);
CTX.setPageGetTasks(0);
router.push("/app/tasks");
router.push(
locale === "zh"
? "/zh/app/tasks"
: locale === "fa"
? "/fa/app/tasks"
: "/app/tasks"
);
} catch ({ error, status }) {
toast.error(`${error?.response?.data?.message}`, {
position: "bottom-right",