This commit is contained in:
Moaz Dawalibi 2024-08-12 15:55:01 +03:00
parent 3d5060aa71
commit 5a295693c1
41 changed files with 318 additions and 1594 deletions

View File

@ -1,22 +1,20 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Input, Modal, Spin } from "antd"; import { Input, Modal, Spin } from "antd";
import { useModalState } from "../../zustand/Modal"; import { useModalState } from "../../zustand/Modal";
import { ModalEnum } from "../../enums/Model";
import { useObjectToEdit } from "../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useNavigate } from "react-router-dom";
interface ModalFormProps { interface ModalFormProps {
modalType: ModalEnum;
objectType: string;
deleteMutation: any; deleteMutation: any;
objectValue: string; ModelEnum: any;
isNavigate?: boolean;
} }
const DeleteModels: React.FC<ModalFormProps> = ({ const DeleteModels: React.FC<ModalFormProps> = ({
modalType,
objectType,
deleteMutation, deleteMutation,
objectValue, ModelEnum,
isNavigate = false,
}) => { }) => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { isOpen, setIsOpen } = useModalState((state) => state);
const [inputValue, setInputValue] = useState(""); const [inputValue, setInputValue] = useState("");
@ -24,10 +22,16 @@ const DeleteModels: React.FC<ModalFormProps> = ({
const { mutate, isLoading, isSuccess } = deleteMutation; const { mutate, isLoading, isSuccess } = deleteMutation;
const { objectToEdit, setObjectToEdit } = useObjectToEdit(); const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const iaDisabled =
Number(objectToEdit?.id) !== Number(inputValue) || isLoading;
const navigate = useNavigate();
useEffect(() => { useEffect(() => {
if (isSuccess) { if (isSuccess) {
setIsOpen(""); setIsOpen("");
setInputValue(""); setInputValue("");
if (isNavigate) {
navigate(-1);
}
} }
}, [isSuccess, setIsOpen]); }, [isSuccess, setIsOpen]);
@ -48,7 +52,7 @@ const DeleteModels: React.FC<ModalFormProps> = ({
}; };
const handleKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => { const handleKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === "Enter" && objectToEdit?.[objectValue] === inputValue) { if (e.key === "Enter" && !iaDisabled) {
handleSubmit(); handleSubmit();
} }
}; };
@ -60,24 +64,22 @@ const DeleteModels: React.FC<ModalFormProps> = ({
centered centered
width={"40vw"} width={"40vw"}
footer={null} footer={null}
open={isOpen === modalType} open={isOpen === ModelEnum}
onCancel={handleCancel} onCancel={handleCancel}
> >
<header> <header>{t("practical.delete_this_item")}</header>
{t("practical.delete")} {t(`models.${objectType}`)}
</header>
<main className="main_modal"> <main className="main_modal">
<div className="ValidationField w-100 mb-5"> <div className="ValidationField w-100 mb-5">
<label className="text "> <label className="text ">
{t("practical.to_confirm_deletion_please_re_enter")}{" "} {t("practical.to_confirm_deletion_please_re_enter_id")} ({" "}
{t(`input.${objectValue}`)} ({objectToEdit?.[objectValue]}) {objectToEdit?.id} )
</label> </label>
<Input <Input
size="large" size="large"
type="text" type="text"
placeholder={`${t("practical.enter")} ${t(`input.${objectValue}`)} `} placeholder={`${t("practical.enter")} ${t(`input.id`)} `}
value={inputValue} value={inputValue}
onChange={handleChange} onChange={handleChange}
onKeyDown={handleKeyPress} onKeyDown={handleKeyPress}
@ -87,12 +89,8 @@ const DeleteModels: React.FC<ModalFormProps> = ({
<div className="buttons"> <div className="buttons">
<div onClick={handleCancel}>{t("practical.cancel")}</div> <div onClick={handleCancel}>{t("practical.cancel")}</div>
<button <button
className={ className={iaDisabled ? "disabled_button" : ""}
objectToEdit?.[objectValue] !== inputValue disabled={iaDisabled}
? "disabled_button"
: ""
}
disabled={objectToEdit?.[objectValue] !== inputValue || isLoading}
onClick={handleSubmit} onClick={handleSubmit}
type="button" type="button"
> >

View File

@ -1,35 +0,0 @@
import { Col, Row } from "reactstrap";
import ValidationField from "../../../Components/ValidationField/ValidationField";
import { useFormikContext } from "formik";
import { useModalState } from "../../../zustand/Modal";
import { useEffect } from "react";
import DynamicTags from "../synonyms/DynamicTags";
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" />
</Col>
<div>
<DynamicTags/>
</div>
</Row>
);
};
export default Form;

View File

@ -1,66 +1,31 @@
import React, { useEffect } from "react"; import React 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 { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import LayoutModel from "../../../Layout/Dashboard/LayoutModel";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
import { useAddTag } from "../../../api/tags"; import { useAddTag } from "../../../api/tags";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import ModelForm from "./ModelForm";
import { useTranslation } from "react-i18next";
import ModelButtons from "../../../Components/models/ModelButtons";
const ModalForm: React.FC = () => { const AddModel: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { mutate, status } = useAddTag();
const { mutate, isSuccess, isLoading } = useAddTag();
const { setObjectToEdit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("isSuccess");
setObjectToEdit({});
}
}, [setIsOpen, isSuccess]);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
mutate({ ...values });
mutate({
...values
});
}; };
const handleCancel = () => {
setIsOpen("");
setObjectToEdit({});
};
const [t] = useTranslation();
return ( return (
<> <>
<Modal <LayoutModel
className="ModalForm" status={status as QueryStatusEnum}
centered ModelEnum={ModalEnum.TAGS_ADD}
width={"60vw"} modelTitle="tags"
footer={null} handleSubmit={handleSubmit}
open={isOpen === ModalEnum?.TAGS_ADD} getInitialValues={getInitialValues({})}
onCancel={handleCancel} getValidationSchema={getValidationSchema}
> >
<FormikForm <ModelForm />
handleSubmit={handleSubmit} </LayoutModel>
initialValues={getInitialValues([])}
validationSchema={getValidationSchema}
>
<header>
{t("practical.add")} {t("models.tags")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<ModelButtons isLoading={isLoading} />
</main>
</FormikForm>
</Modal>
</> </>
); );
}; };
export default ModalForm; export default AddModel;

View File

@ -1,94 +0,0 @@
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 { useDeleteTag } from "../../../api/tags";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const [inputValue, setInputValue] = useState("");
const { mutate, isLoading, isSuccess } = useDeleteTag();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setInputValue("");
}
}, [isSuccess, setIsOpen]);
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
});
};
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
};
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?.TAGS_DELETE}
onCancel={handleCancel}
>
<header>
{t("practical.delete")} ({objectToEdit?.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.tags")}
</label>
<Input
size="large"
type="text"
placeholder={`${t("practical.enter")} ${t("input.name")} ${t("models.tags")} `}
value={inputValue}
onChange={handleChange}
/>
</div>
<div className="buttons">
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.name !== inputValue ? "disabled_button" : ""
}
disabled={objectToEdit?.name !== inputValue || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</Modal>
</>
);
};
export default ModalForm;

View File

@ -1,24 +0,0 @@
import { Col, Row } from "reactstrap";
import ValidationField from "../../../Components/ValidationField/ValidationField";
import { useFormikContext } from "formik";
import { useModalState } from "../../../zustand/Modal";
import { useEffect } from "react";
import DynamicTags from "../synonyms/DynamicTags";
const Form = () => {
return (
<Row className="w-100">
<Col>
<ValidationField placeholder="name" label="name" name="name" />
</Col>
<div>
<DynamicTags/>
</div>
</Row>
);
};
export default Form;

View File

