Compare commits

..

No commits in common. "f5e0bebeb026bb43ae9639b74927f9a2664af2a8" and "9530ea30e7b72b1a31654ad39770bc16cc34cc5c" have entirely different histories.

87 changed files with 1067 additions and 839 deletions

View File

@ -18,7 +18,6 @@
"tagcontainer",
"toastify",
"Viewelement",
"webp",
"zustand",
"مطلوب"
],

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

BIN
public/ArrowType/20.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
public/ArrowType/40.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/ArrowType/60.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 B

BIN
public/ArrowType/80.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/ArrowType/90.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/Cards/Graph.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
public/Home/HomeCounter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

187
public/Home/welcome.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 37 KiB

BIN
public/Icon/Animation.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 KiB

5
public/Icon/cercile.svg Normal file
View File

@ -0,0 +1,5 @@
<svg viewBox="0 0 377 446" fill="none" xmlns="http://www.w3.org/2000/svg">
<ellipse opacity="0.1" cx="293" cy="326.206" rx="293" ry="326.206" fill="white" fill-opacity="0.66"/>
<ellipse opacity="0.1" cx="293" cy="326.207" rx="181.81" ry="202.415" fill="white" fill-opacity="0.66"/>
<ellipse opacity="0.1" cx="292.999" cy="326.206" rx="94.6615" ry="105.39" fill="white" fill-opacity="0.66"/>
</svg>

After

Width:  |  Height:  |  Size: 399 B

BIN
public/Image/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 307 KiB

BIN
public/Layout/Logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
public/Layout/OLogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

BIN
public/Layout/auth_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 KiB

BIN
public/Subject/algebra.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
public/Subject/flask.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
public/Subject/koran.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1082" height="138" viewBox="0 0 1082 138">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_1" data-name="Rectangle 1" width="1082" height="138" transform="translate(419 362)" fill="#fff"/>
</clipPath>
</defs>
<g id="Mask_Group_1" data-name="Mask Group 1" transform="translate(-419 -362)" clip-path="url(#clip-path)">
<g id="cover" transform="translate(369 332)">
<g id="Group_1" data-name="Group 1">
<path id="Path_1" data-name="Path 1" d="M50,50A20,20,0,0,1,70,30H1112a20,20,0,0,1,20,20V170H50Z" fill="#3182ce"/>
</g>
<g id="Group_2" data-name="Group 2">
<rect id="Rectangle_1-2" data-name="Rectangle 1" width="280.439" height="275.13" rx="20" transform="translate(230.408 111.564)" fill="#fb7d5b"/>
<rect id="Rectangle_2" data-name="Rectangle 2" width="280.439" height="275.13" rx="20" transform="translate(92 61)" fill="#fcc43e"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -8,6 +8,7 @@ import { useChangeLanguage } from "./Hooks/useChangeLanguage";
import useAuthState from "./zustand/AuthState";
import { TMenuItem } from "./types/App";
import { useTranslation } from "react-i18next";
import useSetPage_title from "./Hooks/useSetPageTitle";
import SpinContainer from "./Components/Layout/SpinContainer";
const Page404 = lazy(() => import("./Layout/Ui/NotFoundPage"));

View File

