add coupon
This commit is contained in:
parent
862380b2b3
commit
3525d8f667
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
|
|
@ -24,6 +24,7 @@
|
|||
"toastify",
|
||||
"Viewelement",
|
||||
"webp",
|
||||
"Xmark",
|
||||
"zustand",
|
||||
"مطلوب"
|
||||
],
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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,6 +25,7 @@ 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}
|
||||
/>
|
||||
{/* <DatePicker onChange={onChange} /> */}
|
||||
</ValidationFieldContainer>
|
||||
|
|
|
|||
|
|
@ -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 & {
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ const TableHeader = () => {
|
|||
ModelAbility={ModalEnum?.CITY_ADD}
|
||||
canAdd={canAddCity}
|
||||
/>
|
||||
<FilterLayout sub_children={<FilterForm />} filterTitle="table.City" />
|
||||
<FilterLayout sub_children={<FilterForm />} haveFilter={false} filterTitle="table.City" />
|
||||
<Table />
|
||||
<AddModalForm />
|
||||
<EditModalForm />
|
||||
|
|
|
|||
38
src/Pages/Admin/Coupon/Model/AddModel.tsx
Normal file
38
src/Pages/Admin/Coupon/Model/AddModel.tsx
Normal file
|
|
@ -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 (
|
||||
<>
|
||||
<LayoutModel
|
||||
status={status as QueryStatusEnum}
|
||||
ModelEnum={ModalEnum.COUPON_ADD}
|
||||
modelTitle="Coupon"
|
||||
handleSubmit={handleSubmit}
|
||||
getInitialValues={getInitialValues({})}
|
||||
getValidationSchema={getValidationSchema}
|
||||
>
|
||||
<ModelForm />
|
||||
</LayoutModel>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default AddModel;
|
||||
38
src/Pages/Admin/Coupon/Model/EditModel.tsx
Normal file
38
src/Pages/Admin/Coupon/Model/EditModel.tsx
Normal file
|
|
@ -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 (
|
||||
<>
|
||||
<LayoutModel
|
||||
status={status as QueryStatusEnum}
|
||||
ModelEnum={ModalEnum.COUPON_EDIT}
|
||||
modelTitle="Coupon"
|
||||
handleSubmit={handleSubmit}
|
||||
getInitialValues={getInitialValues(objectToEdit)}
|
||||
getValidationSchema={getValidationSchema}
|
||||
isAddModal={false}
|
||||
>
|
||||
<ModelForm Hide={true} />
|
||||
</LayoutModel>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default EditModel;
|
||||
20
src/Pages/Admin/Coupon/Model/FilterForm.tsx
Normal file
20
src/Pages/Admin/Coupon/Model/FilterForm.tsx
Normal file
|
|
@ -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 (
|
||||
<div>
|
||||
<Row>
|
||||
<Col>
|
||||
<ValidationField placeholder="name" label="name" name="name" />
|
||||
</Col>
|
||||
</Row>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default FilterForm;
|
||||
62
src/Pages/Admin/Coupon/Model/ModelForm.tsx
Normal file
62
src/Pages/Admin/Coupon/Model/ModelForm.tsx
Normal file
|
|
@ -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 (
|
||||
<Row className="w-100">
|
||||
<Col>
|
||||
<ValidationField name="name" placeholder="name" label="name" />
|
||||
<ValidationField name="amount" type="number" placeholder="amount" label="amount" />
|
||||
|
||||
</Col>
|
||||
<Col>
|
||||
<ValidationField
|
||||
name="due_to" type="Date"
|
||||
Format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="due_to" label="due_to"
|
||||
showTime
|
||||
|
||||
/>
|
||||
<ValidationField name="code" placeholder="code" label="code" />
|
||||
{/*
|
||||
grade_id
|
||||
*/}
|
||||
{!Hide &&
|
||||
|
||||
<ValidationField
|
||||
searchBy="GradeName"
|
||||
name="grade_id"
|
||||
label="grade"
|
||||
placeholder="grade"
|
||||
type="Search"
|
||||
option={GradeOption}
|
||||
isLoading={isLoadingGrade}
|
||||
canChangePage={canChangeGradePage}
|
||||
PageName={"GradeCurrentPage"}
|
||||
page={GradePage}
|
||||
|
||||
/>
|
||||
}
|
||||
</Col>
|
||||
</Row>
|
||||
);
|
||||
};
|
||||
|
||||
export default Form;
|
||||
27
src/Pages/Admin/Coupon/Model/formUtil.ts
Normal file
27
src/Pages/Admin/Coupon/Model/formUtil.ts
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
import * as Yup from "yup";
|
||||
import { Coupon, CouponInitialValues } from "../../../../types/Coupon";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
export const getInitialValues = (
|
||||
objectToEdit: Partial<Coupon>,
|
||||
): 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"),
|
||||
|
||||
});
|
||||
};
|
||||
49
src/Pages/Admin/Coupon/Page.tsx
Normal file
49
src/Pages/Admin/Coupon/Page.tsx
Normal file
|
|
@ -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 (
|
||||
<div className="TableWithHeader">
|
||||
<Suspense fallback={<Spin />}>
|
||||
<PageHeader
|
||||
pageTitle="Coupon"
|
||||
ModelAbility={ModalEnum?.COUPON_ADD}
|
||||
canAdd={canAddCoupon}
|
||||
/>
|
||||
<FilterLayout sub_children={<FilterForm />} haveFilter={false} filterTitle="table.Coupon" />
|
||||
<Table />
|
||||
<AddModalForm />
|
||||
<EditModalForm />
|
||||
<DeleteModalForm
|
||||
deleteMutation={deleteMutation}
|
||||
ModelEnum={ModalEnum?.COUPON_DELETE}
|
||||
/>
|
||||
</Suspense>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TableHeader;
|
||||
23
src/Pages/Admin/Coupon/Table.tsx
Normal file
23
src/Pages/Admin/Coupon/Table.tsx
Normal file
|
|
@ -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 <DataTable response={response} useColumns={useColumns} />;
|
||||
};
|
||||
|
||||
export default App;
|
||||
92
src/Pages/Admin/Coupon/useTableColumns.tsx
Normal file
92
src/Pages/Admin/Coupon/useTableColumns.tsx
Normal file
|
|
@ -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<Coupon> = [
|
||||
{
|
||||
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 <ColumnsImage src={str}/> ;
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
title: t("columns.procedure"),
|
||||
key: "actions",
|
||||
align: "center",
|
||||
width: "25vw",
|
||||
render: (_text, record, index) => {
|
||||
return (
|
||||
<ActionButtons
|
||||
canDelete={canDeleteCoupon}
|
||||
canEdit={canEditCoupon}
|
||||
canShow={canShowCoupon}
|
||||
index={index}
|
||||
onDelete={() => handelDelete(record)}
|
||||
onEdit={() => handleEdit(record)}
|
||||
onShow={() => handelShow(record)}
|
||||
/>
|
||||
);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
return columns;
|
||||
};
|
||||
|
|
@ -29,7 +29,7 @@ const TableHeader = () => {
|
|||
<PageHeader
|
||||
pageTitle="QuestionBank"
|
||||
ModelAbility={ModalEnum?.QUESTION_BANK_ADD}
|
||||
canAdd={canAddQuestionBank}
|
||||
canAdd={false}
|
||||
/>
|
||||
<FilterLayout width="700px" search_by="content" sub_children={<FilterForm />} filterTitle="table.QuestionBank" />
|
||||
<Table />
|
||||
|
|
|
|||
|
|
@ -76,9 +76,8 @@ export const useColumns = () => {
|
|||
key: "hint",
|
||||
align: "center",
|
||||
render: (text, record) => {
|
||||
|
||||
return (
|
||||
<>{record?.hint ?? "karim"}</>
|
||||
<>{record?.hint ?? "_"}</>
|
||||
);
|
||||
},
|
||||
ellipsis: true,
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ const TableHeader = () => {
|
|||
<FilterLayout
|
||||
sub_children={<FilterForm />}
|
||||
filterTitle="sidebar.tags"
|
||||
haveFilter={false}
|
||||
/>
|
||||
<Table />
|
||||
<DeleteModalForm
|
||||
|
|
|
|||
|
|
@ -278,9 +278,13 @@ const EditPage: React.FC = () => {
|
|||
};
|
||||
|
||||
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]);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 = () => {
|
|||
|
||||
/>
|
||||
}
|
||||
{/* <SelectTag /> */}
|
||||
<SelectTagV2 />
|
||||
<SelectTag />
|
||||
|
||||
</div>
|
||||
</Row>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
const Dummy = () => {
|
||||
return (
|
||||
<div className="DummyHomePage">
|
||||
karim is op
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { TCrudRoute, TMenuItem } from "./types/App";
|
||||
import { FaCashRegister, FaCity, FaHome, FaMoneyBill, FaPaperclip, FaSellcast, FaTag, FaUser, FaUserShield } from "react-icons/fa";
|
||||
import { FaCashRegister, FaCity, FaHome, FaMonero, FaMoneyBill, FaPaperclip, FaSellcast, FaTag, FaUser, FaUserShield } from "react-icons/fa";
|
||||
import { GoDotFill } from "react-icons/go";
|
||||
import { MdOutlineSell } from "react-icons/md";
|
||||
import { CgProfile } from "react-icons/cg";
|
||||
|
|
@ -46,6 +46,8 @@ const Setting = React.lazy(() => import("./Pages/Admin/Setting/Page"));
|
|||
|
||||
const Permissions = React.lazy(() => import("./Pages/Admin/Roles/Permissions/Page"));
|
||||
const Roles = React.lazy(() => import("./Pages/Admin/Roles/Page"));
|
||||
const Coupon = React.lazy(() => import("./Pages/Admin/Coupon/Page"));
|
||||
|
||||
const Report = React.lazy(() => import("./Pages/Admin/Report/Page"));
|
||||
const Param = React.lazy(() => import("./Pages/Admin/Param/Page"));
|
||||
|
||||
|
|
@ -193,6 +195,16 @@ export const menuItems: TMenuItem[] = [
|
|||
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
|
||||
prevPath: 0,
|
||||
},
|
||||
{
|
||||
header: "page_header.coupon",
|
||||
element: <Coupon />,
|
||||
icon: <FaMoneyBill />,
|
||||
text: "sidebar.coupon",
|
||||
path: `/${ABILITIES_ENUM?.COUPON}`,
|
||||
abilities: ABILITIES_ENUM?.COUPON,
|
||||
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
|
||||
prevPath: 0,
|
||||
},
|
||||
|
||||
|
||||
/// RESELLER /////
|
||||
|
|
|
|||
|
|
@ -2,8 +2,9 @@
|
|||
padding: 20px 20px;
|
||||
border-radius: 10px 10px 0 0;
|
||||
box-shadow: 0px 0px 32px 2px #080F3414;
|
||||
max-width: 85vw;
|
||||
overflow: hidden;
|
||||
// max-width: 85vw;
|
||||
overflow-x: hidden;
|
||||
min-height: fit-content;
|
||||
>div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,17 @@
|
|||
position: relative;
|
||||
margin-bottom: 10px;
|
||||
|
||||
|
||||
// &::after{
|
||||
// position: absolute;
|
||||
// content: "";
|
||||
// top: 40%;
|
||||
// left: 59%;
|
||||
// transform: translate(-50%,-50%);
|
||||
// width: 3px;
|
||||
// height: 78%;
|
||||
// background-color: red;
|
||||
// z-index: 99999;
|
||||
// }
|
||||
}
|
||||
.showPreviewInput{
|
||||
background-color: var(--bg);
|
||||
|
|
|
|||
20
src/api/Coupon.ts
Normal file
20
src/api/Coupon.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import useAddMutation from "./helper/useAddMutation";
|
||||
import useDeleteMutation from "./helper/useDeleteMutation";
|
||||
import useGetQuery from "./helper/useGetQuery";
|
||||
import useUpdateMutation from "./helper/useUpdateMutation";
|
||||
|
||||
const API = {
|
||||
GET: "/coupon",
|
||||
ADD: "/coupon",
|
||||
DELETE: "/coupon",
|
||||
UPDATE: "/coupon",
|
||||
};
|
||||
|
||||
const KEY = "Coupon";
|
||||
|
||||
export const useGetAllCoupon = (params?: any, options?: any) =>
|
||||
useGetQuery(KEY, API.GET, params, options);
|
||||
export const useAddCoupon = () => useAddMutation(KEY, API.ADD);
|
||||
export const useUpdateCoupon = (params?: any) => useUpdateMutation(KEY, API.GET);
|
||||
export const useDeleteCoupon = (params?: any) =>
|
||||
useDeleteMutation(KEY, API.DELETE);
|
||||
|
|
@ -74,6 +74,12 @@ export enum ModalEnum {
|
|||
HOME_WORK_ADD = "homework.add",
|
||||
HOME_WORK_DELETE = "homework.delete",
|
||||
|
||||
//// Coupon
|
||||
|
||||
COUPON_EDIT = "Coupon.edit",
|
||||
COUPON_ADD = "Coupon.add",
|
||||
COUPON_DELETE = "Coupon.delete",
|
||||
|
||||
///// note
|
||||
|
||||
NOTES_EDIT = "notes.edit",
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ export enum ABILITIES_ENUM {
|
|||
Email = "email",
|
||||
Phone = "phone",
|
||||
CITY = "city",
|
||||
COUPON = "coupon",
|
||||
AREA = "area"
|
||||
////
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@
|
|||
"Email_is_required": "البريد الإلكتروني مطلوب",
|
||||
"Password_is_required": "كلمة المرور مطلوبة",
|
||||
"Password_must_be_at_least_8_characters_long": "يجب أن تكون كلمة المرور مكونة من 8 أحرف على الأقل",
|
||||
"must_be_at_least_6_characters_long": "يجب أن تكون مكونة من 6 أحرف على الأقل",
|
||||
|
||||
"Nationality_is_required": "الجنسية مطلوبة",
|
||||
"Address_is_required": "العنوان مطلوب",
|
||||
"Place_of_birth_is_required": "مكان الميلاد مطلوب",
|
||||
|
|
@ -404,7 +406,8 @@
|
|||
"Area":"المنطقة",
|
||||
"City":"مدينة",
|
||||
"add_sales":"إضافة عملية بيع",
|
||||
"are_you_sure_about_sale":"هل أنت متأكد من عملية البيع ؟"
|
||||
"are_you_sure_about_sale":"هل أنت متأكد من عملية البيع ؟",
|
||||
"Coupon":"قسيمة"
|
||||
},
|
||||
"education_class_actions": {
|
||||
"Student_Records": "سجلات الطلاب",
|
||||
|
|
@ -539,7 +542,10 @@
|
|||
"lat":"الطول",
|
||||
"lng":"العرض",
|
||||
"choose":"حدد",
|
||||
"tag":"كلمات مفتاحية"
|
||||
"tag":"كلمات مفتاحية",
|
||||
"code":"رمز",
|
||||
"amount":"كمية",
|
||||
"due_to":"صالح الى"
|
||||
},
|
||||
"select": {
|
||||
"enums": {
|
||||
|
|
@ -876,7 +882,8 @@
|
|||
"sales":"المبيعات",
|
||||
"collections": "التحصيلات",
|
||||
"Area":"المنطقة",
|
||||
"city":"مدينة"
|
||||
"city":"مدينة",
|
||||
"coupon":"قسيمة"
|
||||
},
|
||||
"message": {
|
||||
"some_thing_went_wrong": "حدث خطأ ما",
|
||||
|
|
@ -925,7 +932,8 @@
|
|||
"City":"مدينة",
|
||||
"Area":"المنطقة",
|
||||
"setting":"الإعدادات",
|
||||
"edit_reseller":"تعديل البائع"
|
||||
"edit_reseller":"تعديل البائع",
|
||||
"Coupon":"قسيمة"
|
||||
},
|
||||
"page_header": {
|
||||
"home": "لوحة القيادة",
|
||||
|
|
@ -974,7 +982,8 @@
|
|||
"sales":"المبيعات",
|
||||
"setting":"الإعدادات",
|
||||
"City":"مدينة",
|
||||
"Area":"المنطقة"
|
||||
"Area":"المنطقة",
|
||||
"Coupon":"قسيمة"
|
||||
},
|
||||
"table": {
|
||||
"student": "قائمة الطلاب",
|
||||
|
|
@ -991,6 +1000,7 @@
|
|||
"security_setting":"إعدادات الأمان",
|
||||
"Area":"المنطقة",
|
||||
"City":"مدينة",
|
||||
"Coupon":"قسيمة",
|
||||
"notification":"الاشعارات",
|
||||
"upload_your_photo_and_personal_data_here":"قم بتحميل صورتك وبياناتك الشخصية هنا",
|
||||
"get_notified_of_whats_happening_now_you_can_turn_it_off_at_any_time":"احصل على إشعار بما يحدث الآن ، يمكنك إيقاف تشغيله في أي وقت"
|
||||
|
|
|
|||
21
src/types/Coupon.ts
Normal file
21
src/types/Coupon.ts
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import { Nullable } from "./App";
|
||||
|
||||
// Define the Teacher interface
|
||||
|
||||
export interface InitialValues {
|
||||
id: number; // Unique identifier for the user
|
||||
name: string; // Name of the user
|
||||
amount: string; // URL of the user's amount
|
||||
due_to: any; // URL of the user's amount
|
||||
code: string; // URL of the user's amount
|
||||
grade_id: string; // URL of the user's amount
|
||||
}
|
||||
export type Coupon = {
|
||||
id: number; // Unique identifier for the user
|
||||
name: string; // Name of the user
|
||||
amount: string; // URL of the user's amount
|
||||
due_to: string; // URL of the user's amount
|
||||
code: string; // URL of the user's amount
|
||||
grade_id: string; // URL of the user's amount
|
||||
};
|
||||
export type CouponInitialValues = Partial<Nullable<InitialValues>>;
|
||||
|
|
@ -24,6 +24,31 @@ export const canIndexEduClass = hasAbility(
|
|||
ABILITIES_VALUES_ENUM.INDEX,
|
||||
);
|
||||
|
||||
///// Coupon
|
||||
|
||||
export const canAddCoupon = hasAbility(
|
||||
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||
ABILITIES_VALUES_ENUM.STORE,
|
||||
);
|
||||
export const canEditCoupon = hasAbility(
|
||||
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||
ABILITIES_VALUES_ENUM.UPDATE,
|
||||
);
|
||||
export const canDeleteCoupon = hasAbility(
|
||||
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||
ABILITIES_VALUES_ENUM.DELETE,
|
||||
);
|
||||
export const canShowCoupon = hasAbility(
|
||||
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||
ABILITIES_VALUES_ENUM.SHOW,
|
||||
);
|
||||
export const canIndexCoupon = hasAbility(
|
||||
ABILITIES_ENUM.EDUCATION_CLASS,
|
||||
ABILITIES_VALUES_ENUM.INDEX,
|
||||
);
|
||||
|
||||
|
||||
|
||||
///// City
|
||||
|
||||
export const canAddCity = hasAbility(
|
||||
|
|
|
|||
|
|
@ -7,6 +7,13 @@ export default defineConfig(() => {
|
|||
return {
|
||||
build: {
|
||||
outDir: "build",
|
||||
rollupOptions: {
|
||||
output: {
|
||||
entryFileNames: '[name].[hash].js',
|
||||
chunkFileNames: '[name].[hash].js',
|
||||
assetFileNames: '[name].[hash][extname]',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
plugins: [
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user