@ -1,69 +1,36 @@
import React, { useEffect } from "react"; import React 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 { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import LayoutModel from "../../../Layout/Dashboard/LayoutModel";
import ModelForm from "./ModelForm";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useUpdateTag } from "../../../api/tags"; import { useUpdateTag } from "../../../api/tags";
import { useTranslation } from "react-i18next";
import ModelButtons from "../../../Components/models/ModelButtons";
const ModalForm: React.FC = () => { const EditModel: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { mutate, status } = useUpdateTag();
const { objectToEdit, setObjectToEdit } = useObjectToEdit( const { objectToEdit } = useObjectToEdit((state) => state);
(state) => state,
);
const { mutate, isSuccess, isLoading } = useUpdateTag();
// console.log(objectToEdit,"objectToEdit");
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
// const contactInformationJson = JSON.stringify({
// phone_number: values?.number
// });
mutate({ mutate({
...values ...values
}); });
}; };
const handleCancel = () => {
setIsOpen("");
setObjectToEdit({});
};
useEffect(() => {
if (isSuccess) {
setIsOpen("");
}
}, [setIsOpen, isSuccess]);
const [t] = useTranslation();
return ( return (
<Modal <>
className="ModalForm" <LayoutModel
centered status={status as QueryStatusEnum}
width={"60vw"} ModelEnum={ModalEnum.TAGS_EDIT}
footer={null} modelTitle="tags_details"
open={isOpen === ModalEnum?.TAGS_EDIT} handleSubmit={handleSubmit}
onCancel={handleCancel} getInitialValues={getInitialValues(objectToEdit)}
> getValidationSchema={getValidationSchema}
{objectToEdit && ( isAddModal={false}
<FormikForm >
handleSubmit={handleSubmit} <ModelForm />
initialValues={getInitialValues(objectToEdit)} </LayoutModel>
validationSchema={getValidationSchema} </>
>
<header>
{" "}
{t("practical.edit")} {t("practical.details")} {t("models.tags")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<ModelButtons isLoading={isLoading} />
</main>
</FormikForm>
)}
</Modal>
); );
}; };
export default ModalForm; export default EditModel;

View File

@ -1,18 +1,16 @@
import { FaPlus } from "react-icons/fa"; import { FaPlus } from "react-icons/fa";
import useModalHandler from "../../utils/useModalHandler"; import useModalHandler from "../../utils/useModalHandler";
import { ModalEnum } from "../../enums/Model"; import { ModalEnum } from "../../enums/Model";
// import useSetPageTitle from "../../Hooks/useSetPageTitle";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { lazy, Suspense } from 'react'; import { lazy, Suspense } from 'react';
import { Spin } from "antd"; import { Spin } from "antd";
import { canAddTags } from "../../utils/hasAbilityFn"; import { canAddTags } from "../../utils/hasAbilityFn";
import useSetPageTitle from "../../Hooks/useSetPageTitle"; import useSetPageTitle from "../../Hooks/useSetPageTitle";
import { useDeleteTag } from "../../api/tags";
const Table = lazy(() => import('./Table')); const Table = lazy(() => import('./Table'));
const AddModalForm = lazy(() => import('./Model/AddModel')); const AddModalForm = lazy(() => import('./Model/AddModel'));
const EditModalForm = lazy(() => import('./Model/EditModel')); const EditModalForm = lazy(() => import('./Model/EditModel'));
const DeleteModalForm = lazy(() => import('./Model/Delete')); const DeleteModels = lazy(() => import('../../Layout/Dashboard/DeleteModels'));
const SearchField = lazy(() => import('../../Components/DataTable/SearchField')); const SearchField = lazy(() => import('../../Components/DataTable/SearchField'));
@ -22,6 +20,7 @@ const TableHeader = () => {
useSetPageTitle( useSetPageTitle(
t(`page_header.tags`), t(`page_header.tags`),
); );
const deleteMutation = useDeleteTag();
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">
@ -44,7 +43,10 @@ const TableHeader = () => {
<Table /> <Table />
<DeleteModalForm /> <DeleteModels
deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.TAGS_DELETE}
/>
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />
</Suspense> </Suspense>

View File

@ -1,25 +1,26 @@
import { Space, TableColumnsType, Tooltip } from "antd"; import { TableColumnsType } from "antd";
import { tags } from "../../types/Item"; import { tags } from "../../types/Item";
import { ModalEnum } from "../../enums/Model"; import { ModalEnum } from "../../enums/Model";
import { MdOutlineEdit } from "react-icons/md";
import { RiDeleteBin6Fill } from "react-icons/ri";
import { useObjectToEdit } from "../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { useModalState } from "../../zustand/Modal"; import { useModalState } from "../../zustand/Modal";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { canDeleteTags, canEditTags } from "../../utils/hasAbilityFn"; import { canDeleteTags, canEditTags } from "../../utils/hasAbilityFn";
import ActionButtons from "../../Components/Table/ActionButtons";
export const useColumns = () => { export const useColumns = () => {
const [t] = useTranslation();
const { setIsOpen } = useModalState((state) => state); const { setIsOpen } = useModalState((state) => state);
const { setObjectToEdit } = useObjectToEdit((state) => state); const { setObjectToEdit } = useObjectToEdit((state) => state);
const handelDelete = (record: any) => { const handelDelete = (record:any) => {
setObjectToEdit(record); setObjectToEdit(record);
setIsOpen(ModalEnum?.TAGS_DELETE); setIsOpen(ModalEnum?.TAGS_DELETE);
}; };
const [t] = useTranslation(); const handleEdit = (record:any) => {
setObjectToEdit(record);
setIsOpen(ModalEnum?.TAGS_EDIT);
};
const columns: TableColumnsType<tags> = [ const columns: TableColumnsType<tags> = [
{ {
@ -40,44 +41,15 @@ export const useColumns = () => {
key: "actions", key: "actions",
align: "end", align: "end",
width: "25vw", width: "25vw",
render: (text, record, index) => { render: (_text, record, index) => {
const handleEdit = (record: any) => {
// console.log(record,"record");
setObjectToEdit(record);
setIsOpen(ModalEnum?.TAGS_EDIT);
};
const className =
index % 2 === 0 ? "even-row buttonAction" : "odd-row buttonAction";
return ( return (
<Space size="middle" className={className}> <ActionButtons
{canEditTags && ( canDelete={canEditTags}
<Tooltip canEdit={canDeleteTags}
placement="top" index={index}
title={t("practical.edit")} onDelete={() => handelDelete(record)}
color="#E0E0E0" onEdit={() => handleEdit(record)}
/>
>
<span onClick={() => handleEdit(record)}>
<MdOutlineEdit
size={22}
style={{ color: "#A098AE" }}
/>
</span>
</Tooltip>
)}
{canDeleteTags && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}
style={{ color: "#C11313" }}
/>
)}
</Space>
); );
}, },
}, },

View File

@ -1,76 +1,36 @@
import React, { useEffect } from "react"; import React from "react";
import { Modal, Spin } from "antd";
import { useModalState } from "../../../zustand/Modal";
import FormikForm from "../../../Layout/Dashboard/FormikFormModel";
import ModelBody from "./AddUnit";
import { getInitialValues, getValidationSchema } from "./formUtil"; import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import LayoutModel from "../../../Layout/Dashboard/LayoutModel";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
import ModelForm from "./ModelForm";
import { useAddUnit } from "../../../api/unit"; import { useAddUnit } from "../../../api/unit";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => { const AddModel: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { mutate, status } = useAddUnit();
const { mutate, isSuccess, isLoading } = useAddUnit();
const { subject_id } = useParams(); const { subject_id } = useParams();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
}
}, [setIsOpen, isSuccess]);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
// console.log(values,"values");
mutate({ mutate({
...values, ...values,
subject_id: subject_id, subject_id: subject_id,
}); });
}; };
const handleCancel = () => {
setIsOpen("");
};
const [t] = useTranslation();
return ( return (
<> <>
<Modal <LayoutModel
className="ModalForm" status={status as QueryStatusEnum}
centered ModelEnum={ModalEnum.UNIT_ADD}
width={"40vw"} modelTitle="unit"
footer={null} handleSubmit={handleSubmit}
open={isOpen === ModalEnum?.UNIT_ADD} getInitialValues={getInitialValues({})}
onCancel={handleCancel} getValidationSchema={getValidationSchema}
> >
<FormikForm <ModelForm />
handleSubmit={handleSubmit} </LayoutModel>
initialValues={getInitialValues([])}
validationSchema={getValidationSchema}
>
<header>
{" "}
{t("practical.add")} {t("models.unit")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<div className="buttons">
<div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} type="submit">
{t("practical.add")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</FormikForm>
</Modal>
</> </>
); );
}; };
export default ModalForm; export default AddModel;

