diff --git a/.vscode/settings.json b/.vscode/settings.json
index 65876d1..7dd37a8 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -24,6 +24,7 @@
"toastify",
"Viewelement",
"webp",
+ "Xmark",
"zustand",
"مطلوب"
],
diff --git a/src/Components/Utils/Filter/useFilter.tsx b/src/Components/Utils/Filter/useFilter.tsx
index de0224f..b79cf37 100644
--- a/src/Components/Utils/Filter/useFilter.tsx
+++ b/src/Components/Utils/Filter/useFilter.tsx
@@ -13,10 +13,7 @@ import { useModalState } from "./Modal";
import { useFilterState } from "./FilterState";
import { ModalEnum } from "../../../enums/Model";
import { QueryStatusEnum } from "../../../enums/QueryStatus";
-import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import SpinContainer from "../../Layout/SpinContainer";
-import { TbFlagCancel } from "react-icons/tb";
-import { XFilled } from "@ant-design/icons";
import { FaXmark } from "react-icons/fa6";
type OmitFormikProps = "children" | "initialValues" | "onSubmit";
diff --git a/src/Components/ValidationField/View/Date.tsx b/src/Components/ValidationField/View/Date.tsx
index 54cc5bc..8f82443 100644
--- a/src/Components/ValidationField/View/Date.tsx
+++ b/src/Components/ValidationField/View/Date.tsx
@@ -12,12 +12,12 @@ const Date = ({
label,
picker = "date",
isDisabled,
- props,
onChange,
placeholder,
className,
no_label,
label_icon,
+ ...props
}: any) => {
const { errorMsg, isError, t, formik } = useFormField(name, props);
@@ -25,7 +25,8 @@ const Date = ({
const onCalendarChange = (value: any) => {
formik.setFieldValue(name, value);
};
-
+ console.log(props);
+
const Formatter = [DateEnum?.FORMATE];
return (
@@ -48,8 +49,10 @@ const Date = ({
size="large"
onChange={onChange || onCalendarChange}
disabled={isDisabled}
- format={Formatter}
+ format={props?.Format ?? Formatter}
id={name}
+ needConfirm={false}
+ {...props}
/>
{/*
*/}
diff --git a/src/Components/ValidationField/utils/types.ts b/src/Components/ValidationField/utils/types.ts
index 04b09a9..4174e1c 100644
--- a/src/Components/ValidationField/utils/types.ts
+++ b/src/Components/ValidationField/utils/types.ts
@@ -40,8 +40,9 @@ export type SearchFieldProps = BaseFieldProps &
type DateFieldProps = BaseFieldProps & {
type: "DataRange" | "Date" | "Time";
- Format?: "YYYY/MM/DD" | "MM/DD" | "YYYY/MM" | "YYYY-MM-DD HH:mm:ss.SSS";
+ Format?: "YYYY/MM/DD" | "MM/DD" | "YYYY/MM" | "YYYY-MM-DD HH:mm:ss.SSS" | "YYYY-MM-DD HH:mm:ss";
picker?: "data" | "week" | "month" | "quarter" | "year";
+ showTime?:boolean
};
type FileFieldProps = BaseFieldProps & {
diff --git a/src/Pages/Admin/City/Page.tsx b/src/Pages/Admin/City/Page.tsx
index 2046780..2972d70 100644
--- a/src/Pages/Admin/City/Page.tsx
+++ b/src/Pages/Admin/City/Page.tsx
@@ -33,7 +33,7 @@ const TableHeader = () => {
ModelAbility={ModalEnum?.CITY_ADD}
canAdd={canAddCity}
/>
-
} filterTitle="table.City" />
+
} haveFilter={false} filterTitle="table.City" />
diff --git a/src/Pages/Admin/Coupon/Model/AddModel.tsx b/src/Pages/Admin/Coupon/Model/AddModel.tsx
new file mode 100644
index 0000000..755c221
--- /dev/null
+++ b/src/Pages/Admin/Coupon/Model/AddModel.tsx
@@ -0,0 +1,38 @@
+import React from "react";
+import { getInitialValues, getValidationSchema } from "./formUtil";
+import { ModalEnum } from "../../../../enums/Model";
+import LayoutModel from "../../../../Layout/Dashboard/LayoutModel";
+import { QueryStatusEnum } from "../../../../enums/QueryStatus";
+import ModelForm from "./ModelForm";
+import { useAddCoupon } from "../../../../api/Coupon";
+import dayjs from "dayjs";
+
+const AddModel: React.FC = () => {
+ const { mutate, status } = useAddCoupon();
+
+ const handleSubmit = (values: any) => {
+ console.log(values?.due_to,"values?.due_to");
+ const due_to = values?.due_to.format("YYYY-MM-DD HH:mm:ss")
+ console.log(due_to);
+ mutate({
+ ...values,
+ due_to
+ });
+ };
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default AddModel;
diff --git a/src/Pages/Admin/Coupon/Model/EditModel.tsx b/src/Pages/Admin/Coupon/Model/EditModel.tsx
new file mode 100644
index 0000000..547f1c6
--- /dev/null
+++ b/src/Pages/Admin/Coupon/Model/EditModel.tsx
@@ -0,0 +1,38 @@
+import React from "react";
+import { getInitialValues, getValidationSchema } from "./formUtil";
+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 { useUpdateCoupon } from "../../../../api/Coupon";
+import { handelImageState } from "../../../../utils/DataToSendImageState";
+
+const EditModel: React.FC = () => {
+ const { mutate, status } = useUpdateCoupon();
+ const { objectToEdit } = useObjectToEdit((state) => state);
+
+ const handleSubmit = (values: any) => {
+ const due_to = typeof values?.due_to === "string" ? values?.due_to : values?.due_to.format("YYYY-MM-DD HH:mm:ss")
+ const Data_to_send = { ...values , due_to };
+ mutate(Data_to_send);
+ };
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default EditModel;
diff --git a/src/Pages/Admin/Coupon/Model/FilterForm.tsx b/src/Pages/Admin/Coupon/Model/FilterForm.tsx
new file mode 100644
index 0000000..c870850
--- /dev/null
+++ b/src/Pages/Admin/Coupon/Model/FilterForm.tsx
@@ -0,0 +1,20 @@
+import React from "react";
+import ValidationField from "../../../../Components/ValidationField/ValidationField";
+import { Col, Row } from "reactstrap";
+import { useFormikContext } from "formik";
+
+const FilterForm = () => {
+ const formik = useFormikContext();
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export default FilterForm;
diff --git a/src/Pages/Admin/Coupon/Model/ModelForm.tsx b/src/Pages/Admin/Coupon/Model/ModelForm.tsx
new file mode 100644
index 0000000..ad316f7
--- /dev/null
+++ b/src/Pages/Admin/Coupon/Model/ModelForm.tsx
@@ -0,0 +1,62 @@
+import { Col, Row } from "reactstrap";
+import ValidationField from "../../../../Components/ValidationField/ValidationField";
+import { useValidationValidationParamState } from "../../../../Components/ValidationField/state/ValidationValidationParamState";
+import { useGetAllGrade } from "../../../../api/grade";
+
+const Form = ({Hide = false}:{Hide?:boolean }) => {
+ const { ValidationParamState } = useValidationValidationParamState();
+
+ const {
+ GradeName, GradeCurrentPage,
+ } = ValidationParamState;
+
+
+
+ const { data: Grade, isLoading: isLoadingGrade } = useGetAllGrade({
+ name: GradeName,
+ page: GradeCurrentPage
+ });
+ const GradeOption = Grade?.data ?? []
+ const canChangeGradePage = !!Grade?.links?.next;
+ const GradePage = Grade?.meta?.currentPage;
+ return (
+
+
+
+
+
+
+
+
+
+ {/*
+ grade_id
+ */}
+ {!Hide &&
+
+
+ }
+
+
+ );
+};
+
+export default Form;
diff --git a/src/Pages/Admin/Coupon/Model/formUtil.ts b/src/Pages/Admin/Coupon/Model/formUtil.ts
new file mode 100644
index 0000000..232a828
--- /dev/null
+++ b/src/Pages/Admin/Coupon/Model/formUtil.ts
@@ -0,0 +1,27 @@
+import * as Yup from "yup";
+import { Coupon, CouponInitialValues } from "../../../../types/Coupon";
+import dayjs from "dayjs";
+
+export const getInitialValues = (
+ objectToEdit: Partial
,
+): CouponInitialValues => {
+ return {
+ id: objectToEdit?.id,
+ name: objectToEdit?.name ?? "",
+ amount: objectToEdit?.amount ?? "",
+ code: objectToEdit?.code ?? "",
+ due_to: objectToEdit?.due_to ? dayjs(objectToEdit?.due_to,"YYYY-MM-DD HH:mm:ss") : "",
+ grade_id: objectToEdit?.grade_id ?? "",
+ };
+};
+
+export const getValidationSchema = () => {
+ // validate input
+ return Yup.object().shape({
+ name: Yup.string().required("validation.required"),
+ due_to: Yup.string().required("validation.required"),
+ code: Yup.string().required("validation.required").min(6,"validation.must_be_at_least_6_characters_long").max(6,"validation.must_be_at_least_6_characters_long"),
+ amount: Yup.number().required("validation.required").typeError("validation.Must_be_a_number"),
+
+ });
+};
diff --git a/src/Pages/Admin/Coupon/Page.tsx b/src/Pages/Admin/Coupon/Page.tsx
new file mode 100644
index 0000000..f41bc54
--- /dev/null
+++ b/src/Pages/Admin/Coupon/Page.tsx
@@ -0,0 +1,49 @@
+import { useTranslation } from "react-i18next";
+import { lazy, Suspense } from "react";
+import { Spin } from "antd";
+import useSetPageTitle from "../../../Hooks/useSetPageTitle";
+import { ModalEnum } from "../../../enums/Model";
+import { useDeleteCoupon } from "../../../api/Coupon";
+import PageHeader from "../../../Layout/Dashboard/PageHeader";
+import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
+import FilterForm from "./Model/FilterForm";
+import { canAddCoupon } from "../../../utils/hasAbilityFn";
+
+const Table = lazy(() => import("./Table"));
+const AddModalForm = lazy(() => import("./Model/AddModel"));
+const EditModalForm = lazy(() => import("./Model/EditModel"));
+const DeleteModalForm = lazy(
+ () => import("../../../Layout/Dashboard/DeleteModels"),
+);
+
+const TableHeader = () => {
+ const [t] = useTranslation();
+ const deleteMutation = useDeleteCoupon();
+
+ useSetPageTitle([
+ {name:`${t(`page_header.home`)}`, path:"/"},
+ {name:`${t(`page_header.Coupon`)}`, path:"Coupon"}
+ ]);
+
+ return (
+
+
}>
+
+
} haveFilter={false} filterTitle="table.Coupon" />
+
+
+
+
+
+
+ );
+};
+
+export default TableHeader;
diff --git a/src/Pages/Admin/Coupon/Table.tsx b/src/Pages/Admin/Coupon/Table.tsx
new file mode 100644
index 0000000..1f704da
--- /dev/null
+++ b/src/Pages/Admin/Coupon/Table.tsx
@@ -0,0 +1,23 @@
+import { useColumns } from "./useTableColumns";
+import React from "react";
+import DataTable from "../../../Layout/Dashboard/Table/DataTable";
+import { useGetAllCoupon } from "../../../api/Coupon";
+import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
+import { useFilterStateState } from "../../../zustand/Filter";
+
+const App: React.FC = () => {
+ const { filterState } = useFilterState();
+ const { Filter } = useFilterStateState();
+ const name = Filter?.name ;
+ const sort_by = Filter?.sort_by ;
+ const response = useGetAllCoupon({
+ pagination: true,
+ ...filterState,
+ name,
+ sort_by
+ });
+
+ return ;
+};
+
+export default App;
diff --git a/src/Pages/Admin/Coupon/useTableColumns.tsx b/src/Pages/Admin/Coupon/useTableColumns.tsx
new file mode 100644
index 0000000..08f0464
--- /dev/null
+++ b/src/Pages/Admin/Coupon/useTableColumns.tsx
@@ -0,0 +1,92 @@
+import { TableColumnsType } from "antd";
+import useModalHandler from "../../../utils/useModalHandler";
+import { ModalEnum } from "../../../enums/Model";
+import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
+import { useTranslation } from "react-i18next";
+import { useNavigate } from "react-router-dom";
+import {
+ canDeleteCoupon,
+ canEditCoupon,
+ canShowCoupon,
+} from "../../../utils/hasAbilityFn";
+import ActionButtons from "../../../Components/Table/ActionButtons";
+import ColumnsImage from "../../../Components/Columns/ColumnsImage";
+import { Coupon } from "../../../types/Coupon";
+import { useFilterStateState } from "../../../zustand/Filter";
+
+export const useColumns = () => {
+ const { handel_open_model } = useModalHandler();
+
+ const { setObjectToEdit } = useObjectToEdit((state) => state);
+ const navigate = useNavigate();
+ const { setFilter } = useFilterStateState();
+
+
+
+ const handelShow = (record: Coupon) => {
+ setFilter({})
+ navigate(`${record?.id}`);
+ };
+
+ const handelDelete = (data: Coupon) => {
+ setObjectToEdit(data);
+ handel_open_model(ModalEnum?.COUPON_DELETE);
+ };
+
+ const handleEdit = (record: Coupon) => {
+ setObjectToEdit(record);
+ handel_open_model(ModalEnum?.COUPON_EDIT);
+ };
+ const [t] = useTranslation();
+
+ const columns: TableColumnsType = [
+ {
+ title: t("columns.id"),
+ dataIndex: "id",
+ key: "id",
+ align: "center",
+ render: (_text, record) => record?.id,
+ },
+ {
+ title: `${t("columns.name")}`,
+ dataIndex: "name",
+ key: "name",
+ align: "center",
+ render: (_text, record) => record?.name,
+ ellipsis:true
+ },
+ {
+ title: t("columns.image"),
+ dataIndex: "image",
+ key: "image",
+ align: "center",
+ render: (_text: any, record: Coupon) => {
+ let str = record?.amount;
+
+ return ;
+ },
+ },
+ {
+
+ title: t("columns.procedure"),
+ key: "actions",
+ align: "center",
+ width: "25vw",
+ render: (_text, record, index) => {
+ return (
+ handelDelete(record)}
+ onEdit={() => handleEdit(record)}
+ onShow={() => handelShow(record)}
+ />
+ );
+ },
+ },
+ ];
+
+ return columns;
+};
diff --git a/src/Pages/Admin/QuestionBank/Page.tsx b/src/Pages/Admin/QuestionBank/Page.tsx
index 6243a34..becb3b5 100644
--- a/src/Pages/Admin/QuestionBank/Page.tsx
+++ b/src/Pages/Admin/QuestionBank/Page.tsx
@@ -29,7 +29,7 @@ const TableHeader = () => {
} filterTitle="table.QuestionBank" />
diff --git a/src/Pages/Admin/QuestionBank/useTableColumns.tsx b/src/Pages/Admin/QuestionBank/useTableColumns.tsx
index 0438bd6..e6912b4 100644
--- a/src/Pages/Admin/QuestionBank/useTableColumns.tsx
+++ b/src/Pages/Admin/QuestionBank/useTableColumns.tsx
@@ -76,9 +76,8 @@ export const useColumns = () => {
key: "hint",
align: "center",
render: (text, record) => {
-
return (
- <>{record?.hint ?? "karim"}>
+ <>{record?.hint ?? "_"}>
);
},
ellipsis: true,
diff --git a/src/Pages/Admin/Tags/Page.tsx b/src/Pages/Admin/Tags/Page.tsx
index 2b61ec2..382cdc7 100644
--- a/src/Pages/Admin/Tags/Page.tsx
+++ b/src/Pages/Admin/Tags/Page.tsx
@@ -37,6 +37,7 @@ const TableHeader = () => {
}
filterTitle="sidebar.tags"
+ haveFilter={false}
/>
{
};
useEffect(() => {
+ console.log(location.pathname);
+ console.log(deletePathSegments(location.pathname, 2));
+
if (isSuccess) {
toast.success(t("validation.the_possess_done_successful"));
- navigate(deletePathSegments(location.pathname, 2));
+ navigate(-1);
+
}
}, [isSuccess]);
diff --git a/src/Pages/Admin/question/Model/ModelForm.tsx b/src/Pages/Admin/question/Model/ModelForm.tsx
index c03aa0f..b559ee4 100644
--- a/src/Pages/Admin/question/Model/ModelForm.tsx
+++ b/src/Pages/Admin/question/Model/ModelForm.tsx
@@ -13,7 +13,6 @@ import { toast } from "react-toastify";
import LaTeXInputMemo from "../../../../Components/LatextInput/LaTeXInputMemo";
import ImageBoxFieldMemo from "../../../../Components/CustomFields/ImageBoxField/ImageBoxFieldMemo";
import useUnsavedChangesWarning from "../../../../Hooks/useUnsavedChangesWarning";
-import SelectTagV2 from "../../../../Components/CustomFields/SelectTagV2";
const Form = () => {
const [t] = useTranslation();
@@ -95,8 +94,8 @@ const Form = () => {
/>
}
- {/* */}
-
+
+
);
diff --git a/src/Pages/Home/Dummy.tsx b/src/Pages/Home/Dummy.tsx
index f6a8ada..f34c07b 100644
--- a/src/Pages/Home/Dummy.tsx
+++ b/src/Pages/Home/Dummy.tsx
@@ -2,6 +2,7 @@
const Dummy = () => {
return (