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 (
+ karim is op
); }; diff --git a/src/Routes.tsx b/src/Routes.tsx index f5c4ffa..96ffbbf 100644 --- a/src/Routes.tsx +++ b/src/Routes.tsx @@ -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: , + icon: , + text: "sidebar.coupon", + path: `/${ABILITIES_ENUM?.COUPON}`, + abilities: ABILITIES_ENUM?.COUPON, + abilities_value: ABILITIES_VALUES_ENUM.INDEX, + prevPath: 0, + }, /// RESELLER ///// diff --git a/src/Styles/Layout/FilterLayout.scss b/src/Styles/Layout/FilterLayout.scss index 9f556ce..f155cf9 100644 --- a/src/Styles/Layout/FilterLayout.scss +++ b/src/Styles/Layout/FilterLayout.scss @@ -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; diff --git a/src/Styles/components/LaTeXInput.scss b/src/Styles/components/LaTeXInput.scss index 1fdd8b7..6bea0f8 100644 --- a/src/Styles/components/LaTeXInput.scss +++ b/src/Styles/components/LaTeXInput.scss @@ -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); diff --git a/src/api/Coupon.ts b/src/api/Coupon.ts new file mode 100644 index 0000000..261a88a --- /dev/null +++ b/src/api/Coupon.ts @@ -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); diff --git a/src/enums/Model.ts b/src/enums/Model.ts index 1aa011e..c049240 100644 --- a/src/enums/Model.ts +++ b/src/enums/Model.ts @@ -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", diff --git a/src/enums/abilities.ts b/src/enums/abilities.ts index 5e93d10..5182b4d 100644 --- a/src/enums/abilities.ts +++ b/src/enums/abilities.ts @@ -60,6 +60,7 @@ export enum ABILITIES_ENUM { Email = "email", Phone = "phone", CITY = "city", + COUPON = "coupon", AREA = "area" //// } diff --git a/src/translate/ar.json b/src/translate/ar.json index e522906..92b1cb7 100644 --- a/src/translate/ar.json +++ b/src/translate/ar.json @@ -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":"احصل على إشعار بما يحدث الآن ، يمكنك إيقاف تشغيله في أي وقت" diff --git a/src/types/Coupon.ts b/src/types/Coupon.ts new file mode 100644 index 0000000..59bd1b7 --- /dev/null +++ b/src/types/Coupon.ts @@ -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>; diff --git a/src/utils/hasAbilityFn.ts b/src/utils/hasAbilityFn.ts index 3fc88c1..a55bc86 100644 --- a/src/utils/hasAbilityFn.ts +++ b/src/utils/hasAbilityFn.ts @@ -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( diff --git a/vite.config.mjs b/vite.config.mjs index b13c370..71061b4 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -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: [