View File

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

View File

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

View File

@ -1,82 +1,42 @@
import React, { useEffect } from "react"; import React from "react";
import { Modal, Spin } from "antd";
import { useModalState } from "../../../zustand/Modal";
import FormikForm from "../../../Layout/Dashboard/FormikFormModel";
import ModelBody from "./AddUnit";
import { getInitialValues, getValidationSchema } from "./formUtil"; import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import { useUpdateUnit } from "../../../api/unit"; import LayoutModel from "../../../Layout/Dashboard/LayoutModel";
import ModelForm from "./ModelForm";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useUpdateTag } from "../../../api/tags";
import { useUpdateUnit } from "../../../api/unit";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => { const EditModel: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { mutate, status } = useUpdateUnit();
const { objectToEdit } = useObjectToEdit((state) => state);
const { mutate, isSuccess, isLoading } = useUpdateUnit();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
// console.log(objectToEdit,"objectToEdit");
const { subject_id } = useParams(); const { subject_id } = useParams();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
}
}, [setIsOpen, isSuccess]);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
// console.log(values,"values");
mutate({ mutate({
...values, ...values,
subject_id: subject_id, subject_id: subject_id,
}); });
}; };
const handleCancel = () => {
setIsOpen("");
};
const [t] = useTranslation();
return ( return (
<> <>
<Modal <LayoutModel
className="ModalForm" status={status as QueryStatusEnum}
centered ModelEnum={ModalEnum.UNIT_EDIT}
width={"40vw"} modelTitle="unit"
footer={null} handleSubmit={handleSubmit}
open={isOpen === ModalEnum?.UNIT_EDIT} getInitialValues={getInitialValues(objectToEdit)}
onCancel={handleCancel} getValidationSchema={getValidationSchema}
isAddModal={false}
> >
<FormikForm <ModelForm />
handleSubmit={handleSubmit} </LayoutModel>
initialValues={getInitialValues(objectToEdit)}
validationSchema={getValidationSchema}
>
<header>
{" "}
{t("practical.edit")}
{t("models.unit")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<div className="buttons">
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button disabled={isLoading} type="submit">
{t("practical.edit")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</FormikForm>
</Modal>
</> </>
); );
}; };
export default ModalForm; export default EditModel;

View File

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

View File

@ -5,14 +5,17 @@ import { useParams } from "react-router-dom";
import { ParamsEnum } from "../../enums/params"; import { ParamsEnum } from "../../enums/params";
import { useGetAllSubject } from "../../api/subject"; import { useGetAllSubject } from "../../api/subject";
import useSetPageTitle from "../../Hooks/useSetPageTitle"; import useSetPageTitle from "../../Hooks/useSetPageTitle";
import { ModalEnum } from "../../enums/Model";
import { useDeleteUnit } from "../../api/unit";
const Table = lazy(() => import('./Table')); const Table = lazy(() => import('./Table'));
const AddModalForm = lazy(() => import('./Model/AddModel')); const AddModalForm = lazy(() => import('./Model/AddModel'));
const EditModalForm = lazy(() => import('./Model/EditModel')); const EditModalForm = lazy(() => import('./Model/EditModel'));
const DeleteModels = lazy(() => import('./Model/Delete')); const DeleteModels = lazy(() => import('../../Layout/Dashboard/DeleteModels'));
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
const deleteMutation = useDeleteUnit();
const { subject_id} = useParams<ParamsEnum>(); const { subject_id} = useParams<ParamsEnum>();
@ -41,7 +44,10 @@ const TableHeader = () => {
<Table /> <Table />
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />
<DeleteModels /> <DeleteModels
deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.UNIT_DELETE}
/>
</Suspense> </Suspense>
</div> </div>

View File

@ -11,6 +11,7 @@ import { ABILITIES_ENUM } from "../../enums/abilities";
import { BsEyeFill } from "react-icons/bs"; import { BsEyeFill } from "react-icons/bs";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { canAddUnit, canDeleteUnit, canEditUnit, canShowUnit } from "../../utils/hasAbilityFn"; import { canAddUnit, canDeleteUnit, canEditUnit, canShowUnit } from "../../utils/hasAbilityFn";
import ActionButtons from "../../Components/Table/ActionButtons";
export const useColumns = () => { export const useColumns = () => {
const { handel_open_model } = useModalHandler(); const { handel_open_model } = useModalHandler();
@ -22,8 +23,6 @@ export const useColumns = () => {
navigate(`${ABILITIES_ENUM?.UNIT}/${record?.id}`); navigate(`${ABILITIES_ENUM?.UNIT}/${record?.id}`);
}; };
const handelDelete = (data: any) => { const handelDelete = (data: any) => {
setObjectToEdit(data); setObjectToEdit(data);
handel_open_model(ModalEnum?.UNIT_DELETE); handel_open_model(ModalEnum?.UNIT_DELETE);
@ -70,48 +69,21 @@ export const useColumns = () => {
) : ( ) : (
"" ""
), ),
key: "actions", key: "actions",
align: "end", align: "end",
className: "custom_add_button_column", width: "25vw",
render: (text, record, index) => { render: (_text, record, index) => {
const className =
index % 2 === 0 ? "even-row buttonAction" : "odd-row buttonAction";
return ( return (
<Space size="middle" className={className}> <ActionButtons
{canEditUnit && ( canDelete={canDeleteUnit}
<Tooltip canEdit={canEditUnit}
placement="top" canShow={canShowUnit}
title={t("practical.edit")} index={index}
color="#E0E0E0" onDelete={() => handelDelete(record)}
> onEdit={() => handleEdit(record)}
<span onClick={() => handleEdit(record)}> onShow={() => handelShow(record)}
<MdOutlineEdit />
size={22}
style={{ color: "#A098AE" }}
/>
</span>
</Tooltip>
)}
{canDeleteUnit && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}
style={{ color: "#C11313" }}
/>
)}
{canShowUnit && (
<BsEyeFill
onClick={() => handelShow(record)}
size={22}
style={{ color: "green" }}
/>
)}
</Space>
); );
}, },
}, },

View File

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

View File