@ -50,14 +50,14 @@ const HeaderSection = () => {
);
const [, setActiveButton] = useState(0);
const { setActiveTab, ActiveTab } = useButtonState((state) => state);
const { setParamToSend } = useObjectToEdit();
const { set_param_to_send } = useObjectToEdit();
const location = useLocation();
const navigate = useNavigate();
const handleButtonClick = (index: number) => {
setActiveButton(index);
setActiveTab(index);
setParamToSend({});
set_param_to_send({});
navigate(`${location.pathname}`);
};
return (

View File

@ -9,17 +9,17 @@ import { DateEnum } from '../../../enums/Date';
const CustomDatePicker = () => {
const [t] = useTranslation();
const { setParamToSend, paramToSend } = useObjectToEdit();
const { set_param_to_send, param_to_send } = useObjectToEdit();
const navigate = useNavigate();
const location = useLocation();
const onChange: DatePickerProps["onChange"] = (date, dateString) => {
// console.log(date, dateString);
const newObj = { ...paramToSend };
const newObj = { ...param_to_send };
newObj.date = dateString;
setParamToSend(newObj);
set_param_to_send(newObj);
navigate(
`${location.pathname}?${paramToSend?.state ?? "all"}=${dateString}`,
`${location.pathname}?${param_to_send?.state ?? "all"}=${dateString}`,
);
};
const Today = new Date() as any;

View File

@ -8,19 +8,19 @@ import { QUESTION_OBJECT_KEY } from '../../config/AppKey';
const Header = () => {
const [t] = useTranslation();
const { values, setFieldValue,setValues } = useFormikContext<any>();
const {isBseQuestion,setIsBseQuestion} = useObjectToEdit()
const {setSavedQuestionData} = useObjectToEdit()
const {isBseQuestion,set_isBseQuestion} = useObjectToEdit()
const {set_SavedQuestionData} = useObjectToEdit()
const handleChange = () => {
setSavedQuestionData(null)
set_SavedQuestionData(null)
localStorage.removeItem(QUESTION_OBJECT_KEY)
if (isBseQuestion) {
setIsBseQuestion(false)
set_isBseQuestion(false)
setValues(null)
setFieldValue("isBase",0)
} else {
setIsBseQuestion(true)
set_isBseQuestion(true)
setValues(null)
setFieldValue("isBase",1)
}

View File

@ -22,7 +22,7 @@ const DeleteModels: React.FC<ModalFormProps> = ({
const [inputValue, setInputValue] = useState("");
const { mutate, isLoading, isSuccess } = deleteMutation;
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
@ -33,14 +33,14 @@ const DeleteModels: React.FC<ModalFormProps> = ({
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
id: Number(object_to_edit?.id),
});
};
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -48,7 +48,7 @@ const DeleteModels: React.FC<ModalFormProps> = ({
};
const handleKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === "Enter" && objectToEdit?.[objectValue] === inputValue) {
if (e.key === "Enter" && object_to_edit?.[objectValue] === inputValue) {
handleSubmit();
}
};
@ -71,7 +71,7 @@ const DeleteModels: React.FC<ModalFormProps> = ({
<div className="ValidationField w-100 mb-5">
<label className="text ">
{t("practical.to_confirm_deletion_please_re_enter")}{" "}
{t(`input.${objectValue}`)} ({objectToEdit?.[objectValue]})
{t(`input.${objectValue}`)} ({object_to_edit?.[objectValue]})
</label>
<Input
@ -88,11 +88,11 @@ const DeleteModels: React.FC<ModalFormProps> = ({
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.[objectValue] !== inputValue
object_to_edit?.[objectValue] !== inputValue
? "disabled_button"
: ""
}
disabled={objectToEdit?.[objectValue] !== inputValue || isLoading}
disabled={object_to_edit?.[objectValue] !== inputValue || isLoading}
onClick={handleSubmit}
type="button"
>

View File

@ -13,12 +13,12 @@ import { useUpdateAdmin } from "../../../api/users";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useUpdateAdmin();
const { setObjectToEdit } = useObjectToEdit();
const { set_object_to_edit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
}
}, [setIsOpen, isSuccess]);
@ -32,7 +32,7 @@ const ModalForm: React.FC = () => {
const handleCancel = () => {
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const [t] = useTranslation();
return (

View File

@ -24,7 +24,7 @@ const FormField = ({ isLoading }: FormFieldType) => {
const [t] = useTranslation();
return (
<Form className="AuthForm">
<Image src="../App/Logo.png" />
<Image src="../Layout/Logo.png" />
<div className="AuthInput">

View File

@ -10,7 +10,7 @@ const Dummy = () => {
return (
<div className="DammyHomePage">
<Image src="/App/SyriaLogo.webp" />
<Image src="/Layout/OLogo.png" />
</div>
);
};

View File

@ -14,11 +14,11 @@ import ModelButtons from "../../../Components/models/ModelButtons";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useAddTag();
const { setObjectToEdit } = useObjectToEdit();
const { set_object_to_edit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("isSuccess");
setObjectToEdit({});
set_object_to_edit({});
}
}, [setIsOpen, isSuccess]);
@ -31,7 +31,7 @@ const ModalForm: React.FC = () => {
const handleCancel = () => {
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const [t] = useTranslation();

View File

@ -11,7 +11,7 @@ const ModalForm: React.FC = () => {
const [inputValue, setInputValue] = useState("");
const { mutate, isLoading, isSuccess } = useDeleteTag();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
@ -22,14 +22,14 @@ const ModalForm: React.FC = () => {
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
id: Number(object_to_edit?.id),
});
};
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -49,7 +49,7 @@ const ModalForm: React.FC = () => {
onCancel={handleCancel}
>
<header>
{t("practical.delete")} ({objectToEdit?.name}){" "}
{t("practical.delete")} ({object_to_edit?.name}){" "}
</header>
<main className="main_modal">
<div className="ValidationField w-100 mb-5">
@ -71,9 +71,9 @@ const ModalForm: React.FC = () => {
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.name !== inputValue ? "disabled_button" : ""
object_to_edit?.name !== inputValue ? "disabled_button" : ""
}
disabled={objectToEdit?.name !== inputValue || isLoading}
disabled={object_to_edit?.name !== inputValue || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}

View File

@ -12,11 +12,11 @@ import ModelButtons from "../../../Components/models/ModelButtons";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { objectToEdit, setObjectToEdit } = useObjectToEdit(
const { object_to_edit, set_object_to_edit } = useObjectToEdit(
(state) => state,
);
const { mutate, isSuccess, isLoading } = useUpdateTag();
// console.log(objectToEdit,"objectToEdit");
// console.log(object_to_edit,"object_to_edit");
const handleSubmit = (values: any) => {
// const contactInformationJson = JSON.stringify({
// phone_number: values?.number
@ -27,7 +27,7 @@ const ModalForm: React.FC = () => {
};
const handleCancel = () => {
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
useEffect(() => {
@ -45,10 +45,10 @@ const ModalForm: React.FC = () => {
open={isOpen === ModalEnum?.TAGS_EDIT}
onCancel={handleCancel}
>
{objectToEdit && (
{object_to_edit && (
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues(objectToEdit)}
initialValues={getInitialValues(object_to_edit)}
validationSchema={getValidationSchema}
>
<header>

View File

@ -5,10 +5,11 @@ import { ModalEnum } from "../../enums/Model";
// import useSetPage_title from "../../Hooks/useSetPageTitle";
import { useTranslation } from "react-i18next";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../../enums/abilities";
import { hasAbility } from "../../utils/hasAbility";
import { lazy, Suspense } from 'react';
import { Spin } from "antd";
import { canAddTags } from "../../utils/hasAbilityFn";
import useSetPage_title from "../../Hooks/useSetPageTitle";
const Table = lazy(() => import('./Table'));
const AddModalForm = lazy(() => import('./Model/AddModel'));
const EditModalForm = lazy(() => import('./Model/EditModel'));
@ -19,9 +20,8 @@ const SearchField = lazy(() => import('../../Components/DataTable/SearchField'))
const TableHeader = () => {
const { handel_open_model } = useModalHandler();
const [t] = useTranslation();
useSetPage_title(
t(`page_header.tags`),
);
// useSetPage_title(`${t(ABILITIES_ENUM?.MAIN_PAGE)} / ${t(`models.${ABILITIES_ENUM.tags}`)}`);
const can_add_tags = hasAbility(ABILITIES_ENUM.TAG, ABILITIES_VALUES_ENUM.STORE);
return (
<div className="TableWithHeader">
@ -30,7 +30,7 @@ const TableHeader = () => {
<header className="d-flex justify-content-between">
<SearchField searchBy="name" placeholder={t("practical.search_here")} />
{canAddTags && (
{can_add_tags && (
<div className="Selects">
<button
onClick={() => handel_open_model(ModalEnum?.TAGS_ADD)}

View File

@ -6,7 +6,7 @@ import { FaTrash } from 'react-icons/fa';
const Tag = ({ data, index }: { data: any, index: number }) => {
const inputRef = useRef<HTMLInputElement>(null);
const formik = useFormikContext<any>();
const { setTagsSearch ,setCurrentTag} = useObjectToEdit();
const { set_Tags_search ,set_currentTag} = useObjectToEdit();
useEffect(() => {
if (inputRef.current) {
@ -20,13 +20,13 @@ const Tag = ({ data, index }: { data: any, index: number }) => {
const handleEditInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
// console.log(e.target.value);
formik.setFieldValue(`synonyms[${index}]`, e.target.value);
setTagsSearch(e.target.value)
setCurrentTag(index)
set_Tags_search(e.target.value)
set_currentTag(index)
};
const handleInputBlur = () => {
// setTagsSearch(null)
// set_Tags_search(null)
};
const handleDeleteChoice = () => {
@ -41,7 +41,7 @@ const Tag = ({ data, index }: { data: any, index: number }) => {
formik.setFieldValue('synonyms', currentTags);
// Reset search state if needed
setTagsSearch(null);
set_Tags_search(null);
};
return (

View File

@ -7,19 +7,27 @@ import { RiDeleteBin6Fill } from "react-icons/ri";
import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { useModalState } from "../../zustand/Modal";
import { useTranslation } from "react-i18next";
import { canDeleteTags, canEditTags } from "../../utils/hasAbilityFn";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../../enums/abilities";
import { hasAbility } from "../../utils/hasAbility";
export const useColumns = () => {
const { setIsOpen } = useModalState((state) => state);
const { setObjectToEdit } = useObjectToEdit((state) => state);
const { set_object_to_edit } = useObjectToEdit((state) => state);
const handelDelete = (record: any) => {
setObjectToEdit(record);
set_object_to_edit(record);
setIsOpen(ModalEnum?.TAGS_DELETE);
};
const [t] = useTranslation();
const can_edit_tags = hasAbility(
ABILITIES_ENUM.TAG,
ABILITIES_VALUES_ENUM.UPDATE,
);
const can_delete_tags = hasAbility(
ABILITIES_ENUM.TAG,
ABILITIES_VALUES_ENUM.DELETE,
);
const columns: TableColumnsType<tags> = [
{
@ -43,7 +51,7 @@ export const useColumns = () => {
render: (text, record, index) => {
const handleEdit = (record: any) => {
// console.log(record,"record");
setObjectToEdit(record);
set_object_to_edit(record);
setIsOpen(ModalEnum?.TAGS_EDIT);
};
@ -52,7 +60,7 @@ export const useColumns = () => {
return (
<Space size="middle" className={className}>
{canEditTags && (
{can_edit_tags && (
<Tooltip
placement="top"
title={t("practical.edit")}
@ -70,7 +78,7 @@ export const useColumns = () => {
</Tooltip>
)}
{canDeleteTags && (
{can_delete_tags && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}

View File

@ -0,0 +1,35 @@
import { Col, Row } from "reactstrap";
import ValidationField from "../../../Components/ValidationField/ValidationField";
import { useFormikContext } from "formik";
import { useModalState } from "../../../zustand/Modal";
import { useEffect } from "react";
const Form = () => {
const formik = useFormikContext();
const { isOpen } = useModalState((state) => state);
useEffect(() => {
if (isOpen === "") {
formik.setErrors({});
}
if (isOpen === "isSuccess") {
formik.setErrors({});
formik.resetForm();
}
}, [isOpen]);
return (
<Row className="w-100">
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="address" label="address" name="address" />
</Col>
<Col>
<ValidationField placeholder="number" label="number" name="number" />
</Col>
</Row>
);
};
export default Form;

View File

@ -0,0 +1,67 @@
import React, { useEffect } from "react";
import { Modal, Spin } from "antd";
import { useModalState } from "../../../zustand/Modal";
import FormikForm from "../../../Layout/Dashboard/FormikFormModel";
import ModelBody from "./Add";
import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model";
import { useAddTeacher } from "../../../api/teacher";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useTranslation } from "react-i18next";
import ModelButtons from "../../../Components/models/ModelButtons";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useAddTeacher();
const { set_object_to_edit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("isSuccess");
set_object_to_edit({});
}
}, [setIsOpen, isSuccess]);
const handleSubmit = (values: any) => {
mutate({
name: values?.name,
contact_information: values?.number,
address: values?.address,
});
};
const handleCancel = () => {
setIsOpen("");
set_object_to_edit({});
};
const [t] = useTranslation();
return (
<>
<Modal
className="ModalForm"
centered
width={"60vw"}
footer={null}
open={isOpen === ModalEnum?.TEACHER_ADD}
onCancel={handleCancel}
>
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues([])}
validationSchema={getValidationSchema}
>
<header>
{t("practical.add")} {t("models.teacher")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<ModelButtons isLoading={isLoading} />
</main>
</FormikForm>
</Modal>
</>
);
};
export default ModalForm;

View File

@ -0,0 +1,94 @@
import React, { useEffect, useState } from "react";
import { Input, Modal, Spin } from "antd";
import { useModalState } from "../../../zustand/Modal";
import { ModalEnum } from "../../../enums/Model";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useDeleteTeacher } from "../../../api/teacher";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const [inputValue, setInputValue] = useState("");
const { mutate, isLoading, isSuccess } = useDeleteTeacher();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setInputValue("");
}
}, [isSuccess, setIsOpen]);
const handleSubmit = () => {
mutate({
id: Number(object_to_edit?.id),
});
};
const handleCancel = () => {
setInputValue("");
setIsOpen("");
set_object_to_edit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
// Step 2: Handle changes to the input field
setInputValue(e.target.value);
};
const [t] = useTranslation();
return (
<>
<Modal
className="ModalForm"
centered
width={"40vw"}
footer={null}
open={isOpen === ModalEnum?.TEACHER_DELETE}
onCancel={handleCancel}
>
<header>
{t("practical.delete")} ({object_to_edit?.name}){" "}
</header>
<main className="main_modal">
<div className="ValidationField w-100 mb-5">
<label className="text ">
{t("practical.to_confirm_deletion_please_re_enter")}{" "}
{t("input.name")} {t("models.teacher")}
</label>
<Input
size="large"
type="text"
placeholder={`${t("practical.enter")} ${t("input.name")} ${t("models.teacher")} `}
value={inputValue}
onChange={handleChange}
/>
</div>
<div className="buttons">
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
object_to_edit?.name !== inputValue ? "disabled_button" : ""
}
disabled={object_to_edit?.name !== inputValue || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</Modal>
</>
);
};
export default ModalForm;

View File

@ -0,0 +1,17 @@
import { Col, Row } from "reactstrap";
import ValidationField from "../../../Components/ValidationField/ValidationField";
const Form = () => {
return (
<Row className="w-100">
<Col>
<ValidationField placeholder="name" label="name" name="name" />
<ValidationField placeholder="address" label="address" name="address" />
</Col>
<Col>
<ValidationField placeholder="number" label="number" name="number" />
</Col>
</Row>
);
};
export default Form;

View File

@ -0,0 +1,72 @@
import React, { useEffect } from "react";
import { Modal, Spin } from "antd";
import { useModalState } from "../../../zustand/Modal";
import FormikForm from "../../../Layout/Dashboard/FormikFormModel";
import ModelBody from "./Edit";
import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useUpdateTeacher } from "../../../api/teacher";
import { useTranslation } from "react-i18next";
import ModelButtons from "../../../Components/models/ModelButtons";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { object_to_edit, set_object_to_edit } = useObjectToEdit(
(state) => state,
);
const { mutate, isSuccess, isLoading } = useUpdateTeacher();
// console.log(object_to_edit,"object_to_edit");
const handleSubmit = (values: any) => {
// const contactInformationJson = JSON.stringify({
// phone_number: values?.number
// });
mutate({
id: values?.id,
name: values?.name,
contact_information: values?.number,
address: values?.address,
});
};
const handleCancel = () => {
setIsOpen("");
set_object_to_edit({});
};
useEffect(() => {
if (isSuccess) {
setIsOpen("");
}
}, [setIsOpen, isSuccess]);
const [t] = useTranslation();
return (
<Modal
className="ModalForm"
centered
width={"60vw"}
footer={null}
open={isOpen === ModalEnum?.TEACHER_EDIT}
onCancel={handleCancel}
>
{object_to_edit && (
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues(object_to_edit)}
validationSchema={getValidationSchema}
>
<header>
{" "}
{t("practical.edit")} {t("practical.details")} {t("models.teacher")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<ModelButtons isLoading={isLoading} />
</main>
</FormikForm>
)}
</Modal>
);
};
export default ModalForm;

View File

@ -0,0 +1,16 @@
import * as Yup from "yup";
export const getInitialValues = (objectToEdit: any): any => {
return {
id: objectToEdit?.id ?? null,
number: objectToEdit?.contact_information ?? null,
name: objectToEdit?.name ?? null,
address: objectToEdit?.address ?? null,
};
};
export const getValidationSchema = () => {
return Yup.object().shape({
number: Yup.string().required("validation.required"),
name: Yup.string().required("validation.required"),
});
};

View File

@ -0,0 +1,55 @@
import { FaPlus } from "react-icons/fa";
import useModalHandler from "../../utils/useModalHandler";
import { ModalEnum } from "../../enums/Model";
// import useSetPage_title from "../../Hooks/useSetPageTitle";
import { useTranslation } from "react-i18next";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../../enums/abilities";
import { hasAbility } from "../../utils/hasAbility";
import { lazy, Suspense } from 'react';
import { Spin } from "antd";
const Table = lazy(() => import('./Table'));
const AddModalForm = lazy(() => import('./Model/AddModel'));
const EditModalForm = lazy(() => import('./Model/EditModel'));
const DeleteModalForm = lazy(() => import('./Model/Delete'));
const SearchField = lazy(() => import('../../Components/DataTable/SearchField'));
const TableHeader = () => {
const { handel_open_model } = useModalHandler();
const [t] = useTranslation();
// useSetPage_title(`${t(ABILITIES_ENUM?.MAIN_PAGE)} / ${t(`models.${ABILITIES_ENUM.TEACHER}`)}`);
const can_add_TEACHER = hasAbility(ABILITIES_ENUM.TEACHER, ABILITIES_VALUES_ENUM.STORE);
return (
<div className="TableWithHeader">
<Suspense fallback={<Spin/>}>
<header className="d-flex justify-content-between">
<SearchField searchBy="name" placeholder={t("practical.search_here")} />
{can_add_TEACHER && (
<div className="Selects">
<button
onClick={() => handel_open_model(ModalEnum?.TEACHER_ADD)}
className="add_button"
>
{t("practical.add")} {t("models.teacher")} <FaPlus />
</button>
</div>
)}
</header>
<Table />
<DeleteModalForm />
<AddModalForm />
<EditModalForm />
</Suspense>
</div>
);
};
export default TableHeader;

View File

@ -0,0 +1,17 @@
import React from "react";
import { useGetAllTeacher } from "../../api/teacher";
import DataTable from "../../Layout/Dashboard/Table/DataTable";
import { useColumns } from "./useTableColumns";
import useSearchQuery from "../../api/utils/useSearchQuery";
const App: React.FC = () => {
const [searchQuery] = useSearchQuery("name");
const response = useGetAllTeacher({
name: searchQuery,
pagination: true,
});
return <DataTable response={response} useColumns={useColumns} />;
};
export default App;

View File

@ -0,0 +1,17 @@
import { useColumns } from "./useTableColumns";
import Table from "./Table";
import { FaPlus } from "react-icons/fa";
import AddModalForm from "./Model/AddModel";
import EditModalForm from "./Model/EditModel";
import DeleteModalForm from "./Model/Delete";
export {
Table,
useColumns,
AddModalForm,
EditModalForm,
DeleteModalForm,
FaPlus
};

View File

@ -0,0 +1,109 @@
import { Space, TableColumnsType, Tooltip } from "antd";
import { Teacher } from "../../types/Item";
import { ModalEnum } from "../../enums/Model";
import { MdOutlineEdit } from "react-icons/md";
import { RiDeleteBin6Fill } from "react-icons/ri";
import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { useModalState } from "../../zustand/Modal";
import { useTranslation } from "react-i18next";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../../enums/abilities";
import { hasAbility } from "../../utils/hasAbility";
export const useColumns = () => {
const { setIsOpen } = useModalState((state) => state);
const { set_object_to_edit } = useObjectToEdit((state) => state);
const handelDelete = (record: any) => {
set_object_to_edit(record);
setIsOpen(ModalEnum?.TEACHER_DELETE);
};
const [t] = useTranslation();
const can_edit_TEACHER = hasAbility(
ABILITIES_ENUM.TEACHER,
ABILITIES_VALUES_ENUM.UPDATE,
);
const can_delete_TEACHER = hasAbility(
ABILITIES_ENUM.TEACHER,
ABILITIES_VALUES_ENUM.DELETE,
);
const columns: TableColumnsType<Teacher> = [
{
title: t("columns.id"),
dataIndex: "id",
key: "id",
align: "center",
},
{
title: t("columns.name"),
dataIndex: "name",
key: "name",
align: "center",
},
{
title: t("columns.address"),
dataIndex: "address",
key: "address",
align: "center",
},
{
title: t("columns.contact_information"),
dataIndex: "contact_information",
key: "contact_information",
align: "center",
render: (text, record, index) => {
return <>{record?.contact_information}</>;
},
},
{
title: "",
key: "actions",
align: "end",
width: "25vw",
render: (text, record, index) => {
const handleEdit = (record: any) => {
// console.log(record,"record");
set_object_to_edit(record);
setIsOpen(ModalEnum?.TEACHER_EDIT);
};
const className =
index % 2 === 0 ? "even-row buttonAction" : "odd-row buttonAction";
return (
<Space size="middle" className={className}>
{can_edit_TEACHER && (
<Tooltip
placement="top"
title={t("practical.edit")}
color="#E0E0E0"
>
<span onClick={() => handleEdit(record)}>
<MdOutlineEdit
size={22}
style={{ color: "#A098AE" }}
/>
</span>
</Tooltip>
)}
{can_delete_TEACHER && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}
style={{ color: "#C11313" }}
/>
)}
</Space>
);
},
},
];
return columns;
};

View File

@ -12,11 +12,11 @@ const ModalForm: React.FC = () => {
const [inputValue, setInputValue] = useState("");
const { mutate, isSuccess, isLoading } = useDeleteUnit();
const { objectToEdit } = useObjectToEdit((state) => state);
const { object_to_edit } = useObjectToEdit((state) => state);
const [t] = useTranslation();
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
id: Number(object_to_edit?.id),
});
};
@ -51,7 +51,7 @@ const ModalForm: React.FC = () => {
>
<header>
{" "}
{t("practical.delete")} {objectToEdit?.name}{" "}
{t("practical.delete")} {object_to_edit?.name}{" "}
</header>
<main className="main_modal">
@ -74,9 +74,9 @@ const ModalForm: React.FC = () => {
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.name !== inputValue ? "disabled_button" : ""
object_to_edit?.name !== inputValue ? "disabled_button" : ""
}
disabled={objectToEdit?.name !== inputValue || isLoading}
disabled={object_to_edit?.name !== inputValue || isLoading}
onClick={handleSubmit}
type="button"
>

View File

@ -14,9 +14,9 @@ const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useUpdateUnit();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
// console.log(objectToEdit,"objectToEdit");
// console.log(object_to_edit,"object_to_edit");
const { subject_id } = useParams();
useEffect(() => {
@ -50,7 +50,7 @@ const ModalForm: React.FC = () => {
>
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues(objectToEdit)}
initialValues={getInitialValues(object_to_edit)}
validationSchema={getValidationSchema}
>
<header>

View File

@ -23,6 +23,7 @@ const TableHeader = () => {
const SubjectName = Subject?.data?.name ?? "";
console.log(SubjectName);
useSetPage_title(
t(`page_header.subject`) +
"/" +

View File

@ -1,36 +1,54 @@
import { Space, TableColumnsType, Tooltip } from "antd";
import { Unit } from "../../types/Item";
import { FaPlus } from "react-icons/fa";
import useModalHandler from "../../utils/useModalHandler";
import { ModalEnum } from "../../enums/Model";
import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { RiDeleteBin6Fill } from "react-icons/ri";
import { MdOutlineEdit } from "react-icons/md";
import { findLabelByValue } from "../../utils/findLabelByValue";
import { useTranslation } from "react-i18next";
import { ABILITIES_ENUM } from "../../enums/abilities";
import { hasAbility } from "../../utils/hasAbility";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../../enums/abilities";
import { formatNumber } from "../../utils/formatNumber";
import { BsEyeFill } from "react-icons/bs";
import { useNavigate } from "react-router-dom";
import { canAddUnit, canDeleteUnit, canEditUnit, canShowUnit } from "../../utils/hasAbilityFn";
export const useColumns = () => {
const { handel_open_model } = useModalHandler();
const { setObjectToEdit } = useObjectToEdit((state) => state);
const { set_object_to_edit } = useObjectToEdit((state) => state);
const navigate = useNavigate()
const handelShow = (record: any) => {
navigate(`${ABILITIES_ENUM?.UNIT}/${record?.id}`);
};
const can_edit_Unit = hasAbility(
ABILITIES_ENUM.UNIT,
ABILITIES_VALUES_ENUM.UPDATE,
);
const can_delete_Unit = hasAbility(
ABILITIES_ENUM.UNIT,
ABILITIES_VALUES_ENUM.DELETE,
);
const can_add_Unit = hasAbility(
ABILITIES_ENUM.UNIT,
ABILITIES_VALUES_ENUM.STORE,
);
const can_show_Unit = hasAbility(
ABILITIES_ENUM.UNIT,
ABILITIES_VALUES_ENUM.SHOW,
);
const handelDelete = (data: any) => {
setObjectToEdit(data);
set_object_to_edit(data);
handel_open_model(ModalEnum?.UNIT_DELETE);
};
const handleEdit = (record: any) => {
setObjectToEdit(record);
set_object_to_edit(record);
handel_open_model(ModalEnum?.UNIT_EDIT);
};
const [t] = useTranslation();
@ -60,7 +78,7 @@ export const useColumns = () => {
},
{
title: canAddUnit ? (
title: can_add_Unit ? (
<button
onClick={() => handel_open_model(ModalEnum?.UNIT_ADD)}
className="add_button"
@ -79,7 +97,7 @@ export const useColumns = () => {
return (
<Space size="middle" className={className}>
{canEditUnit && (
{can_edit_Unit && (
<Tooltip
placement="top"
title={t("practical.edit")}
@ -94,14 +112,14 @@ export const useColumns = () => {
</span>
</Tooltip>
)}
{canDeleteUnit && (
{can_delete_Unit && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}
style={{ color: "#C11313" }}
/>
)}
{canShowUnit && (
{can_show_Unit && (
<BsEyeFill
onClick={() => handelShow(record)}

View File

@ -14,7 +14,7 @@ import { ParamsEnum } from "../../../enums/params";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
const queryClient = useQueryClient();

View File

@ -12,12 +12,12 @@ const ModalForm: React.FC = () => {
const [inputValue, setInputValue] = useState("");
const { mutate, isSuccess, isLoading } = useDeleteLesson();
const { objectToEdit,setObjectToEdit } = useObjectToEdit((state) => state);
const { object_to_edit,set_object_to_edit } = useObjectToEdit((state) => state);
const queryClient = useQueryClient();
const [t] = useTranslation();
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
id: Number(object_to_edit?.id),
});
};
useEffect(() => {
@ -32,7 +32,7 @@ const ModalForm: React.FC = () => {
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -51,7 +51,7 @@ const ModalForm: React.FC = () => {
>
<header>
{" "}
{t("practical.delete")} {objectToEdit?.name}{" "}
{t("practical.delete")} {object_to_edit?.name}{" "}
</header>
<main className="main_modal">
@ -74,9 +74,9 @@ const ModalForm: React.FC = () => {
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.name !== inputValue ? "disabled_button" : ""
object_to_edit?.name !== inputValue ? "disabled_button" : ""
}
disabled={objectToEdit?.name !== inputValue || isLoading}
disabled={object_to_edit?.name !== inputValue || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}

View File

@ -14,11 +14,11 @@ const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useUpdateLesson();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
const queryClient = useQueryClient();
// console.log(objectToEdit,"objectToEdit");
// console.log(object_to_edit,"object_to_edit");
useEffect(() => {
if (isSuccess) {
@ -53,7 +53,7 @@ const ModalForm: React.FC = () => {
>
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues(objectToEdit)}
initialValues={getInitialValues(object_to_edit)}
validationSchema={getValidationSchema}
>
<header>

View File

@ -14,27 +14,41 @@ import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../../enums/abilities";
import { formatNumber } from "../../utils/formatNumber";
import { BsEyeFill } from "react-icons/bs";
import { useNavigate } from "react-router-dom";
import { canAddLesson, canDeleteLesson, canEditLesson, canShowLesson } from "../../utils/hasAbilityFn";
export const useColumns = () => {
const { handel_open_model } = useModalHandler();
const { setObjectToEdit } = useObjectToEdit((state) => state);
const { set_object_to_edit } = useObjectToEdit((state) => state);
const navigate = useNavigate()
const handelShow = (record: any) => {
navigate(`${ABILITIES_ENUM.LESSON}/${record?.id}`);
};
const can_edit_Lesson = hasAbility(
ABILITIES_ENUM.LESSON,
ABILITIES_VALUES_ENUM.UPDATE,
);
const can_delete_Lesson = hasAbility(
ABILITIES_ENUM.LESSON,
ABILITIES_VALUES_ENUM.DELETE,
);
const can_add_Lesson = hasAbility(
ABILITIES_ENUM.LESSON,
ABILITIES_VALUES_ENUM.STORE,
);
const can_show_Lesson = hasAbility(
ABILITIES_ENUM.LESSON,
ABILITIES_VALUES_ENUM.SHOW,
);
const handelDelete = (data: any) => {
setObjectToEdit(data);
set_object_to_edit(data);
handel_open_model(ModalEnum?.LESSON_DELETE);
};
const handleEdit = (record: any) => {
setObjectToEdit(record);
set_object_to_edit(record);
handel_open_model(ModalEnum?.LESSON_EDIT);
};
const [t] = useTranslation();
@ -55,7 +69,7 @@ export const useColumns = () => {
render: (text, record) => record?.name,
},
{
title: canAddLesson ? (
title: can_add_Lesson ? (
<button
onClick={() => handel_open_model(ModalEnum?.LESSON_ADD)}
className="add_button"
@ -74,7 +88,7 @@ export const useColumns = () => {
return (
<Space size="middle" className={className}>
{canEditLesson && (
{can_edit_Lesson && (
<Tooltip
placement="top"
title={t("practical.edit")}
@ -89,14 +103,14 @@ export const useColumns = () => {
</span>
</Tooltip>
)}
{canDeleteLesson && (
{can_delete_Lesson && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}
style={{ color: "#C11313" }}
/>
)}
{canShowLesson && (
{can_show_Lesson && (
<BsEyeFill
onClick={() => handelShow(record)}

View File

@ -22,47 +22,21 @@ import { QUESTION_OBJECT_KEY } from "../../config/AppKey";
import useSaveOnDisconnect from "../../Hooks/useSaveOnDisconnect";
import { getLocalStorageQuestions } from "../../utils/setLocalStorageQuestions";
import { toast } from "react-toastify";
import useSetPage_title from "../../Hooks/useSetPageTitle";
import { useGetAllUnit } from "../../api/unit";
import { useGetAllLesson } from "../../api/lesson";
const AddPage: React.FC = () => {
const {isSuccess:isSuccessAsync,mutateAsync} = useAddQuestionAsync()
const { mutate,isSuccess, isLoading} = useAddQuestion();
const {isBseQuestion,setTagsSearch,setObjectToEdit,setSuccess,SavedQuestionData} = useObjectToEdit()
const {isBseQuestion,set_Tags_search,set_object_to_edit,set_Success,SavedQuestionData} = useObjectToEdit()
const {subject_id,lesson_id,unit_id} = useParams<ParamsEnum>()
const {subject_id,lesson_id} = useParams<ParamsEnum>()
const { setIsOpen } = useModalState((state) => state);
const { data: unit } = useGetAllUnit({ show: unit_id });
const { data: lesson } = useGetAllLesson({ show: lesson_id });
const [t] = useTranslation()
const unitName = unit?.data?.name ?? "";
const SubjectName = unit?.data?.subject?.name ?? "";
const lessonName = lesson?.data?.name ?? "";
useSetPage_title(
t(`page_header.subject`) +
"/" +
`${SubjectName}` +
"/" +
t(`page_title.unit`) +
"/" +
`${unitName}`+"/"
+
t(`page_title.lesson`) +
"/" +
`${lessonName}`+ "/" +
t(`page_title.questions`)
);
const handleSubmit = (values: any, { resetForm }: { resetForm: () => void }) => {
const DataToSend = structuredClone(values);
setTagsSearch(null);
set_Tags_search(null);
console.log(isBseQuestion);
if (isBseQuestion || DataToSend?.isBase === 1) {
@ -110,15 +84,15 @@ const AddPage: React.FC = () => {
useEffect(() => {
if (isSuccessAsync && ( SavedQuestionData?.Questions?.length > 0 ? isSuccess: true )) {
setObjectToEdit(null)
setSuccess(true)
set_object_to_edit(null)
set_Success(true)
localStorage.removeItem(QUESTION_OBJECT_KEY)
}
if(isSuccess && !(SavedQuestionData?.Questions?.length)){
toast.success(t("validation.the_possess_done_successful"))
setObjectToEdit(null)
setSuccess(true)
set_object_to_edit(null)
set_Success(true)
localStorage.removeItem(QUESTION_OBJECT_KEY)
}
}, [isSuccess,isSuccessAsync])
@ -143,6 +117,7 @@ const AddPage: React.FC = () => {
}
};
const [t] = useTranslation();
if(isBseQuestion || SavedData?.isBase === 1){

View File

@ -10,18 +10,16 @@ import { ParamsEnum } from "../../enums/params";
import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { removeStringKeys } from "../../utils/removeStringKeys";
import SpinContainer from "../../Components/Layout/SpinContainer";
import Header from "../../Components/exercise/Header";
import Form from './Model/Edit'
import BaseForm from './Model/Malty/Edit'
import { Question } from "../../types/Item";
import { toast } from "react-toastify";
import useSetPage_title from "../../Hooks/useSetPageTitle";
import { useGetAllUnit } from "../../api/unit";
import { useGetAllLesson } from "../../api/lesson";
const EditPage: React.FC = () => {
const {question_id,subject_id,unit_id} = useParams<ParamsEnum>()
const {isBseQuestion,setIsBseQuestion,setTagsSearch,DeletedQuestions} = useObjectToEdit()
const {question_id,subject_id} = useParams<ParamsEnum>()
const {isBseQuestion,set_isBseQuestion,set_Tags_search,DeletedQuestions} = useObjectToEdit()
const { mutate, isSuccess, isLoading } = useUpdateQuestion();
const { mutate:DeleteQuestion} = useDeleteQuestion();
@ -31,45 +29,20 @@ const EditPage: React.FC = () => {
const {data:Questions,isLoading:QuestionsDataLoading}= useGetAllQuestion({questionParentId:question_id ,onlyWithNoParents:false})
const objectToEdit = {...data?.data,Questions:Questions?.data } ;
const object_to_edit = {...data?.data,Questions:Questions?.data } ;
const {lesson_id} = useParams()
useEffect(() => {
if(objectToEdit?.isBase && isBseQuestion !== true){
setIsBseQuestion(true)
if(object_to_edit?.isBase && isBseQuestion !== true){
set_isBseQuestion(true)
}
}, [objectToEdit?.isBase])
const { data: unit } = useGetAllUnit({ show: unit_id });
const { data: lesson } = useGetAllLesson({ show: lesson_id });
const [t] = useTranslation()
const unitName = unit?.data?.name ?? "";
const SubjectName = unit?.data?.subject?.name ?? "";
const lessonName = lesson?.data?.name ?? "";
useSetPage_title(
t(`page_header.subject`) +
"/" +
`${SubjectName}` +
"/" +
t(`page_title.unit`) +
"/" +
`${unitName}`+"/"
+
t(`page_title.lesson`) +
"/" +
`${lessonName}`+ "/" +
t(`page_title.questions`)
);
}, [object_to_edit?.isBase])
const handleSubmit = (values: any) => {
const DataToSend = structuredClone(values);
setTagsSearch(null)
set_Tags_search(null)
console.log(DataToSend);
if(isBseQuestion){
@ -79,11 +52,10 @@ const EditPage: React.FC = () => {
"content" : DataToSend?.content,
"image": DataToSend?.image ?? "",
}
if( typeof UpdateBseQuestion?.image === "string" && UpdateBseQuestion?.image !== ""){
if( typeof UpdateBseQuestion?.image === "string"){
delete UpdateBseQuestion["image"]
}
console.log(DeletedQuestions,"DeletedQuestions");
console.log(UpdateBseQuestion);
mutate(UpdateBseQuestion)
@ -146,21 +118,11 @@ const EditPage: React.FC = () => {
delete updatedObject["parent_id"];
const tags = processTags(updatedObject)
console.log(updatedObject,"updatedObject");
if(!(updatedObject?.image)){
updatedObject["image"] = "" ;
}
console.log(updatedObject);
const oldQuestionOptions = [] as any;
const newQuestionOptions = [] as any;
updatedObject?.QuestionOptions?.forEach((item:any) => {
if (item?.id) {
// if(!item?.answer_image){
// item["answer_image"] = ""
// }
console.log(item);
oldQuestionOptions.push(item);
} else {
newQuestionOptions.push(item);
@ -183,6 +145,7 @@ const EditPage: React.FC = () => {
navigate(-1)
};
const [t] = useTranslation();
useEffect(() => {
if(isSuccess){
@ -193,10 +156,10 @@ const EditPage: React.FC = () => {
if(dataLoading || QuestionsDataLoading){
if(dataLoading && !!(object_to_edit?.isBase) && QuestionsDataLoading){
return <SpinContainer/>
}
if(objectToEdit?.isBase){
if(object_to_edit?.isBase){
return (
@ -204,7 +167,7 @@ const EditPage: React.FC = () => {
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValuesBase(objectToEdit)}
initialValues={getInitialValuesBase(object_to_edit)}
validationSchema={getValidationSchemaBase}
>
@ -244,7 +207,7 @@ const EditPage: React.FC = () => {
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues(objectToEdit)}
initialValues={getInitialValues(object_to_edit)}
validationSchema={getValidationSchema}
>

View File

@ -11,18 +11,18 @@ import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import MathInput from "./MathInput";
const Form = () => {
const formik = useFormikContext<any>();
const{setSuccess,Success,setSavedQuestionData} = useObjectToEdit()
const{set_Success,Success,set_SavedQuestionData} = useObjectToEdit()
useEffect(() => {
if (Success) {
formik.setErrors({});
formik.resetForm({ values: {} });
setSuccess(false)
set_Success(false)
}
}, [Success]);
useEffect(() => {
setSavedQuestionData(formik.values)
set_SavedQuestionData(formik.values)
}, [formik?.values])

View File

@ -11,7 +11,7 @@ const ModalForm: React.FC = () => {
const [inputValue, setInputValue] = useState("");
const { mutate, isLoading, isSuccess } = useDeleteQuestion();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
@ -22,14 +22,14 @@ const ModalForm: React.FC = () => {
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
id: Number(object_to_edit?.id),
});
};
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -37,7 +37,7 @@ const ModalForm: React.FC = () => {
setInputValue(e.target.value);
};
const [t] = useTranslation();
console.log(objectToEdit?.id);
console.log(object_to_edit?.id);
return (
<>
@ -50,7 +50,7 @@ const ModalForm: React.FC = () => {
onCancel={handleCancel}
>
<header>
{t("practical.delete")} {t("input.id")} ({objectToEdit?.id}){" "}
{t("practical.delete")} {t("input.id")} ({object_to_edit?.id}){" "}
</header>
<main className="main_modal">
<div className="ValidationField w-100 mb-5">
@ -72,9 +72,9 @@ const ModalForm: React.FC = () => {
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.id !== inputValue ? "disabled_button" : ""
object_to_edit?.id !== inputValue ? "disabled_button" : ""
}
disabled={Number(objectToEdit?.id) !== Number(inputValue) || isLoading}
disabled={Number(object_to_edit?.id) !== Number(inputValue) || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}

View File

@ -15,7 +15,7 @@ const Form = () => {
const formik = useFormikContext<any>();
const { isOpen } = useModalState((state) => state);
// const {data} = useGetAllQuestion();
const{setSuccess,Success,setSavedQuestionData} = useObjectToEdit()
const{set_Success,Success,set_SavedQuestionData} = useObjectToEdit()
useEffect(() => {
if (Success) {
@ -23,12 +23,12 @@ const Form = () => {
formik.setErrors({});
formik.resetForm({ values: {} });
setSuccess(false)
set_Success(false)
}
}, [Success]);
useEffect(() => {
setSavedQuestionData(formik.values)
set_SavedQuestionData(formik.values)
}, [formik?.values])
// console.log(formik?.errors);

View File

@ -13,18 +13,18 @@ import { toast } from 'react-toastify';
const QuestionFIeld = ({index,data}:{index:number , data :Choice }) => {
const formik = useFormikContext<any>();
console.log(index);
const {setDeletedQuestions,DeletedQuestions} = useObjectToEdit()
const {set_DeletedQuestions,DeletedQuestions} = useObjectToEdit()
const [t] = useTranslation()
useEffect(() => {
setDeletedQuestions([])
set_DeletedQuestions([])
}, [window?.location.pathname])
const handleDeleteQuestion = () => {
const DeleteQuestionId = formik.values.Questions?.[index];
if(DeleteQuestionId?.id){
setDeletedQuestions([...DeletedQuestions,DeleteQuestionId])
set_DeletedQuestions([...DeletedQuestions,DeleteQuestionId])
}
const updatedQuestionOptions = formik.values.Questions.filter((_:any, i:any) => i !== index);

View File

@ -10,9 +10,9 @@ const DynamicTags = ({parent_index}:{parent_index:number}) => {
const formik = useFormikContext<any>()
const [t] = useTranslation()
const { TagsSearch ,setTagsSearch,currentTag,currentParentIndex} = useObjectToEdit();
const { Tags_search ,set_Tags_search,currentTag,current_parent_index} = useObjectToEdit();
const {data} = useGetAllTag({
name : TagsSearch
name : Tags_search
})
const suggests = data?.data
@ -20,7 +20,7 @@ const DynamicTags = ({parent_index}:{parent_index:number}) => {
const handleAddChoice = () => {
const length = formik?.values?.Questions?.[parent_index]?.tags.length;
const lastElement = formik?.values?.Questions?.[parent_index]?.tags[length - 1]?.name;
setTagsSearch(null)
set_Tags_search(null)
if(lastElement !== ""){
formik.setFieldValue(`Questions.[${parent_index}].tags`, [...(formik?.values as any)?.Questions?.[parent_index]?.tags as any[],
@ -45,7 +45,7 @@ const handleChoice = (item: any) => {
console.log(currentTag);
formik.setFieldValue(`Questions.[${parent_index}].tags[${currentTag}]`, {...item,key:length});
setTagsSearch(null);
set_Tags_search(null);
}
@ -87,10 +87,10 @@ return (
}
</div>
{TagsSearch && currentParentIndex === parent_index &&
{Tags_search && current_parent_index === parent_index &&
<div className="suggests">
{suggests?.map((item:any,index:number)=>{
console.log(currentParentIndex === parent_index);
console.log(current_parent_index === parent_index);
return (
<div className='suggested' key={index} onClick={()=> handleChoice(item)}>

View File

@ -8,7 +8,7 @@ const Tag = ({ data, index,parent_index }: { data: any, index: number,parent_ind
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
const DEBOUNCE_DELAY = 500;
const formik = useFormikContext<any>();
const { setTagsSearch ,setCurrentTag,setCurrentParentIndex} = useObjectToEdit();
const { set_Tags_search ,set_currentTag,set_current_parent_index} = useObjectToEdit();
console.log(formik?.values?.Questions);
useEffect(() => {
@ -22,14 +22,14 @@ const Tag = ({ data, index,parent_index }: { data: any, index: number,parent_ind
formik.setFieldValue(`Questions.[${parent_index}].tags[${index}]`, {key:parent_index, name :e.target.value , id:`${parent_index}_key`});
setCurrentTag(index)
setCurrentParentIndex(parent_index)
set_currentTag(index)
set_current_parent_index(parent_index)
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
timeoutRef.current = setTimeout(() => {
setTagsSearch(e.target.value)
set_Tags_search(e.target.value)
}, DEBOUNCE_DELAY);
};
@ -48,7 +48,7 @@ const Tag = ({ data, index,parent_index }: { data: any, index: number,parent_ind
formik.setFieldValue(`Questions.[${parent_index}].tags`, currentTags);
// Reset search state if needed
setTagsSearch(null);
set_Tags_search(null);
};

View File

@ -10,18 +10,18 @@ const DynamicTags = () => {
const formik = useFormikContext<any>()
const [t] = useTranslation()
const { TagsSearch ,setTagsSearch,currentTag} = useObjectToEdit();
const { Tags_search ,set_Tags_search,currentTag} = useObjectToEdit();
const {data} = useGetAllTag({
name : TagsSearch
name : Tags_search
})
const suggests = data?.data
console.log(TagsSearch);
console.log(Tags_search);
const handleAddChoice = () => {
const length = formik?.values?.tags.length;
const lastElement = formik?.values?.tags[length - 1]?.name;
setTagsSearch
set_Tags_search
if(lastElement !== ""){
formik.setFieldValue('tags', [...(formik?.values as any)?.tags as any[],
@ -45,7 +45,7 @@ const handleChoice = (item: any) => {
console.log(currentTag);
formik.setFieldValue(`tags[${currentTag}]`, {...item,key:length});
setTagsSearch(null);
set_Tags_search(null);
}
@ -86,7 +86,7 @@ return (
}
</div>
{TagsSearch &&
{Tags_search &&
<div className="suggests">
{suggests?.map((item:any,index:number)=>{
return (

View File

@ -6,7 +6,7 @@ import { FaTrash } from 'react-icons/fa';
const Tag = ({ data, index }: { data: any, index: number }) => {
const inputRef = useRef<HTMLInputElement>(null);
const formik = useFormikContext<any>();
const { setTagsSearch ,setCurrentTag} = useObjectToEdit();
const { set_Tags_search ,set_currentTag} = useObjectToEdit();
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
const DEBOUNCE_DELAY = 500;
useEffect(() => {
@ -18,21 +18,21 @@ const Tag = ({ data, index }: { data: any, index: number }) => {
const handleEditInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
// console.log(e.target.value);
formik.setFieldValue(`tags[${index}].name`, e.target.value);
// setTagsSearch(e.target.value)
// set_Tags_search(e.target.value)
formik.setFieldValue(`tags.[${index}]`, {key:index, name :e.target.value , id:`${index}_key`});
setCurrentTag(index)
set_currentTag(index)
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
timeoutRef.current = setTimeout(() => {
setTagsSearch(e.target.value)
set_Tags_search(e.target.value)
}, DEBOUNCE_DELAY);
};
const handleInputBlur = () => {
// setTagsSearch(null)
// set_Tags_search(null)
};
const handleDeleteChoice = () => {
@ -50,7 +50,7 @@ const Tag = ({ data, index }: { data: any, index: number }) => {
formik.setFieldValue('tags', currentTags);
// Reset search state if needed
setTagsSearch(null);
set_Tags_search(null);
};
return (

View File

@ -1,35 +1,57 @@
import { Space, TableColumnsType, Tooltip } from "antd";
import { Question } from "../../types/Item";
import { FaPlus } from "react-icons/fa";
import useModalHandler from "../../utils/useModalHandler";
import { ModalEnum } from "../../enums/Model";
import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { RiDeleteBin6Fill } from "react-icons/ri";
import { MdOutlineEdit } from "react-icons/md";
import { findLabelByValue } from "../../utils/findLabelByValue";
import { useTranslation } from "react-i18next";
import { ABILITIES_ENUM } from "../../enums/abilities";
import { hasAbility } from "../../utils/hasAbility";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../../enums/abilities";
import { formatNumber } from "../../utils/formatNumber";
import { BsEyeFill } from "react-icons/bs";
import { useNavigate } from "react-router-dom";
import { useModalState } from "../../zustand/Modal";
import { canAddQuestion, canDeleteQuestion, canEditQuestion } from "../../utils/hasAbilityFn";
export const useColumns = () => {
const { setObjectToEdit } = useObjectToEdit((state) => state);
const { handel_open_model } = useModalHandler();
const { set_object_to_edit } = useObjectToEdit((state) => state);
const navigate = useNavigate()
const { setIsOpen } = useModalState((state) => state);
const handelAdd = () => {
setObjectToEdit({})
set_object_to_edit({})
navigate(`${ABILITIES_ENUM?.QUESTION}/add`)
};
const can_edit_Question = hasAbility(
ABILITIES_ENUM.QUESTION,
ABILITIES_VALUES_ENUM.UPDATE,
);
const can_delete_Question = hasAbility(
ABILITIES_ENUM.QUESTION,
ABILITIES_VALUES_ENUM.DELETE,
);
const can_add_Question = hasAbility(
ABILITIES_ENUM.QUESTION,
ABILITIES_VALUES_ENUM.STORE,
);
const can_show_Question = hasAbility(
ABILITIES_ENUM.QUESTION,
ABILITIES_VALUES_ENUM.SHOW,
);
const handelDelete = (data: any) => {
setObjectToEdit(data);
set_object_to_edit(data);
setIsOpen(ModalEnum?.QUESTION_DELETE);
};
const handleEdit = (record: any) => {
setObjectToEdit(record);
set_object_to_edit(record);
navigate(`${ABILITIES_ENUM?.QUESTION}/${record?.id}`)
};
@ -49,7 +71,6 @@ export const useColumns = () => {
key: "name",
align: "center",
render: (text, record) => record?.content,
ellipsis:true
},
{
title: t("columns.isBase"),
@ -66,7 +87,7 @@ export const useColumns = () => {
render: (text, record) => record?.question_options_count,
},
{
title: canAddQuestion ? (
title: can_add_Question ? (
<button
onClick={() => handelAdd() }
className="add_button"
@ -85,7 +106,7 @@ export const useColumns = () => {
return (
<Space size="middle" className={className}>
{canEditQuestion && (
{can_edit_Question && (
<Tooltip
placement="top"
title={t("practical.edit")}
@ -100,7 +121,7 @@ export const useColumns = () => {
</span>
</Tooltip>
)}
{canDeleteQuestion && (
{can_delete_Question && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}

View File

@ -13,12 +13,12 @@ import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useAddSubject();
const { setObjectToEdit } = useObjectToEdit();
const { set_object_to_edit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
}
}, [setIsOpen, isSuccess]);
@ -32,7 +32,7 @@ const ModalForm: React.FC = () => {
const handleCancel = () => {
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const [t] = useTranslation();
return (

View File

@ -11,9 +11,9 @@ const ModalForm: React.FC = () => {
const [inputValue, setInputValue] = useState("");
const { mutate, isSuccess, isLoading } = useDeleteSubject();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
const full_name = objectToEdit?.name;
const full_name = object_to_edit?.name;
useEffect(() => {
if (isSuccess) {
@ -24,14 +24,14 @@ const ModalForm: React.FC = () => {
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
id: Number(object_to_edit?.id),
});
};
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {

View File

@ -11,7 +11,7 @@ import { handelImageState } from "../../../utils/DataToSendImageState";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => {
const { objectToEdit, setObjectToEdit } = useObjectToEdit(
const { object_to_edit, set_object_to_edit } = useObjectToEdit(
(state) => state,
);
const { isOpen, setIsOpen } = useModalState((state) => state);
@ -21,7 +21,7 @@ const ModalForm: React.FC = () => {
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
}
}, [isSuccess]);
@ -33,7 +33,7 @@ const ModalForm: React.FC = () => {
const handleCancel = () => {
setIsOpen("");
setObjectToEdit(null);
set_object_to_edit(null);
};
const [t] = useTranslation();
@ -49,7 +49,7 @@ const ModalForm: React.FC = () => {
>
<Formik
enableReinitialize
initialValues={getInitialValues(objectToEdit)}
initialValues={getInitialValues(object_to_edit)}
validationSchema={getValidationSchema}
onSubmit={handleSubmit}
>

View File

@ -1,4 +1,6 @@
import React from 'react'
import { hasAbility } from '../../../utils/hasAbility';
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from '../../../enums/abilities';
import { ModalEnum } from '../../../enums/Model';
import useModalHandler from '../../../utils/useModalHandler';
import { FaPlus } from 'react-icons/fa';
@ -10,11 +12,13 @@ import AddSubjectModalForm from "../Model/AddModel";
import EditSubjectModalForm from "../Model/EditModel";
import DeleteSubjectModalForm from "../Model/Delete";
import useSetPage_title from '../../../Hooks/useSetPageTitle';
import { canAddSubject } from '../../../utils/hasAbilityFn';
const TableWithHeader = () => {
const store_subject_ability = hasAbility(
ABILITIES_ENUM?.SUBJECT,
ABILITIES_VALUES_ENUM?.STORE,
);
const { handel_open_model } = useModalHandler();
const [t] = useTranslation();
@ -26,7 +30,7 @@ const TableWithHeader = () => {
<div className="TableWithHeader">
<header>
<h4 className="Bold Primary ">{t("models.subject")}</h4>
{canAddSubject && (
{store_subject_ability && (
<button
onClick={() => handel_open_model(ModalEnum?.SUBJECT_ADD)}
className="add_button"

View File

@ -15,20 +15,19 @@ import {
ABILITIES_VALUES_ENUM,
} from "../../../enums/abilities";
import { hasAbility } from "../../../utils/hasAbility";
import { canDeleteSubject, canEditSubject } from "../../../utils/hasAbilityFn";
export const useColumns = () => {
const navigate = useNavigate();
const { setObjectToEdit } = useObjectToEdit((state) => state);
const { set_object_to_edit } = useObjectToEdit((state) => state);
const { handel_open_model } = useModalHandler();
const handelDeleteSubject = (data: any) => {
setObjectToEdit(data);
set_object_to_edit(data);
handel_open_model(ModalEnum?.SUBJECT_DELETE);
};
const handleEdit = (record: any) => {
setObjectToEdit(record);
set_object_to_edit(record);
handel_open_model(ModalEnum?.SUBJECT_EDIT);
};
@ -84,11 +83,18 @@ export const useColumns = () => {
render: (text, record, index) => {
const className =
index % 2 === 0 ? "even-row buttonAction" : "odd-row buttonAction";
const edit_subject_ability = hasAbility(
ABILITIES_ENUM?.SUBJECT,
ABILITIES_VALUES_ENUM?.UPDATE,
);
const delete_subject_ability = hasAbility(
ABILITIES_ENUM?.SUBJECT,
ABILITIES_VALUES_ENUM?.DELETE,
);
return (
<Space size="middle" className={className}>
{canEditSubject && (
{edit_subject_ability && (
<Tooltip
placement="top"
title={t("practical.edit")}
@ -103,7 +109,7 @@ export const useColumns = () => {
</span>
</Tooltip>
)}
{canDeleteSubject && (
{delete_subject_ability && (
<RiDeleteBin6Fill
onClick={() => handelDeleteSubject(record)}
size={22}

View File

@ -12,11 +12,11 @@ const ModalForm: React.FC = () => {
const [inputValue, setInputValue] = useState("");
const { mutate, isSuccess, isLoading } = useDeleteUnit();
const { objectToEdit } = useObjectToEdit((state) => state);
const { object_to_edit } = useObjectToEdit((state) => state);
const [t] = useTranslation();
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
id: Number(object_to_edit?.id),
});
};
@ -51,7 +51,7 @@ const ModalForm: React.FC = () => {
>
<header>
{" "}
{t("practical.delete")} {objectToEdit?.name}{" "}
{t("practical.delete")} {object_to_edit?.name}{" "}
</header>
<main className="main_modal">
@ -74,9 +74,9 @@ const ModalForm: React.FC = () => {
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.name !== inputValue ? "disabled_button" : ""
object_to_edit?.name !== inputValue ? "disabled_button" : ""
}
disabled={objectToEdit?.name !== inputValue || isLoading}
disabled={object_to_edit?.name !== inputValue || isLoading}
// onClick={handleSubmit}
type="button"
>

View File

@ -14,9 +14,9 @@ const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useUpdateUnit();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
// console.log(objectToEdit,"objectToEdit");
// console.log(object_to_edit,"object_to_edit");
const { subject_id } = useParams();
useEffect(() => {
@ -50,7 +50,7 @@ const ModalForm: React.FC = () => {
>
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues(objectToEdit)}
initialValues={getInitialValues(object_to_edit)}
validationSchema={getValidationSchema}
>
<header>

View File

@ -20,17 +20,17 @@ import { useTranslation } from "react-i18next";
const genExtra = (
item: Unit,
setObjectToEdit: any,
set_object_to_edit: any,
handel_open_model: any,
t: any,
) => {
const handelDelete = (event: any, item: Unit) => {
handel_open_model(ModalEnum?.UNIT_DELETE);
setObjectToEdit(item);
set_object_to_edit(item);
};
const handleEdit = (event: any, item: Unit) => {
// console.log(item,"event");
setObjectToEdit(item);
set_object_to_edit(item);
handel_open_model(ModalEnum?.UNIT_EDIT);
};
@ -55,7 +55,7 @@ const genExtra = (
const App: React.FC = () => {
const { token } = theme.useToken();
const { handel_open_model } = useModalHandler();
const { setObjectToEdit } = useObjectToEdit();
const { set_object_to_edit } = useObjectToEdit();
const { subject_id } = useParams();
const panelStyle: React.CSSProperties = {
@ -78,7 +78,7 @@ const App: React.FC = () => {
label: item?.name,
children: <Lessons unit_id={item?.id} data={item?.lessons} />,
style: panelStyle,
extra: genExtra(item, setObjectToEdit, handel_open_model, t),
extra: genExtra(item, set_object_to_edit, handel_open_model, t),
})) || [];
// console.log(units,"units");

View File

@ -14,19 +14,19 @@ import { useTranslation } from "react-i18next";
const Lessons = ({ data, unit_id }: { data: Lesson[]; unit_id: number }) => {
const { handel_open_model } = useModalHandler();
const { setObjectToEdit } = useObjectToEdit();
const { set_object_to_edit } = useObjectToEdit();
const handelDelete = (item: Lesson) => {
handel_open_model(ModalEnum?.LESSON_DELETE);
setObjectToEdit(item);
set_object_to_edit(item);
};
const handleEdit = (item: Lesson) => {
// console.log(item,"event");
setObjectToEdit(item);
set_object_to_edit(item);
handel_open_model(ModalEnum?.LESSON_EDIT);
};
const handleAdd = () => {
setObjectToEdit({ unit_id: unit_id });
set_object_to_edit({ unit_id: unit_id });
handel_open_model(ModalEnum?.LESSON_ADD);
};
const [t] = useTranslation();

View File

@ -12,7 +12,7 @@ import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
const queryClient = useQueryClient();
@ -26,7 +26,7 @@ const ModalForm: React.FC = () => {
}, [setIsOpen, isSuccess, queryClient]);
const handleSubmit = (values: any) => {
mutate({ ...values, unit_id: objectToEdit?.unit_id });
mutate({ ...values, unit_id: object_to_edit?.unit_id });
};
const handleCancel = () => {

View File

@ -12,12 +12,12 @@ const ModalForm: React.FC = () => {
const [inputValue, setInputValue] = useState("");
const { mutate, isSuccess, isLoading } = useDeleteLesson();
const { objectToEdit } = useObjectToEdit((state) => state);
const { object_to_edit } = useObjectToEdit((state) => state);
const queryClient = useQueryClient();
const [t] = useTranslation();
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
id: Number(object_to_edit?.id),
});
};
useEffect(() => {
@ -32,7 +32,7 @@ const ModalForm: React.FC = () => {
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
set_object_to_edit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@ -51,7 +51,7 @@ const ModalForm: React.FC = () => {
>
<header>
{" "}
{t("practical.delete")} {objectToEdit?.name}{" "}
{t("practical.delete")} {object_to_edit?.name}{" "}
</header>
<main className="main_modal">
@ -74,9 +74,9 @@ const ModalForm: React.FC = () => {
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.name !== inputValue ? "disabled_button" : ""
object_to_edit?.name !== inputValue ? "disabled_button" : ""
}
disabled={objectToEdit?.name !== inputValue || isLoading}
disabled={object_to_edit?.name !== inputValue || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}

View File

@ -14,11 +14,11 @@ const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useUpdateLesson();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const { object_to_edit, set_object_to_edit } = useObjectToEdit();
const queryClient = useQueryClient();
// console.log(objectToEdit,"objectToEdit");
// console.log(object_to_edit,"object_to_edit");
useEffect(() => {
if (isSuccess) {
@ -53,7 +53,7 @@ const ModalForm: React.FC = () => {
>
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues(objectToEdit)}
initialValues={getInitialValues(object_to_edit)}
validationSchema={getValidationSchema}
>
<header>

View File

@ -100,7 +100,7 @@ export const CrudRoute: TCrudRoute[] = [
path: `/${ABILITIES_ENUM?.SUBJECT}/:${ParamsEnum?.SUBJECT_ID}/${ABILITIES_ENUM?.UNIT}/:${ParamsEnum?.UNIT_ID}/${ABILITIES_ENUM?.LESSON}/:${ParamsEnum?.LESSON_ID}/${ABILITIES_ENUM?.QUESTION}/add`,
abilities: ABILITIES_ENUM?.QUESTION,
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 2,
prevPath: 0,
},
{
header: "page_header.edit_Question",
@ -108,7 +108,7 @@ export const CrudRoute: TCrudRoute[] = [
path: `/${ABILITIES_ENUM?.SUBJECT}/:${ParamsEnum?.SUBJECT_ID}/${ABILITIES_ENUM?.UNIT}/:${ParamsEnum?.UNIT_ID}/${ABILITIES_ENUM?.LESSON}/:${ParamsEnum?.LESSON_ID}/${ABILITIES_ENUM?.QUESTION}/:${ParamsEnum?.QUESTION_ID}`,
abilities: ABILITIES_ENUM?.QUESTION,
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 2,
prevPath: 0,
},
];

View File

@ -15,7 +15,7 @@
margin-inline: auto;
height: 60%;
content: "";
background: url("../../../public/Layout/BackgroundHeader.webp");
background: url("../../../public/Layout/auth_bg.png");
background-size: cover;
background-repeat: no-repeat;
z-index: 1;

View File

@ -23,7 +23,7 @@
background-repeat: no-repeat;
background-size: cover;
background-image: url("../../../public/Layout/BackgroundHeader.webp");
background-image: url("../../../public/Layout/Background_Header.svg");
}
}

View File

@ -3,7 +3,7 @@
export const BaseURL = "https://exercise-automation.point-dev.net/api/";
// export const ImageBaseURL = "http://192.168.1.9:8000/";
export const ImageBaseURL = "http://192.168.1.9:8000/";
export const ImageBaseURL = "https://exercise-automation.point-dev.net/";
// export const ImageBaseURL = "https://school-back-dev.point-dev.net/";
export const HEADER_KEY = "X-Custom-Query-Key";

View File

@ -20,11 +20,11 @@ function useGetQuery(
const { page, per_page } = PaginationParams(location);
const paramToSend = pagination
const param_to_send = pagination
? { ...remainingParams, page: page, per_page: per_page }
: { ...remainingParams };
const filteredParams = filterParams(paramToSend);
const filteredParams = filterParams(param_to_send);
return useQuery(
[KEY, filteredParams, show],

View File

@ -0,0 +1,7 @@
import React from "react";
const Course = () => {
return <div></div>;
};
export default Course;

View File

@ -1,521 +0,0 @@
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../enums/abilities";
import { hasAbility } from "./hasAbility";
///// EduClass
export const canAddEduClass = hasAbility(
ABILITIES_ENUM.EDUCATION_CLASS,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditEduClass = hasAbility(
ABILITIES_ENUM.EDUCATION_CLASS,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteEduClass = hasAbility(
ABILITIES_ENUM.EDUCATION_CLASS,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowEduClass = hasAbility(
ABILITIES_ENUM.EDUCATION_CLASS,
ABILITIES_VALUES_ENUM.SHOW,
);
export const canIndexEduClass = hasAbility(
ABILITIES_ENUM.EDUCATION_CLASS,
ABILITIES_VALUES_ENUM.INDEX,
);
///// Course
export const canAddCourse = hasAbility(
ABILITIES_ENUM.COURSE,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditCourse = hasAbility(
ABILITIES_ENUM.COURSE,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteCourse = hasAbility(
ABILITIES_ENUM.COURSE,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowCourse = hasAbility(
ABILITIES_ENUM.COURSE,
ABILITIES_VALUES_ENUM.SHOW,
);
export const canIndexCourse = hasAbility(
ABILITIES_ENUM.COURSE,
ABILITIES_VALUES_ENUM.INDEX,
);
///// session
export const canAddSession = hasAbility(
ABILITIES_ENUM.SESSION,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditSession = hasAbility(
ABILITIES_ENUM.SESSION,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteSession = hasAbility(
ABILITIES_ENUM.SESSION,
ABILITIES_VALUES_ENUM.DELETE,
);
//// teacher
export const canEditTeacher = hasAbility(
ABILITIES_ENUM.TEACHER,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteTeacher = hasAbility(
ABILITIES_ENUM.TEACHER,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canAddTeacher = hasAbility(
ABILITIES_ENUM.TEACHER,
ABILITIES_VALUES_ENUM.STORE,
);
//// unit
export const canAddUnit = hasAbility(
ABILITIES_ENUM.UNIT,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditUnit = hasAbility(
ABILITIES_ENUM.UNIT,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteUnit = hasAbility(
ABILITIES_ENUM.UNIT,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowUnit = hasAbility(
ABILITIES_ENUM.UNIT,
ABILITIES_VALUES_ENUM.SHOW,
);
/// subject
export const canAddSubject = hasAbility(
ABILITIES_ENUM.SUBJECT,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditSubject = hasAbility(
ABILITIES_ENUM.SUBJECT,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteSubject = hasAbility(
ABILITIES_ENUM.SUBJECT,
ABILITIES_VALUES_ENUM.DELETE,
);
/// Role
export const canAddRole = hasAbility(
ABILITIES_ENUM.ROLE,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditRole = hasAbility(
ABILITIES_ENUM.ROLE,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteRole = hasAbility(
ABILITIES_ENUM.ROLE,
ABILITIES_VALUES_ENUM.DELETE,
);
/// Payment
export const canIndexPayment = hasAbility(
ABILITIES_ENUM.PAYMENT,
ABILITIES_VALUES_ENUM.INDEX,
);
export const canAddPayment = hasAbility(
ABILITIES_ENUM.PAYMENT,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditPayment = hasAbility(
ABILITIES_ENUM.PAYMENT,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeletePayment = hasAbility(
ABILITIES_ENUM.PAYMENT,
ABILITIES_VALUES_ENUM.DELETE,
);
/// Lesson
export const canAddLesson = hasAbility(
ABILITIES_ENUM.LESSON,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditLesson = hasAbility(
ABILITIES_ENUM.LESSON,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteLesson = hasAbility(
ABILITIES_ENUM.LESSON,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowLesson = hasAbility(
ABILITIES_ENUM.LESSON,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Exercise
export const canAddExercise = hasAbility(
ABILITIES_ENUM.EXERCISE,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditExercise = hasAbility(
ABILITIES_ENUM.EXERCISE,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteExercise = hasAbility(
ABILITIES_ENUM.EXERCISE,
ABILITIES_VALUES_ENUM.DELETE,
);
/// Cycle
export const canAddCycle = hasAbility(
ABILITIES_ENUM.CYCLE,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditCycle = hasAbility(
ABILITIES_ENUM.CYCLE,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteCycle = hasAbility(
ABILITIES_ENUM.CYCLE,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowCycle = hasAbility(
ABILITIES_ENUM.CYCLE,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Admin
export const canAddAdmin = hasAbility(
ABILITIES_ENUM.ADMIN,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditAdmin = hasAbility(
ABILITIES_ENUM.ADMIN,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteAdmin = hasAbility(
ABILITIES_ENUM.ADMIN,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowAdmin = hasAbility(
ABILITIES_ENUM.ADMIN,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Term
export const canAddTerm = hasAbility(
ABILITIES_ENUM.TERM,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditTerm = hasAbility(
ABILITIES_ENUM.TERM,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteTerm = hasAbility(
ABILITIES_ENUM.TERM,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowTerm = hasAbility(
ABILITIES_ENUM.TERM,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Student
export const canAddStudent = hasAbility(
ABILITIES_ENUM.STUDENT,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditStudent = hasAbility(
ABILITIES_ENUM.STUDENT,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteStudent = hasAbility(
ABILITIES_ENUM.STUDENT,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowStudent = hasAbility(
ABILITIES_ENUM.STUDENT,
ABILITIES_VALUES_ENUM.SHOW,
);
export const canImportStudent = hasAbility(
ABILITIES_ENUM.STUDENT,
ABILITIES_VALUES_ENUM.IMPORT_STUDENTS,
);
export const canMoveStudent = hasAbility(
ABILITIES_ENUM.STUDENT,
ABILITIES_VALUES_ENUM.MOVE_STUDENTS,
);
/// EarlyDeparture
export const canAddEarlyDeparture = hasAbility(
ABILITIES_ENUM.EARLY_DEPARTURE,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditEarlyDeparture = hasAbility(
ABILITIES_ENUM.EARLY_DEPARTURE,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteEarlyDeparture = hasAbility(
ABILITIES_ENUM.EARLY_DEPARTURE,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowEarlyDeparture = hasAbility(
ABILITIES_ENUM.EARLY_DEPARTURE,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Exam
export const canAddExam = hasAbility(
ABILITIES_ENUM.EXAM,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditExam = hasAbility(
ABILITIES_ENUM.EXAM,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteExam = hasAbility(
ABILITIES_ENUM.EXAM,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowExam = hasAbility(
ABILITIES_ENUM.EXAM,
ABILITIES_VALUES_ENUM.SHOW,
);
/// HomeWork
export const canAddHomeWork = hasAbility(
ABILITIES_ENUM.HOMEWORK,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditHomeWork = hasAbility(
ABILITIES_ENUM.HOMEWORK,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteHomeWork = hasAbility(
ABILITIES_ENUM.HOMEWORK,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowHomeWork = hasAbility(
ABILITIES_ENUM.HOMEWORK,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Mark
export const canAddMark = hasAbility(
ABILITIES_ENUM.MARK,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditMark = hasAbility(
ABILITIES_ENUM.MARK,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteMark = hasAbility(
ABILITIES_ENUM.MARK,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowMark = hasAbility(
ABILITIES_ENUM.MARK,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Note
export const canAddNote = hasAbility(
ABILITIES_ENUM.NOTE,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditNote = hasAbility(
ABILITIES_ENUM.NOTE,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteNote = hasAbility(
ABILITIES_ENUM.NOTE,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowNote = hasAbility(
ABILITIES_ENUM.NOTE,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Absence
export const canAddAbsence = hasAbility(
ABILITIES_ENUM.ABSENCE,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditAbsence = hasAbility(
ABILITIES_ENUM.ABSENCE,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteAbsence = hasAbility(
ABILITIES_ENUM.ABSENCE,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowAbsence = hasAbility(
ABILITIES_ENUM.ABSENCE,
ABILITIES_VALUES_ENUM.SHOW,
);
/// SessionContent
export const canAddSessionContent = hasAbility(
ABILITIES_ENUM.SESSION_CONTENT,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditSessionContent = hasAbility(
ABILITIES_ENUM.SESSION_CONTENT,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteSessionContent = hasAbility(
ABILITIES_ENUM.SESSION_CONTENT,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowSessionContent = hasAbility(
ABILITIES_ENUM.SESSION_CONTENT,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Branch
export const canAddBranch = hasAbility(
ABILITIES_ENUM.BRANCH,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditBranch = hasAbility(
ABILITIES_ENUM.BRANCH,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteBranch = hasAbility(
ABILITIES_ENUM.BRANCH,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowBranch = hasAbility(
ABILITIES_ENUM.BRANCH,
ABILITIES_VALUES_ENUM.SHOW,
);
/// status
export const canIndexStatus =
hasAbility(ABILITIES_ENUM.EARLY_DEPARTURE, ABILITIES_VALUES_ENUM.INDEX) &&
hasAbility(ABILITIES_ENUM.ABSENCE, ABILITIES_VALUES_ENUM.INDEX) &&
hasAbility(ABILITIES_ENUM.LATE_ARRIVAL, ABILITIES_VALUES_ENUM.INDEX) &&
hasAbility(ABILITIES_ENUM.PRESENCE, ABILITIES_VALUES_ENUM.INDEX);
export const canUpdateStatus =
hasAbility(ABILITIES_ENUM.EARLY_DEPARTURE, ABILITIES_VALUES_ENUM.UPDATE) &&
hasAbility(ABILITIES_ENUM.ABSENCE, ABILITIES_VALUES_ENUM.UPDATE) &&
hasAbility(ABILITIES_ENUM.LATE_ARRIVAL, ABILITIES_VALUES_ENUM.UPDATE);
export const canAddStatus =
hasAbility(ABILITIES_ENUM.EARLY_DEPARTURE, ABILITIES_VALUES_ENUM.STORE) &&
hasAbility(ABILITIES_ENUM.ABSENCE, ABILITIES_VALUES_ENUM.STORE) &&
hasAbility(ABILITIES_ENUM.LATE_ARRIVAL, ABILITIES_VALUES_ENUM.STORE);
/// notification
export const canAddNotification = hasAbility(
ABILITIES_ENUM.NOTE,
ABILITIES_VALUES_ENUM.STORE,
);
/// MarksReport
export const canAddMarksReport = hasAbility(
ABILITIES_ENUM.MARK,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditMarksReport = hasAbility(
ABILITIES_ENUM.MARK,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteMarksReport = hasAbility(
ABILITIES_ENUM.MARK,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowMarksReport = hasAbility(
ABILITIES_ENUM.MARK,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Tags
export const canAddTags = hasAbility(
ABILITIES_ENUM.TAG,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditTags = hasAbility(
ABILITIES_ENUM.TAG,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteTags = hasAbility(
ABILITIES_ENUM.TAG,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowTags = hasAbility(
ABILITIES_ENUM.TAG,
ABILITIES_VALUES_ENUM.SHOW,
);
/// Question
export const canAddQuestion = hasAbility(
ABILITIES_ENUM.QUESTION,
ABILITIES_VALUES_ENUM.STORE,
);
export const canEditQuestion = hasAbility(
ABILITIES_ENUM.QUESTION,
ABILITIES_VALUES_ENUM.UPDATE,
);
export const canDeleteQuestion = hasAbility(
ABILITIES_ENUM.QUESTION,
ABILITIES_VALUES_ENUM.DELETE,
);
export const canShowQuestion = hasAbility(
ABILITIES_ENUM.QUESTION,
ABILITIES_VALUES_ENUM.SHOW,
);

View File

@ -1,48 +1,56 @@
import { create } from "zustand";
interface ModelState {
objectToEdit: any;
setObjectToEdit: (data: any) => void;
paramToSend: any;
setParamToSend: (data: any) => void;
TagsSearch: any;
setTagsSearch: (data: any) => void;
TagsQuery: any;
setTagsQuery: (data: any) => void;
object_to_edit: any;
set_object_to_edit: (data: any) => void;
old_object_to_edit: any;
set_old_object_to_edit: (data: any) => void;
object_ids: any;
set_object_ids: (data: any) => void;
param_to_send: any;
set_param_to_send: (data: any) => void;
Tags_search: any;
set_Tags_search: (data: any) => void;
Tags_query: any;
set_Tags_query: (data: any) => void;
currentTag: any;
setCurrentTag: (data: any) => void;
currentParentIndex: any;
setCurrentParentIndex: (data: any) => void;
set_currentTag: (data: any) => void;
current_parent_index: any;
set_current_parent_index: (data: any) => void;
isBseQuestion: boolean;
setIsBseQuestion: (data: any) => void;
set_isBseQuestion: (data: any) => void;
Success: boolean;
setSuccess: (data: any) => void;
set_Success: (data: any) => void;
DeletedQuestions: any;
setDeletedQuestions: (data: any) => void;
set_DeletedQuestions: (data: any) => void;
SavedQuestionData: any;
setSavedQuestionData: (data: any) => void;
set_SavedQuestionData: (data: any) => void;
}
export const useObjectToEdit = create<ModelState>((set) => ({
objectToEdit: null,
setObjectToEdit: (data) => set(() => ({ objectToEdit: data })),
paramToSend: {},
setParamToSend: (data) => set(() => ({ paramToSend: data })),
TagsSearch: null,
setTagsSearch: (data) => set(() => ({ TagsSearch: data })),
TagsQuery: null,
setTagsQuery: (data) => set(() => ({ TagsQuery: data })),
object_to_edit: null,
set_object_to_edit: (data) => set(() => ({ object_to_edit: data })),
old_object_to_edit: null,
set_old_object_to_edit: (data) => set(() => ({ old_object_to_edit: data })),
object_ids: [],
set_object_ids: (data) => set(() => ({ object_ids: data })),
param_to_send: {},
set_param_to_send: (data) => set(() => ({ param_to_send: data })),
Tags_search: null,
set_Tags_search: (data) => set(() => ({ Tags_search: data })),
Tags_query: null,
set_Tags_query: (data) => set(() => ({ Tags_query: data })),
currentTag: null,
setCurrentTag: (data) => set(() => ({ currentTag: data })),
currentParentIndex: null,
setCurrentParentIndex: (data) => set(() => ({ currentParentIndex: data })),
set_currentTag: (data) => set(() => ({ currentTag: data })),
current_parent_index: null,
set_current_parent_index: (data) => set(() => ({ current_parent_index: data })),
isBseQuestion: false,
setIsBseQuestion: (data) => set(() => ({ isBseQuestion: data })),
set_isBseQuestion: (data) => set(() => ({ isBseQuestion: data })),
Success: false,
setSuccess: (data) => set(() => ({ Success: data })),
set_Success: (data) => set(() => ({ Success: data })),
DeletedQuestions: [],
setDeletedQuestions: (data) => set(() => ({ DeletedQuestions: data })),
set_DeletedQuestions: (data) => set(() => ({ DeletedQuestions: data })),
SavedQuestionData: [],
setSavedQuestionData: (data) => set(() => ({ SavedQuestionData: data })),
set_SavedQuestionData: (data) => set(() => ({ SavedQuestionData: data })),
}));