@ -1,24 +1,20 @@
import React, { useEffect } from "react"; 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 { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import { useAddLesson } from "../../../api/lesson"; import LayoutModel from "../../../Layout/Dashboard/LayoutModel";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { QueryStatusEnum } from "../../../enums/QueryStatus";
import ModelForm from "./ModelForm";
import { useQueryClient } from "react-query"; import { useQueryClient } from "react-query";
import { useTranslation } from "react-i18next"; import { useAddLesson } from "../../../api/lesson";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { ParamsEnum } from "../../../enums/params"; import { ParamsEnum } from "../../../enums/params";
import { useModalState } from "../../../zustand/Modal";
const AddModel: React.FC = () => {
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { isOpen, setIsOpen } = useModalState((state) => state);
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { mutate, isSuccess, status } = useAddLesson();
const { mutate, isSuccess, isLoading } = useAddLesson();
const {unit_id} = useParams<ParamsEnum>() const {unit_id} = useParams<ParamsEnum>()
useEffect(() => { useEffect(() => {
@ -32,49 +28,20 @@ const ModalForm: React.FC = () => {
mutate({ ...values, unit_id: unit_id }); mutate({ ...values, unit_id: unit_id });
}; };
const handleCancel = () => {
setIsOpen("");
};
const [t] = useTranslation();
return ( return (
<> <>
<Modal <LayoutModel
className="ModalForm" status={status as QueryStatusEnum}
centered ModelEnum={ModalEnum.LESSON_ADD}
width={"40vw"} modelTitle="lesson"
footer={null} handleSubmit={handleSubmit}
open={isOpen === ModalEnum?.LESSON_ADD} getInitialValues={getInitialValues({})}
onCancel={handleCancel} getValidationSchema={getValidationSchema}
> >
<FormikForm <ModelForm />
handleSubmit={handleSubmit} </LayoutModel>
initialValues={getInitialValues([])}
validationSchema={getValidationSchema}
>
<header>
{" "}
{t("practical.add")} {t("models.lesson")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<div className="buttons">
<div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} type="submit">
{t("practical.add")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</FormikForm>
</Modal>
</> </>
); );
}; };
export default ModalForm; export default AddModel;

View File

@ -1,97 +0,0 @@
import React, { useEffect, useState } from "react";
import { Input, Modal, Spin } from "antd";
import { useModalState } from "../../../zustand/Modal";
import { ModalEnum } from "../../../enums/Model";
import { useDeleteLesson } from "../../../api/lesson";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useQueryClient } from "react-query";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const [inputValue, setInputValue] = useState("");
const { mutate, isSuccess, isLoading } = useDeleteLesson();
const { objectToEdit,setObjectToEdit } = useObjectToEdit((state) => state);
const queryClient = useQueryClient();
const [t] = useTranslation();
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
});
};
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setInputValue("");
queryClient.invalidateQueries(["unit"]);
}
}, [setIsOpen, isSuccess, queryClient]);
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setInputValue(e.target.value);
};
return (
<>
<Modal
className="ModalForm"
centered
width={"40vw"}
footer={null}
open={isOpen === ModalEnum?.LESSON_DELETE}
onCancel={handleCancel}
>
<header>
{" "}
{t("practical.delete")} {objectToEdit?.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("models.lesson")} {t("input.name")}
</label>
<Input
size="large"
type="text"
placeholder={`${t("practical.enter")} ${t("input.name")} ${t("models.lesson")} `}
value={inputValue}
onChange={handleChange}
/>
</div>
<div className="buttons">
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.name !== inputValue ? "disabled_button" : ""
}
disabled={objectToEdit?.name !== inputValue || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</Modal>
</>
);
};
export default ModalForm;

View File

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

View File

@ -1,25 +1,23 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { Modal, Spin } from "antd";
import { useModalState } from "../../../zustand/Modal"; import { useModalState } from "../../../zustand/Modal";
import FormikForm from "../../../Layout/Dashboard/FormikFormModel";
import ModelBody from "./Edit";
import { getInitialValues, getValidationSchema } from "./formUtil"; import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useUpdateLesson } from "../../../api/lesson"; import { useUpdateLesson } from "../../../api/lesson";
import { useQueryClient } from "react-query"; import { useQueryClient } from "react-query";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import LayoutModel from "../../../Layout/Dashboard/LayoutModel";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
import ModelForm from "./ModelForm";
const ModalForm: React.FC = () => { const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useUpdateLesson(); const { mutate, isSuccess, status } = useUpdateLesson();
const { objectToEdit, setObjectToEdit } = useObjectToEdit(); const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
// console.log(objectToEdit,"objectToEdit");
useEffect(() => { useEffect(() => {
if (isSuccess) { if (isSuccess) {
queryClient.invalidateQueries(["unit"]); queryClient.invalidateQueries(["unit"]);
@ -29,54 +27,25 @@ const ModalForm: React.FC = () => {
}, [setIsOpen, isSuccess, queryClient]); }, [setIsOpen, isSuccess, queryClient]);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
// console.log(values,"values");
mutate({ mutate({
id: values?.id, id: values?.id,
name: values?.name, name: values?.name,
}); });
}; };
const handleCancel = () => {
setIsOpen("");
};
const [t] = useTranslation();
return ( return (
<> <>
<Modal <LayoutModel
className="ModalForm" status={status as QueryStatusEnum}
centered ModelEnum={ModalEnum.LESSON_EDIT}
width={"40vw"} modelTitle="lesson"
footer={null} handleSubmit={handleSubmit}
open={isOpen === ModalEnum?.LESSON_EDIT} getInitialValues={getInitialValues(objectToEdit)}
onCancel={handleCancel} getValidationSchema={getValidationSchema}
isAddModal={false}
> >
<FormikForm <ModelForm />
handleSubmit={handleSubmit} </LayoutModel>
initialValues={getInitialValues(objectToEdit)}
validationSchema={getValidationSchema}
>
<header>
{" "}
{t("practical.edit")} {t("practical.details")} {t("models.lesson")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<div className="buttons">
<div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} type="submit">
{t("practical.edit")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</FormikForm>
</Modal>
</> </>
); );
}; };

View File

@ -5,14 +5,17 @@ import useSetPageTitle from "../../Hooks/useSetPageTitle";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { ParamsEnum } from "../../enums/params"; import { ParamsEnum } from "../../enums/params";
import { useGetAllUnit } from "../../api/unit"; import { useGetAllUnit } from "../../api/unit";
import { ModalEnum } from "../../enums/Model";
import { useDeleteLesson } from "../../api/lesson";
const Table = lazy(() => import('./Table')); const Table = lazy(() => import('./Table'));
const AddModalForm = lazy(() => import('./Model/AddModel')); const AddModalForm = lazy(() => import('./Model/AddModel'));
const EditModalForm = lazy(() => import('./Model/EditModel')); const EditModalForm = lazy(() => import('./Model/EditModel'));
const DeleteModels = lazy(() => import('./Model/Delete')); const DeleteModels = lazy(() => import('../../Layout/Dashboard/DeleteModels'));
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
const deleteMutation = useDeleteLesson();
const { unit_id } = useParams<ParamsEnum>(); const { unit_id } = useParams<ParamsEnum>();
const { data: unit } = useGetAllUnit({ show: unit_id }); const { data: unit } = useGetAllUnit({ show: unit_id });
@ -45,7 +48,10 @@ const TableHeader = () => {
<Table /> <Table />
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />
<DeleteModels /> <DeleteModels
deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.LESSON_DELETE}
/>
</Suspense> </Suspense>
</div> </div>

View File

@ -1,20 +1,14 @@
import { Space, TableColumnsType, Tooltip } from "antd"; import { TableColumnsType } from "antd";
import { Lesson } from "../../types/Item"; import { Lesson } from "../../types/Item";
import { FaPlus } from "react-icons/fa"; import { FaPlus } from "react-icons/fa";
import useModalHandler from "../../utils/useModalHandler"; import useModalHandler from "../../utils/useModalHandler";
import { ModalEnum } from "../../enums/Model"; import { ModalEnum } from "../../enums/Model";
import { useObjectToEdit } from "../../zustand/ObjectToEditState"; 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 { useTranslation } from "react-i18next";
import { hasAbility } from "../../utils/hasAbility";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "../../enums/abilities"; 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 { useNavigate } from "react-router-dom";
import { canAddLesson, canDeleteLesson, canEditLesson, canShowLesson } from "../../utils/hasAbilityFn"; import { canAddLesson, canDeleteLesson, canEditLesson, canShowLesson } from "../../utils/hasAbilityFn";
import ActionButtons from "../../Components/Table/ActionButtons";
export const useColumns = () => { export const useColumns = () => {
const { handel_open_model } = useModalHandler(); const { handel_open_model } = useModalHandler();
@ -26,8 +20,6 @@ export const useColumns = () => {
navigate(`${ABILITIES_ENUM.LESSON}/${record?.id}`); navigate(`${ABILITIES_ENUM.LESSON}/${record?.id}`);
}; };
const handelDelete = (data: any) => { const handelDelete = (data: any) => {
setObjectToEdit(data); setObjectToEdit(data);
handel_open_model(ModalEnum?.LESSON_DELETE); handel_open_model(ModalEnum?.LESSON_DELETE);
@ -67,46 +59,18 @@ export const useColumns = () => {
), ),
key: "actions", key: "actions",
align: "end", align: "end",
className: "custom_add_button_column", width: "25vw",
render: (text, record, index) => { render: (_text, record, index) => {
const className =
index % 2 === 0 ? "even-row buttonAction" : "odd-row buttonAction";
return ( return (
<Space size="middle" className={className}> <ActionButtons
{canEditLesson && ( canDelete={canDeleteLesson}
<Tooltip canEdit={canEditLesson}
placement="top" canShow={canShowLesson}
title={t("practical.edit")} index={index}
color="#E0E0E0" onDelete={() => handelDelete(record)}
> onEdit={() => handleEdit(record)}
<span onClick={() => handleEdit(record)}> onShow={() => handelShow(record)}
<MdOutlineEdit />
size={22}
style={{ color: "#A098AE" }}
/>
</span>
</Tooltip>
)}
{canDeleteLesson && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}
style={{ color: "#C11313" }}
/>
)}
{canShowLesson && (
<BsEyeFill
onClick={() => handelShow(record)}
size={22}
style={{ color: "green" }}
/>
)}
</Space>
); );
}, },
}, },

View File

@ -11,7 +11,7 @@ import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import Header from "../../Components/exercise/Header"; import Header from "../../Components/exercise/Header";
import { Question } from "../../types/Item"; import { Question } from "../../types/Item";
import BaseForm from './Model/Malty/Add' import BaseForm from './Model/Malty/Add'
import Form from './Model/Add' import ModelForm from './Model/ModelForm'
const AcceptModal = lazy(() => import('./Model/AcceptModal')); const AcceptModal = lazy(() => import('./Model/AcceptModal'));
import { useModalState } from "../../zustand/Modal"; import { useModalState } from "../../zustand/Modal";
@ -193,7 +193,7 @@ const AddPage: React.FC = () => {
<main className="w-100 exercise_add_main"> <main className="w-100 exercise_add_main">
<Header/> <Header/>
<Form/> <ModelForm/>
<div className="exercise_add_buttons"> <div className="exercise_add_buttons">
<div onClick={handleCancel}>{t("practical.back")}</div> <div onClick={handleCancel}>{t("practical.back")}</div>

View File

@ -1,16 +1,15 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { Modal, Spin } from "antd"; import { Spin } from "antd";
import FormikForm from "../../Layout/Dashboard/FormikFormModel"; import FormikForm from "../../Layout/Dashboard/FormikFormModel";
import { getInitialValues, getValidationSchema ,getInitialValuesBase, getValidationSchemaBase, processTags} from "./Model/formUtil"; import { getInitialValues, getValidationSchema ,getInitialValuesBase, getValidationSchemaBase, processTags} from "./Model/formUtil";
import { useAddQuestion, useDeleteQuestion, useGetAllQuestion, useUpdateQuestion } from "../../api/Question"; import { useAddQuestion, useDeleteQuestion, useGetAllQuestion, useUpdateQuestion } from "../../api/Question";
import { useQueryClient } from "react-query";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
import { ParamsEnum } from "../../enums/params"; import { ParamsEnum } from "../../enums/params";
import { useObjectToEdit } from "../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { removeStringKeys } from "../../utils/removeStringKeys"; import { removeStringKeys } from "../../utils/removeStringKeys";
import SpinContainer from "../../Components/Layout/SpinContainer"; import SpinContainer from "../../Components/Layout/SpinContainer";
import Form from './Model/Edit' import ModelForm from './Model/ModelForm'
import BaseForm from './Model/Malty/Edit' import BaseForm from './Model/Malty/Edit'
import { Question } from "../../types/Item"; import { Question } from "../../types/Item";
import { toast } from "react-toastify"; import { toast } from "react-toastify";
@ -156,11 +155,6 @@ const EditPage: React.FC = () => {
updatedObject?.QuestionOptions?.forEach((item:any) => { updatedObject?.QuestionOptions?.forEach((item:any) => {
if (item?.id) { if (item?.id) {
// if(!item?.answer_image){
// item["answer_image"] = ""
// }
console.log(item);
oldQuestionOptions.push(item); oldQuestionOptions.push(item);
} else { } else {
newQuestionOptions.push(item); newQuestionOptions.push(item);
@ -171,9 +165,6 @@ const EditPage: React.FC = () => {
old: oldQuestionOptions, old: oldQuestionOptions,
new: newQuestionOptions new: newQuestionOptions
}; };
console.log(QuestionOptions,"QuestionOptions");
mutate({ ...updatedObject,QuestionOptions,tags }); mutate({ ...updatedObject,QuestionOptions,tags });
} }
}; };
@ -259,7 +250,7 @@ const EditPage: React.FC = () => {
{t("header.exercise") } {t("header.exercise") }
</div> </div>
</header> </header>
<Form /> <ModelForm />
<div className="exercise_add_buttons"> <div className="exercise_add_buttons">
<div onClick={handleCancel}>{t("practical.back")}</div> <div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} className="relative" type="submit"> <button disabled={isLoading} className="relative" type="submit">

View File

@ -1,81 +0,0 @@
import { Col, Row } from "reactstrap";
import React, { useEffect } from "react";
import ValidationField from "../../../Components/ValidationField/ValidationField";
import { useFormikContext } from "formik";
import ChoiceFields from "./Field/ChoiceFields";
import { FaCirclePlus } from "react-icons/fa6";
import { Choice } from "../../../types/Item";
import { useTranslation } from "react-i18next";
import DynamicTags from "./Tags/DynamicTags";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import MathInput from "./MathInput";
const Form = () => {
const formik = useFormikContext<any>();
const{setSuccess,Success,setSavedQuestionData} = useObjectToEdit()
useEffect(() => {
if (Success) {
formik.setErrors({});
formik.resetForm({ values: {} });
setSuccess(false)
}
}, [Success]);
useEffect(() => {
setSavedQuestionData(formik.values)
}, [formik?.values])
const handleAddChoice = () => {
console.log(formik?.values?.QuestionOptions?.length);
formik.setFieldValue('QuestionOptions', [...(formik?.values as any)?.QuestionOptions as Choice[],
{
answer:null,
answer_image:null,
isCorrect:0,
}])
}
const [t] = useTranslation()
return (
<Row className="w-100">
<div className="exercise_form">
{/* <MathInput/> */}
<ValidationField className="textarea_exercise" name="content" label="details" type="TextArea" />
<ValidationField className="file_exercise" name="image" label="attachment" type="File" />
<div>
</div>
</div>
<div className=" flex ">
</div>
{
(((formik?.values as any)?.QuestionOptions as Choice[])||[]) .map((item:Choice,index:number)=>{
return <ChoiceFields key={index} index={index} data={item}/>
}
)
}
{formik?.values?.QuestionOptions?.length < 5 && (
<p className="add_new_button" >
<FaCirclePlus onClick={handleAddChoice} size={23} /> {t("header.add_new_choice")}
</p>
)}
<DynamicTags/>
</Row>
);
};
export default Form;

View File

@ -1,95 +0,0 @@
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 { useDeleteQuestion } from "../../../api/Question";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const [inputValue, setInputValue] = useState("");
const { mutate, isLoading, isSuccess } = useDeleteQuestion();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setInputValue("");
}
}, [isSuccess, setIsOpen]);
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
});
};
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
// Step 2: Handle changes to the input field
setInputValue(e.target.value);
};
const [t] = useTranslation();
console.log(objectToEdit?.id);
return (
<>
<Modal
className="ModalForm"
centered
width={"40vw"}
footer={null}
open={isOpen === ModalEnum?.QUESTION_DELETE}
onCancel={handleCancel}
>
<header>
{t("practical.delete")} {t("input.id")} ({objectToEdit?.id}){" "}
</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.id")} {t("models.Question")}
</label>
<Input
size="large"
type="text"
placeholder={`${t("practical.enter")} ${t("input.id")} ${t("models.Question")} `}
value={inputValue}
onChange={handleChange}
/>
</div>
<div className="buttons">
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={
objectToEdit?.id !== inputValue ? "disabled_button" : ""
}
disabled={Number(objectToEdit?.id) !== Number(inputValue) || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</Modal>
</>
);
};
export default ModalForm;

View File

@ -1,81 +0,0 @@
import { Col, Row } from "reactstrap";
import React, { useEffect } from "react";
import ValidationField from "../../../Components/ValidationField/ValidationField";
import { useFormikContext } from "formik";
import { useModalState } from "../../../zustand/Modal";
import PdfUploader from "../../../Components/CustomFields/PdfUploader";
import ChoiceFields from "./Field/ChoiceFields";
import { FaCirclePlus } from "react-icons/fa6";
import { Choice } from "../../../types/Item";
import { useTranslation } from "react-i18next";
import DynamicTags from "./Tags/DynamicTags";
import { useGetAllQuestion } from "../../../api/Question";
const Form = () => {
const formik = useFormikContext<any>();
const { isOpen } = useModalState((state) => state);
// const {data} = useGetAllQuestion();
useEffect(() => {
if (isOpen === "") {
formik.setErrors({});
formik.resetForm();
}
}, [isOpen]);
// console.log(formik?.errors);
const handleAddChoice = () => {
formik.setFieldValue('QuestionOptions', [...(formik?.values as any)?.QuestionOptions as Choice[],
{
answer:null,
answer_image:null,
isCorrect:0
}])
}
const [t] = useTranslation()
return (
<Row className="w-100">
<div className="exercise_form">
<ValidationField className="textarea_exercise" name="content" label="details" type="TextArea" />
<ValidationField className="file_exercise" name="image" label="attachment" type="File" />
{/* <ValidationField name="isBase" label="isBase" type="Checkbox" /> */}
<div>
</div>
</div>
<div className=" flex ">
{/* <ValidationField name="min_mark_to_pass" label="min_mark_to_pass" type="Number" /> */}
{/* <ValidationField name="parent_id" label="parent_id" type="Select" option={[]} /> */}
</div>
{
(((formik?.values as any)?.QuestionOptions as Choice[])||[]) .map((item:Choice,index:number)=>{
return <ChoiceFields key={index} index={index} data={item}/>
}
)
}
{formik?.values?.QuestionOptions?.length < 5 && (
<p className="add_new_button" >
<FaCirclePlus onClick={handleAddChoice} size={23} /> {t("header.add_new_choice")}
</p>
)}
<DynamicTags/>
</Row>
);
};
export default Form;

View File

@ -7,11 +7,15 @@ import { ParamsEnum } from "../../enums/params";
import { useGetAllUnit } from "../../api/unit"; import { useGetAllUnit } from "../../api/unit";
import useSetPageTitle from "../../Hooks/useSetPageTitle"; import useSetPageTitle from "../../Hooks/useSetPageTitle";
import { useGetAllLesson } from "../../api/lesson"; import { useGetAllLesson } from "../../api/lesson";
import DeleteModels from "../../Layout/Dashboard/DeleteModels";
import { ModalEnum } from "../../enums/Model";
import { useDeleteQuestion } from "../../api/Question";
const Table = lazy(() => import('./Table')); const Table = lazy(() => import('./Table'));
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
const deleteMutation = useDeleteQuestion();
const { unit_id,lesson_id } = useParams<ParamsEnum>(); const { unit_id,lesson_id } = useParams<ParamsEnum>();
const { data: unit } = useGetAllUnit({ show: unit_id }); const { data: unit } = useGetAllUnit({ show: unit_id });
@ -46,8 +50,10 @@ const TableHeader = () => {
</header> </header>
<Table /> <Table />
</Suspense> </Suspense>
<DeleteModel/> <DeleteModels
deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.QUESTION_DELETE}
/>
</div> </div>
); );
}; };

View File

@ -1,15 +1,14 @@
import { Space, TableColumnsType, Tooltip } from "antd"; import { TableColumnsType } from "antd";
import { Question } from "../../types/Item"; import { Question } from "../../types/Item";
import { FaPlus } from "react-icons/fa"; import { FaPlus } from "react-icons/fa";
import { ModalEnum } from "../../enums/Model"; import { ModalEnum } from "../../enums/Model";
import { useObjectToEdit } from "../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import { RiDeleteBin6Fill } from "react-icons/ri";
import { MdOutlineEdit } from "react-icons/md";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { ABILITIES_ENUM } from "../../enums/abilities"; import { ABILITIES_ENUM } from "../../enums/abilities";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { useModalState } from "../../zustand/Modal"; import { useModalState } from "../../zustand/Modal";
import { canAddQuestion, canDeleteQuestion, canEditQuestion } from "../../utils/hasAbilityFn"; import { canAddQuestion, canDeleteQuestion, canEditQuestion } from "../../utils/hasAbilityFn";
import ActionButtons from "../../Components/Table/ActionButtons";
export const useColumns = () => { export const useColumns = () => {
const { setObjectToEdit } = useObjectToEdit((state) => state); const { setObjectToEdit } = useObjectToEdit((state) => state);
@ -78,45 +77,16 @@ export const useColumns = () => {
), ),
key: "actions", key: "actions",
align: "end", align: "end",
className: "custom_add_button_column", width: "25vw",
render: (text, record, index) => { render: (_text, record, index) => {
const className =
index % 2 === 0 ? "even-row buttonAction" : "odd-row buttonAction";
return ( return (
<Space size="middle" className={className}> <ActionButtons
{canEditQuestion && ( canDelete={canDeleteQuestion}
<Tooltip canEdit={canEditQuestion}
placement="top" index={index}
title={t("practical.edit")} onDelete={() => handelDelete(record)}
color="#E0E0E0" onEdit={() => handleEdit(record)}
> />
<span onClick={() => handleEdit(record)}>
<MdOutlineEdit
size={22}
style={{ color: "#A098AE" }}
/>
</span>
</Tooltip>
)}
{canDeleteQuestion && (
<RiDeleteBin6Fill
onClick={() => handelDelete(record)}
size={22}
style={{ color: "#C11313" }}
/>
)}
{/* {can_show_Question && (
<BsEyeFill
onClick={() => handelShow(record)}
size={22}
style={{ color: "green" }}
/>
)} */}
</Space>
); );
}, },
}, },

View File

@ -1,34 +0,0 @@
import { Col, Row } from "reactstrap";
import React, { useEffect } from "react";
import ValidationField from "../../../Components/ValidationField/ValidationField";
import { useGetAllTeacher } from "../../../api/teacher";
import useFormatDataToSelect from "../../../utils/useFormatDataToSelect";
import { useFormikContext } from "formik";
import { useModalState } from "../../../zustand/Modal";
import useSearchQuery from "../../../api/utils/useSearchQuery";
const Form = () => {
const { isOpen } = useModalState((state) => state);
const formik = useFormikContext<any>();
useEffect(() => {
if (isOpen === "") {
formik.setErrors({});
formik.resetForm();
}
}, [isOpen]);
return (
<Row className="w-100">
<Col>
<ValidationField name="name" label="name" />
</Col>
<Col>
<ValidationField type="File" name="image" label="image" />
</Col>
</Row>
);
};
export default Form;

View File

@ -1,76 +1,31 @@
import React, { useEffect } from "react"; import React 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 { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import LayoutModel from "../../../Layout/Dashboard/LayoutModel";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
import ModelForm from "./ModelForm";
import { useAddSubject } from "../../../api/subject"; import { useAddSubject } from "../../../api/subject";
import { useParams } from "react-router-dom";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => { const AddModel: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { mutate, status } = useAddSubject();
const { mutate, isSuccess, isLoading } = useAddSubject();
const { setObjectToEdit } = useObjectToEdit();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setObjectToEdit({});
}
}, [setIsOpen, isSuccess]);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
// console.log(values,"values"); mutate({ ...values });
mutate({
...values,
});
}; };
const handleCancel = () => {
setIsOpen("");
setObjectToEdit({});
};
const [t] = useTranslation();
return ( return (
<> <>
<Modal <LayoutModel
className="ModalForm" status={status as QueryStatusEnum}
centered ModelEnum={ModalEnum.SUBJECT_ADD}
width={"60vw"} modelTitle="subject"
footer={null} handleSubmit={handleSubmit}
open={isOpen === ModalEnum?.SUBJECT_ADD} getInitialValues={getInitialValues({})}
onCancel={handleCancel} getValidationSchema={getValidationSchema}
> >
<FormikForm <ModelForm />
handleSubmit={handleSubmit} </LayoutModel>
initialValues={getInitialValues(null)}
validationSchema={getValidationSchema}
>
<header>
{t("practical.add")} {t("models.subject")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<div className="buttons">
<div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} type="submit">
{t("practical.add")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</FormikForm>
</Modal>
</> </>
); );
}; };
export default ModalForm; export default AddModel;

View File

@ -1,93 +0,0 @@
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 { useDeleteSubject } from "../../../api/subject";
import { useTranslation } from "react-i18next";
const ModalForm: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state);
const [inputValue, setInputValue] = useState("");
const { mutate, isSuccess, isLoading } = useDeleteSubject();
const { objectToEdit, setObjectToEdit } = useObjectToEdit();
const full_name = objectToEdit?.name;
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setInputValue("");
}
}, [isSuccess, setIsOpen]);
const handleSubmit = () => {
mutate({
id: Number(objectToEdit?.id),
});
};
const handleCancel = () => {
setInputValue("");
setIsOpen("");
setObjectToEdit({});
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setInputValue(e.target.value);
};
const [t] = useTranslation();
return (
<>
<Modal
className="ModalForm"
centered
width={"40vw"}
footer={null}
open={isOpen === ModalEnum?.SUBJECT_DELETE}
onCancel={handleCancel}
>
<header>
{" "}
{t("practical.delete")} {full_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.subject")}
</label>
<Input
size="large"
type="text"
placeholder={`${t("practical.enter")} ${t("input.name")} ${t("models.subject")} `}
value={inputValue}
onChange={handleChange}
/>
</div>
<div className="buttons">
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button
className={full_name !== inputValue ? "disabled_button" : ""}
disabled={full_name !== inputValue || isLoading}
onClick={handleSubmit}
>
{t("practical.delete")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</Modal>
</>
);
};
export default ModalForm;

View File

@ -1,33 +0,0 @@
import { Col, Row } from "reactstrap";
import React, { useEffect } from "react";
import ValidationField from "../../../Components/ValidationField/ValidationField";
import { useGetAllTeacher } from "../../../api/teacher";
import useFormatDataToSelect from "../../../utils/useFormatDataToSelect";
import { useModalState } from "../../../zustand/Modal";
import { useFormikContext } from "formik";
import useSearchQuery from "../../../api/utils/useSearchQuery";
const Form = () => {
const { isOpen } = useModalState((state) => state);
const formik = useFormikContext();
useEffect(() => {
if (isOpen === "") {
formik.setErrors({});
}
}, [isOpen]);
return (
<Row className="w-100">
<Col>
<ValidationField name="name" label="name" />
</Col>
<Col>
<ValidationField type="File" name="image" label="image" />
</Col>
</Row>
);
};
export default Form;

View File

@ -1,83 +1,36 @@
import React, { useEffect } from "react"; import React from "react";
import { Modal, Spin } from "antd";
import { useModalState } from "../../../zustand/Modal";
import ModelBody from "./Edit";
import { getInitialValues, getValidationSchema } from "./formUtil"; import { getInitialValues, getValidationSchema } from "./formUtil";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import { useUpdateSubject } from "../../../api/subject"; import { useUpdateSubject } from "../../../api/subject";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { Form, Formik } from "formik";
import { handelImageState } from "../../../utils/DataToSendImageState"; import { handelImageState } from "../../../utils/DataToSendImageState";
import { useTranslation } from "react-i18next"; import LayoutModel from "../../../Layout/Dashboard/LayoutModel";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
import ModelForm from "./ModelForm";
const ModalForm: React.FC = () => { const ModalForm: React.FC = () => {
const { objectToEdit, setObjectToEdit } = useObjectToEdit( const { objectToEdit } = useObjectToEdit((state) => state);
(state) => state,
);
const { isOpen, setIsOpen } = useModalState((state) => state);
const { mutate, isSuccess, isLoading } = useUpdateSubject(); const { mutate ,status} = useUpdateSubject();
useEffect(() => {
if (isSuccess) {
setIsOpen("");
setObjectToEdit({});
}
}, [isSuccess]);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
const Data_to_send = { ...values }; const Data_to_send = { ...values };
const handelImage = handelImageState(Data_to_send, "image"); const handelImage = handelImageState(Data_to_send, "image");
mutate(handelImage); mutate(handelImage);
}; };
const handleCancel = () => {
setIsOpen("");
setObjectToEdit(null);
};
const [t] = useTranslation();
return ( return (
<> <>
<Modal <LayoutModel
className="ModalForm" status={status as QueryStatusEnum}
centered ModelEnum={ModalEnum.SUBJECT_EDIT}
width={"60vw"} modelTitle="subject"
footer={null} handleSubmit={handleSubmit}
open={isOpen === ModalEnum?.SUBJECT_EDIT} getInitialValues={getInitialValues(objectToEdit)}
onCancel={handleCancel} getValidationSchema={getValidationSchema}
isAddModal={false}
> >
<Formik <ModelForm />
enableReinitialize </LayoutModel>
initialValues={getInitialValues(objectToEdit)}
validationSchema={getValidationSchema}
onSubmit={handleSubmit}
>
{({ values }) => (
<Form className="w-100">
<header>
{t("practical.edit")} {t("models.subject")}{" "}
</header>
<main className="main_modal w-100">
<ModelBody />
<div className="buttons">
<div onClick={handleCancel}>{t("practical.cancel")}</div>
<button disabled={isLoading} type="submit">
{t("practical.edit")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</Form>
)}
</Formik>
</Modal>
</> </>
); );
}; };

View File

@ -4,19 +4,19 @@ import useModalHandler from '../../../utils/useModalHandler';
import { FaPlus } from 'react-icons/fa'; import { FaPlus } from 'react-icons/fa';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import TablePage from './TablePage'; import TablePage from './TablePage';
import AddSubjectModalForm from "../Model/AddModel"; import AddSubjectModalForm from "../Model/AddModel";
import EditSubjectModalForm from "../Model/EditModel"; import EditSubjectModalForm from "../Model/EditModel";
import DeleteSubjectModalForm from "../Model/Delete";
import useSetPageTitle from '../../../Hooks/useSetPageTitle'; import useSetPageTitle from '../../../Hooks/useSetPageTitle';
import { canAddSubject } from '../../../utils/hasAbilityFn'; import { canAddSubject } from '../../../utils/hasAbilityFn';
import DeleteModels from '../../../Layout/Dashboard/DeleteModels';
import { useDeleteSubject } from '../../../api/subject';
const TableWithHeader = () => { const TableWithHeader = () => {
const { handel_open_model } = useModalHandler(); const { handel_open_model } = useModalHandler();
const [t] = useTranslation(); const [t] = useTranslation();
const deleteMutation = useDeleteSubject();
useSetPageTitle( useSetPageTitle(
t(`page_header.subject`), t(`page_header.subject`),
@ -39,7 +39,10 @@ const TableWithHeader = () => {
<AddSubjectModalForm /> <AddSubjectModalForm />
<EditSubjectModalForm /> <EditSubjectModalForm />
<DeleteSubjectModalForm /> <DeleteModels
deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.SUBJECT_DELETE}
/>
</div> </div>
) )
} }

View File

@ -1,35 +1,26 @@
import { Space, TableColumnsType, Tooltip } from "antd"; import { TableColumnsType } from "antd";
import { useModalState } from "../../../zustand/Modal"; import { useModalState } from "../../../zustand/Modal";
import { ModalEnum } from "../../../enums/Model"; import { ModalEnum } from "../../../enums/Model";
import { MdOutlineEdit } from "react-icons/md";
import { RiDeleteBin6Fill } from "react-icons/ri";
import { FaEye } from "react-icons/fa"; import { FaEye } from "react-icons/fa";
import ColumnsImage from "../../../Components/Columns/ColumnsImage"; import ColumnsImage from "../../../Components/Columns/ColumnsImage";
import { ImageBaseURL } from "../../../api/config";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import useModalHandler from "../../../utils/useModalHandler";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { import ActionButtons from "../../../Components/Table/ActionButtons";
ABILITIES_ENUM,
ABILITIES_VALUES_ENUM,
} from "../../../enums/abilities";
import { hasAbility } from "../../../utils/hasAbility";
import { canDeleteSubject, canEditSubject } from "../../../utils/hasAbilityFn"; import { canDeleteSubject, canEditSubject } from "../../../utils/hasAbilityFn";
export const useColumns = () => { export const useColumns = () => {
const navigate = useNavigate(); const navigate = useNavigate();
const { setObjectToEdit } = useObjectToEdit((state) => state); const { setObjectToEdit } = useObjectToEdit((state) => state);
const { handel_open_model } = useModalHandler(); const { setIsOpen } = useModalState((state) => state);
const handelDeleteSubject = (data: any) => { const handelDelete = (record:any) => {
setObjectToEdit(data);
handel_open_model(ModalEnum?.SUBJECT_DELETE);
};
const handleEdit = (record: any) => {
setObjectToEdit(record); setObjectToEdit(record);
handel_open_model(ModalEnum?.SUBJECT_EDIT); setIsOpen(ModalEnum?.SUBJECT_DELETE);
};
const handleEdit = (record:any) => {
setObjectToEdit(record);
setIsOpen(ModalEnum?.SUBJECT_EDIT);
}; };
const [t] = useTranslation(); const [t] = useTranslation();
@ -53,8 +44,6 @@ export const useColumns = () => {
align: "center", align: "center",
render: (row: any) => { render: (row: any) => {
let str = row; let str = row;
// console.log(row);
return <ColumnsImage src={str} />; return <ColumnsImage src={str} />;
}, },
}, },
@ -81,36 +70,15 @@ export const useColumns = () => {
key: "actions", key: "actions",
align: "end", align: "end",
width: "25vw", width: "25vw",
render: (text, record, index) => { render: (_text, record, index) => {
const className =
index % 2 === 0 ? "even-row buttonAction" : "odd-row buttonAction";
return ( return (
<Space size="middle" className={className}> <ActionButtons
{canEditSubject && ( canDelete={canEditSubject}
<Tooltip canEdit={canDeleteSubject}
placement="top" index={index}
title={t("practical.edit")} onDelete={() => handelDelete(record)}
color="#E0E0E0" onEdit={() => handleEdit(record)}
> />
<span onClick={() => handleEdit(record)}>
<MdOutlineEdit
size={22}
style={{ color: "#A098AE" }}
/>
</span>
</Tooltip>
)}
{canDeleteSubject && (
<RiDeleteBin6Fill
onClick={() => handelDeleteSubject(record)}
size={22}
style={{ color: "#C11313" }}
/>
)}
</Space>
); );
}, },
}, },

View File

@ -274,3 +274,34 @@ button:disabled {
font-weight: bold; font-weight: bold;
} }
.buttonAction {
display: flex;
align-items: center;
justify-content: center;
gap: 2vw;
> button {
outline: none;
border: none;
border-radius: 20px;
padding: 0.3vw 1.5vw;
width: 8vw;
height: 2vw;
// background: var(--primary);
color: var(--white);
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
font-size: 0.8vw;
}
.EditButton {
background: var(--bg);
border: 1px solid #d4d4d8;
color: var(--text);
}
.DeleteButton {
background: #dc2626;
}
}

View File

@ -1,7 +1,7 @@
// export const BaseURL = "http://192.168.1.107:8000/api/"; export const BaseURL = "http://192.168.1.6:8000/api/";
// export const BaseURL = "http://127.0.0.1:8000/api/"; // export const BaseURL = "http://127.0.0.1:8000/api/";
export const BaseURL = "https://exercise-automation.point-dev.net/api/"; // 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/";

View File

@ -11,7 +11,6 @@ function useAddMutation(
): UseMutationResult<AxiosResponse, unknown, any, unknown> { ): UseMutationResult<AxiosResponse, unknown, any, unknown> {
const axios = useAxios(); const axios = useAxios();
console.log(toast,key);
return useMutation<AxiosResponse, unknown, any, unknown>( return useMutation<AxiosResponse, unknown, any, unknown>(

View File

@ -194,7 +194,8 @@
"no":"لا", "no":"لا",
"Are you sure you want to go back and not save any changes?":"هل أنت متأكد أنك تريد العودة وعدم حفظ أي تغييرات؟" , "Are you sure you want to go back and not save any changes?":"هل أنت متأكد أنك تريد العودة وعدم حفظ أي تغييرات؟" ,
"accept_back":"قبول العودة ", "accept_back":"قبول العودة ",
"accept":"قبول " "accept":"قبول ",
"to_confirm_deletion_please_re_enter_id":"يرجى اعادة ادخال رقم التعريف"
}, },
"Table": { "Table": {
"header": "", "header": "",
@ -253,7 +254,8 @@
"lessons": "دروس", "lessons": "دروس",
"sex": "الجنس", "sex": "الجنس",
"Question":"اسئلة", "Question":"اسئلة",
"tags":"كلمات مفتاحية" "tags":"كلمات مفتاحية",
"tags_details":"تفاصيل الكلمة المفتاحية"
}, },
"education_class_actions": { "education_class_actions": {
"Student_Records": "سجلات الطلاب", "Student_Records": "سجلات الطلاب",

View File

@ -225,7 +225,8 @@
"subjectAttachmentType": "Subject Attachment Type", "subjectAttachmentType": "Subject Attachment Type",
"param": "Param", "param": "Param",
"subjectProgress": "Subject Progress", "subjectProgress": "Subject Progress",
"main_page": "Main Page" "main_page": "Main Page",
"tags_details":"tags details"
}, },
"education_class_actions": { "education_class_actions": {
"Student_Records": "Student_Records", "Student_Records": "Student_Records",