Compare commits
No commits in common. "d6ae95fbd504923186038355ba964cafdc5e5565" and "ba2b5b411c8920e4ed7d06cf9f9b50ec39429536" have entirely different histories.
d6ae95fbd5
...
ba2b5b411c
|
|
@ -21,8 +21,6 @@ interface LayoutModalProps {
|
||||||
ModelClassName?: string;
|
ModelClassName?: string;
|
||||||
width?: string;
|
width?: string;
|
||||||
isLoading?: boolean;
|
isLoading?: boolean;
|
||||||
buttonTitle?:string;
|
|
||||||
initialButtonName?:boolean
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const LayoutModel = ({
|
const LayoutModel = ({
|
||||||
|
|
@ -37,8 +35,6 @@ const LayoutModel = ({
|
||||||
ModelClassName,
|
ModelClassName,
|
||||||
width = "800px",
|
width = "800px",
|
||||||
isLoading = false,
|
isLoading = false,
|
||||||
buttonTitle,
|
|
||||||
initialButtonName = true,
|
|
||||||
}: LayoutModalProps) => {
|
}: LayoutModalProps) => {
|
||||||
const { isOpen, setIsOpen } = useModalState((state) => state);
|
const { isOpen, setIsOpen } = useModalState((state) => state);
|
||||||
const { setObjectToEdit } = useObjectToEdit();
|
const { setObjectToEdit } = useObjectToEdit();
|
||||||
|
|
@ -71,7 +67,7 @@ const LayoutModel = ({
|
||||||
onCancel={handleCancel}
|
onCancel={handleCancel}
|
||||||
>
|
>
|
||||||
|
|
||||||
<Formik
|
<Formik
|
||||||
enableReinitialize={true}
|
enableReinitialize={true}
|
||||||
initialValues={getInitialValues}
|
initialValues={getInitialValues}
|
||||||
validationSchema={getValidationSchema}
|
validationSchema={getValidationSchema}
|
||||||
|
|
@ -88,9 +84,9 @@ const LayoutModel = ({
|
||||||
|
|
||||||
return <Form className="w-100">
|
return <Form className="w-100">
|
||||||
|
|
||||||
<header>
|
<header>
|
||||||
<span>
|
<span>
|
||||||
{t(`practical.${isAddModal ? "add" : "edit"}`)}{" "}
|
{t(`practical.${isAddModal ? "add" : "edit"}`)}{" "}
|
||||||
{t(`models.${modelTitle}`)}{" "}
|
{t(`models.${modelTitle}`)}{" "}
|
||||||
</span>
|
</span>
|
||||||
<MdCancel onClick={handleCancel} />
|
<MdCancel onClick={handleCancel} />
|
||||||
|
|
@ -109,10 +105,7 @@ const LayoutModel = ({
|
||||||
disabled={status === QueryStatusEnum.LOADING || !formik.dirty}
|
disabled={status === QueryStatusEnum.LOADING || !formik.dirty}
|
||||||
type="submit"
|
type="submit"
|
||||||
>
|
>
|
||||||
{
|
{t(`practical.${isAddModal ? "add" : "edit"}`)}
|
||||||
initialButtonName ? t(`practical.${isAddModal ? "add" : "edit"}`)
|
|
||||||
: t(`practical.${buttonTitle}`)
|
|
||||||
}
|
|
||||||
{status === QueryStatusEnum.LOADING && (
|
{status === QueryStatusEnum.LOADING && (
|
||||||
<span className="Spinier_Div">
|
<span className="Spinier_Div">
|
||||||
<Spin />
|
<Spin />
|
||||||
|
|
|
||||||
|
|
@ -41,12 +41,12 @@ const Page = () => {
|
||||||
<TitleDetailsForm />
|
<TitleDetailsForm />
|
||||||
<PasswordDetailsForm/>
|
<PasswordDetailsForm/>
|
||||||
<AttachmentForm />
|
<AttachmentForm />
|
||||||
{/* <div className="resellerButton">
|
<div className="resellerButton">
|
||||||
<button type="button">{t("practical.cancel")}</button>
|
<button type="button">{t("practical.cancel")}</button>
|
||||||
<button type="submit">
|
<button type="submit">
|
||||||
{t("practical.add")} {t("models.reseller")}
|
{t("practical.add")} {t("models.reseller")}
|
||||||
</button>
|
</button>
|
||||||
</div> */}
|
</div>
|
||||||
</Form>
|
</Form>
|
||||||
</Formik>
|
</Formik>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,40 +1,22 @@
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import useSetPageTitle from "../../../../Hooks/useSetPageTitle";
|
import useSetPageTitle from "../../../../Hooks/useSetPageTitle";
|
||||||
import PageHeader from "../../../../Layout/Dashboard/PageHeader";
|
import PageHeader from "../../../../Layout/Dashboard/PageHeader";
|
||||||
import { Suspense, useEffect } from "react";
|
import { Suspense } from "react";
|
||||||
import { Spin } from "antd";
|
import { Spin } from "antd";
|
||||||
import { ModalEnum } from "../../../../enums/Model";
|
import { ModalEnum } from "../../../../enums/Model";
|
||||||
|
import { canAddReSeller } from "../../../../utils/hasAbilityFn";
|
||||||
import PersonalDetailsForm from "../Form/PersonalDetailsForm";
|
import PersonalDetailsForm from "../Form/PersonalDetailsForm";
|
||||||
import { Formik, Form } from "formik";
|
import { Formik, Form } from "formik";
|
||||||
import { getInitialValues, getValidationSchema } from "../Form/formUtils";
|
import { getInitialValues, getValidationSchema } from "../Form/formUtils";
|
||||||
import TitleDetailsForm from "../Form/TitleDetailsForm";
|
import TitleDetailsForm from "../Form/TitleDetailsForm";
|
||||||
import AttachmentForm from "../Form/AttachmentForm";
|
import AttachmentForm from "../Form/AttachmentForm";
|
||||||
import { useAddReseller } from "../../../../api/reseller";
|
|
||||||
import { useNavigate } from "react-router-dom";
|
|
||||||
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
|
||||||
|
|
||||||
const TableHeader = () => {
|
const TableHeader = () => {
|
||||||
const [t] = useTranslation();
|
const [t] = useTranslation();
|
||||||
const Navigate = useNavigate();
|
|
||||||
const {mutate, isSuccess,status} = useAddReseller();
|
|
||||||
useSetPageTitle(t(`page_header.add_reseller`));
|
useSetPageTitle(t(`page_header.add_reseller`));
|
||||||
const handleSubmit = (values: any) => {
|
const handelSubmit = (values: any) => {
|
||||||
const DataToSend = {
|
console.log(values, "values");
|
||||||
...values,
|
|
||||||
location: {
|
|
||||||
lat: values.lat,
|
|
||||||
lng: values.lng,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
mutate(DataToSend);
|
|
||||||
};
|
};
|
||||||
useEffect(() => {
|
|
||||||
if(isSuccess === true){
|
|
||||||
console.log(1);
|
|
||||||
Navigate('/reseller')
|
|
||||||
}
|
|
||||||
}, [isSuccess])
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="TableWithHeader">
|
<div className="TableWithHeader">
|
||||||
<Suspense fallback={<Spin />}>
|
<Suspense fallback={<Spin />}>
|
||||||
|
|
@ -47,26 +29,19 @@ const TableHeader = () => {
|
||||||
<Formik
|
<Formik
|
||||||
initialValues={getInitialValues({})}
|
initialValues={getInitialValues({})}
|
||||||
validationSchema={getValidationSchema}
|
validationSchema={getValidationSchema}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handelSubmit}
|
||||||
>
|
>
|
||||||
{({ resetForm }) => (
|
<Form className="Form_details_container">
|
||||||
<Form className="Form_details_container">
|
<PersonalDetailsForm />
|
||||||
<PersonalDetailsForm />
|
<TitleDetailsForm />
|
||||||
<TitleDetailsForm />
|
<AttachmentForm />
|
||||||
<AttachmentForm />
|
<div className="resellerButton">
|
||||||
<div className="resellerButton">
|
<button type="button">{t("practical.cancel")}</button>
|
||||||
<button type="button" onClick={() => Navigate('/reseller')}>{t("practical.cancel")}</button>
|
<button type="submit">
|
||||||
<button type="submit">
|
{t("practical.add")} {t("models.reseller")}
|
||||||
{t("practical.add")} {t("models.reseller")}
|
</button>
|
||||||
{status === QueryStatusEnum.LOADING && (
|
</div>
|
||||||
<span className="Spinier_Div">
|
</Form>
|
||||||
<Spin />
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</Form>
|
|
||||||
)}
|
|
||||||
</Formik>
|
</Formik>
|
||||||
</div>
|
</div>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
|
|
|
||||||
|
|
@ -1,84 +1,7 @@
|
||||||
import { useTranslation } from "react-i18next";
|
import React from "react";
|
||||||
import useSetPageTitle from "../../../../Hooks/useSetPageTitle";
|
|
||||||
import PageHeader from "../../../../Layout/Dashboard/PageHeader";
|
|
||||||
import { Suspense, useEffect } from "react";
|
|
||||||
import { Spin } from "antd";
|
|
||||||
import { ModalEnum } from "../../../../enums/Model";
|
|
||||||
import PersonalDetailsForm from "../Form/PersonalDetailsForm";
|
|
||||||
import { Formik, Form } from "formik";
|
|
||||||
import { getInitialValues, getInitialValuesEdit, getValidationSchema } from "../Form/formUtils";
|
|
||||||
import TitleDetailsForm from "../Form/TitleDetailsForm";
|
|
||||||
import AttachmentForm from "../Form/AttachmentForm";
|
|
||||||
import useModalHandler from "../../../../utils/useModalHandler";
|
|
||||||
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
|
|
||||||
import { useUpdateReseller } from "../../../../api/reseller";
|
|
||||||
import { useNavigate } from "react-router-dom";
|
|
||||||
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
|
||||||
|
|
||||||
const TableHeader = ({canEdit,ModelAbility}:{canEdit?: any;ModelAbility?: any;}) => {
|
const Page = () => {
|
||||||
|
return <div>Page</div>;
|
||||||
const [t] = useTranslation();
|
|
||||||
const { objectToEdit , setObjectToEdit } = useObjectToEdit();
|
|
||||||
const {mutate, isSuccess,status} = useUpdateReseller();
|
|
||||||
const Navigate = useNavigate()
|
|
||||||
console.log(objectToEdit);
|
|
||||||
|
|
||||||
useSetPageTitle(t(`page_header.add_reseller`));
|
|
||||||
const handleSubmit = (values: any) => {
|
|
||||||
const DataToSend = {
|
|
||||||
...values,
|
|
||||||
location: {
|
|
||||||
lat: values.lat,
|
|
||||||
lng: values.lng,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
mutate(DataToSend);
|
|
||||||
};
|
|
||||||
useEffect(() => {
|
|
||||||
if(isSuccess === true){
|
|
||||||
console.log(1);
|
|
||||||
Navigate('/reseller')
|
|
||||||
}
|
|
||||||
}, [isSuccess])
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="TableWithHeader">
|
|
||||||
<Suspense fallback={<Spin />}>
|
|
||||||
<PageHeader
|
|
||||||
pageTitle="edit_reseller"
|
|
||||||
ModelAbility={ModalEnum?.RE_SELLER_EDIT}
|
|
||||||
canAdd={false}
|
|
||||||
/>
|
|
||||||
<div>
|
|
||||||
<Formik
|
|
||||||
initialValues={getInitialValuesEdit(objectToEdit)}
|
|
||||||
validationSchema={getValidationSchema}
|
|
||||||
onSubmit={handleSubmit}
|
|
||||||
>
|
|
||||||
{({ resetForm }) => (
|
|
||||||
<Form className="Form_details_container">
|
|
||||||
<PersonalDetailsForm isEdit={true} />
|
|
||||||
<TitleDetailsForm />
|
|
||||||
<AttachmentForm />
|
|
||||||
<div className="resellerButton">
|
|
||||||
<button type="button" onClick={()=>Navigate('/reseller')}>{t("practical.cancel")}</button>
|
|
||||||
<button type="submit">
|
|
||||||
{t("practical.edit")} {t("models.reseller")}
|
|
||||||
{status === QueryStatusEnum.LOADING && (
|
|
||||||
<span className="Spinier_Div">
|
|
||||||
<Spin />
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</Form>
|
|
||||||
)}
|
|
||||||
</Formik>
|
|
||||||
</div>
|
|
||||||
</Suspense>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default TableHeader;
|
export default Page;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ import { convert_data_to_select } from "../../../../Layout/app/Const";
|
||||||
import { userTypeOptions } from "../../../../config/userTypeOptions";
|
import { userTypeOptions } from "../../../../config/userTypeOptions";
|
||||||
import { statusType } from "../../../../config/statusType";
|
import { statusType } from "../../../../config/statusType";
|
||||||
|
|
||||||
const PersonalDetailsForm = ({isEdit}:{isEdit?:boolean}) => {
|
const PersonalDetailsForm = () => {
|
||||||
const [t] = useTranslation();
|
const [t] = useTranslation();
|
||||||
return (
|
return (
|
||||||
<div className="PersonalDetailsForm">
|
<div className="PersonalDetailsForm">
|
||||||
|
|
@ -16,55 +16,6 @@ const PersonalDetailsForm = ({isEdit}:{isEdit?:boolean}) => {
|
||||||
</header>
|
</header>
|
||||||
<main className="main_form_body">
|
<main className="main_form_body">
|
||||||
<ValidationField
|
<ValidationField
|
||||||
name={"first_name"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"first_name"}
|
|
||||||
/>
|
|
||||||
<ValidationField
|
|
||||||
name={"last_name"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"last_name"}
|
|
||||||
/>
|
|
||||||
<ValidationField
|
|
||||||
name={"contact_number1"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"contact_number1"}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<ValidationField
|
|
||||||
name={"contact_number2"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"contact_number2"}
|
|
||||||
/>
|
|
||||||
<ValidationField
|
|
||||||
name={"username"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"username"}
|
|
||||||
type="text"
|
|
||||||
/>
|
|
||||||
{isEdit? "" :
|
|
||||||
<ValidationField
|
|
||||||
name={"password"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"password"}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
<ValidationField
|
|
||||||
name={"card_number"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"ID Number"}
|
|
||||||
/>
|
|
||||||
<ValidationField
|
|
||||||
name={"location_lat"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"lat"}
|
|
||||||
/>
|
|
||||||
<ValidationField
|
|
||||||
name={"location_lng"}
|
|
||||||
placeholder={"_"}
|
|
||||||
label={"lng"}
|
|
||||||
/>
|
|
||||||
{/* <ValidationField
|
|
||||||
name={"id_number"}
|
name={"id_number"}
|
||||||
placeholder={"_"}
|
placeholder={"_"}
|
||||||
label={"ID Number"}
|
label={"ID Number"}
|
||||||
|
|
@ -116,7 +67,7 @@ const PersonalDetailsForm = ({isEdit}:{isEdit?:boolean}) => {
|
||||||
placeholder={"_"}
|
placeholder={"_"}
|
||||||
label={"Seller Percentage"}
|
label={"Seller Percentage"}
|
||||||
type="text"
|
type="text"
|
||||||
/> */}
|
/>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -15,13 +15,13 @@ const TitleDetailsForm = () => {
|
||||||
</header>
|
</header>
|
||||||
<main className="main_form_body">
|
<main className="main_form_body">
|
||||||
<ValidationField
|
<ValidationField
|
||||||
name={"area_id"}
|
name={"city_id"}
|
||||||
placeholder={"_"}
|
placeholder={"_"}
|
||||||
label={"city"}
|
label={"city"}
|
||||||
// type="Select"
|
type="Select"
|
||||||
// option={nationalities}
|
option={nationalities}
|
||||||
/>
|
/>
|
||||||
{/* <ValidationField name={"address"} placeholder={"_"} label={"address"} /> */}
|
<ValidationField name={"address"} placeholder={"_"} label={"address"} />
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,89 +1,13 @@
|
||||||
import * as Yup from "yup";
|
import * as Yup from "yup";
|
||||||
import { objectToKeyValueArray } from "../../../../utils/objectToKeyValueArray";
|
|
||||||
|
|
||||||
interface Location {
|
export const getInitialValues = (objectToEdit: Partial<any>) => {
|
||||||
lat: number;
|
|
||||||
lng: number;
|
|
||||||
}
|
|
||||||
interface User {
|
|
||||||
username: string;
|
|
||||||
phone_number?: number;
|
|
||||||
type?:string
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
interface PersonalDetailsForm {
|
|
||||||
id: number;
|
|
||||||
first_name: string | null;
|
|
||||||
last_name: string | null;
|
|
||||||
location: Location[];
|
|
||||||
contact_number1: string | null;
|
|
||||||
contact_number2: string | null;
|
|
||||||
card_number: string | null;
|
|
||||||
username: string | null;
|
|
||||||
password: string | null;
|
|
||||||
area_id: number | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface PersonalDetailsEditForm {
|
|
||||||
id: number;
|
|
||||||
first_name: string | null;
|
|
||||||
last_name: string | null;
|
|
||||||
location: Location[];
|
|
||||||
contact_number1: string | null;
|
|
||||||
contact_number2: string | null;
|
|
||||||
card_number: string | null;
|
|
||||||
user: User;
|
|
||||||
area_id: number | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getInitialValues = (objectToEdit: Partial<PersonalDetailsForm>) => {
|
|
||||||
const location = objectToEdit?.location?.[0] || { lat: 0, lng: 0 };
|
|
||||||
return {
|
return {
|
||||||
id: objectToEdit?.id ?? 0,
|
id: objectToEdit?.id ?? null,
|
||||||
first_name: objectToEdit?.first_name ?? null,
|
name: objectToEdit?.name ?? null,
|
||||||
last_name: objectToEdit?.last_name ?? null,
|
|
||||||
location_lat: location.lat,
|
|
||||||
location_lng: location.lng,
|
|
||||||
contact_number1: objectToEdit?.contact_number1 ?? null,
|
|
||||||
contact_number2: objectToEdit?.contact_number2 ?? null,
|
|
||||||
card_number: objectToEdit?.card_number ?? null,
|
|
||||||
username: objectToEdit?.username ?? null,
|
|
||||||
password: objectToEdit?.password ?? null,
|
|
||||||
area_id: objectToEdit?.area_id ?? null,
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getValidationSchema = () => {
|
export const getValidationSchema = () => {
|
||||||
// validate input
|
// validate input
|
||||||
return Yup.object().shape({
|
return Yup.object().shape({});
|
||||||
id: Yup.number().required(),
|
|
||||||
first_name: Yup.string().required('first_name is required'),
|
|
||||||
last_name: Yup.string().required('last_name is required'),
|
|
||||||
location_lat: Yup.string().required('lat is required'),
|
|
||||||
location_lng: Yup.string().required('lng is required'),
|
|
||||||
contact_number1: Yup.string().required('contact_number1 is required'),
|
|
||||||
contact_number2: Yup.string().required('contact_number2 is required'),
|
|
||||||
username: Yup.string().required('username is required'),
|
|
||||||
area_id: Yup.number().required('area_id is required'),
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export const getInitialValuesEdit = (objectToEdit: Partial<PersonalDetailsEditForm>) => {
|
|
||||||
const location = objectToEdit?.location || { lat: 0, lng: 0 };
|
|
||||||
console.log(objectToEdit);
|
|
||||||
|
|
||||||
return {
|
|
||||||
id: objectToEdit?.id ?? 0,
|
|
||||||
first_name: objectToEdit?.first_name ?? null,
|
|
||||||
last_name: objectToEdit?.last_name ?? null,
|
|
||||||
location_lat: location.lat,
|
|
||||||
location_lng: location.lng,
|
|
||||||
contact_number1: objectToEdit?.contact_number1 ?? null,
|
|
||||||
contact_number2: objectToEdit?.contact_number2 ?? null,
|
|
||||||
card_number: objectToEdit?.card_number ?? null,
|
|
||||||
username: objectToEdit?.user?.username ?? null,
|
|
||||||
area_id: objectToEdit?.area_id ?? null,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
@ -10,8 +10,6 @@ import { useDeleteTag } from "../../../api/tags";
|
||||||
import PageHeader from "../../../Layout/Dashboard/PageHeader";
|
import PageHeader from "../../../Layout/Dashboard/PageHeader";
|
||||||
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
|
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
|
||||||
import FilterForm from "./Form/FilterForm";
|
import FilterForm from "./Form/FilterForm";
|
||||||
import EditReSeller from "./Edit/Page";
|
|
||||||
import { useDeleteReseller } from "../../../api/reseller";
|
|
||||||
const Table = lazy(() => import("./Table"));
|
const Table = lazy(() => import("./Table"));
|
||||||
const DeleteModalForm = lazy(
|
const DeleteModalForm = lazy(
|
||||||
() => import("../../../Layout/Dashboard/DeleteModels"),
|
() => import("../../../Layout/Dashboard/DeleteModels"),
|
||||||
|
|
@ -26,7 +24,7 @@ const TableHeader = () => {
|
||||||
{name:`${t(`page_header.home`)}`, path:"/"},
|
{name:`${t(`page_header.home`)}`, path:"/"},
|
||||||
{name:`${t(`page_header.reseller`)}`, path:"reseller"}
|
{name:`${t(`page_header.reseller`)}`, path:"reseller"}
|
||||||
]);
|
]);
|
||||||
const deleteMutation = useDeleteReseller();
|
const deleteMutation = useDeleteTag();
|
||||||
return (
|
return (
|
||||||
<div className="TableWithHeader">
|
<div className="TableWithHeader">
|
||||||
<Suspense fallback={<Spin />}>
|
<Suspense fallback={<Spin />}>
|
||||||
|
|
@ -42,7 +40,6 @@ const TableHeader = () => {
|
||||||
filterTitle="table.reseller"
|
filterTitle="table.reseller"
|
||||||
/>
|
/>
|
||||||
<Table />
|
<Table />
|
||||||
{/* <EditReSeller/> */}
|
|
||||||
<DeleteModalForm
|
<DeleteModalForm
|
||||||
deleteMutation={deleteMutation}
|
deleteMutation={deleteMutation}
|
||||||
ModelEnum={ModalEnum?.RE_SELLER_DELETE}
|
ModelEnum={ModalEnum?.RE_SELLER_DELETE}
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,13 @@ 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 { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useNavigate, useParams } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import {
|
import {
|
||||||
canDeleteReSeller,
|
canDeleteReSeller,
|
||||||
canEditReSeller,
|
canEditReSeller,
|
||||||
canShowReSeller,
|
canShowReSeller,
|
||||||
} from "../../../utils/hasAbilityFn";
|
} from "../../../utils/hasAbilityFn";
|
||||||
import ActionButtons from "../../../Components/Table/ActionButtons";
|
import ActionButtons from "../../../Components/Table/ActionButtons";
|
||||||
import { ABILITIES_ENUM } from "../../../enums/abilities";
|
|
||||||
|
|
||||||
export const useColumns = () => {
|
export const useColumns = () => {
|
||||||
const { handel_open_model } = useModalHandler();
|
const { handel_open_model } = useModalHandler();
|
||||||
|
|
@ -28,9 +27,9 @@ export const useColumns = () => {
|
||||||
handel_open_model(ModalEnum?.RE_SELLER_DELETE);
|
handel_open_model(ModalEnum?.RE_SELLER_DELETE);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleEdit = (record: ReSeller) => {
|
const handleEdit = (record: ReSeller) => {
|
||||||
setObjectToEdit(record);
|
setObjectToEdit(record);
|
||||||
navigate(`/${ABILITIES_ENUM?.RE_SELLER}/${record?.id}/edit`)
|
handel_open_model(ModalEnum?.RE_SELLER_EDIT);
|
||||||
};
|
};
|
||||||
const [t] = useTranslation();
|
const [t] = useTranslation();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ const NotificationCard = ({
|
||||||
const {t} = useTranslation();
|
const {t} = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='notification_card_setting'>
|
<div className='notification_card'>
|
||||||
<div>
|
<div>
|
||||||
<h5>{t(`${name}`)}</h5>
|
<h5>{t(`${name}`)}</h5>
|
||||||
<p>{t(`${description}`)}</p>
|
<p>{t(`${description}`)}</p>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import { Form, useFormikContext } from "formik";
|
||||||
|
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import ValidationField from "../../Components/ValidationField/ValidationField";
|
import ValidationField from "../../Components/ValidationField/ValidationField";
|
||||||
import { Input } from "antd";
|
|
||||||
|
|
||||||
type FormFieldType = {
|
type FormFieldType = {
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
|
|
@ -19,7 +18,7 @@ const FormField = ({ isLoading }: FormFieldType) => {
|
||||||
|
|
||||||
<ValidationField name="username" label="username" />
|
<ValidationField name="username" label="username" />
|
||||||
|
|
||||||
<ValidationField name="password" label="password" as={Input.Password} />
|
<ValidationField name="password" label="password" />
|
||||||
|
|
||||||
<button disabled={ !isValid || isLoading} type="submit" className="auth_submit_button">
|
<button disabled={ !isValid || isLoading} type="submit" className="auth_submit_button">
|
||||||
{t("practical.login")}
|
{t("practical.login")}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ const CollectionInfoCard = ({label,value}:{label:string,value:string}) => {
|
||||||
const {t} = useTranslation();
|
const {t} = useTranslation();
|
||||||
return (
|
return (
|
||||||
<div className='collection_info_card'>
|
<div className='collection_info_card'>
|
||||||
<h5>{t(`card.${label}`)}</h5>
|
<h5>{t(label)}</h5>
|
||||||
<p>{t(value)}</p>
|
<p>{t(value)}</p>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
import React from 'react'
|
|
||||||
import CollectionInfoCard from './CollectionInfoCard'
|
|
||||||
import { useTranslation } from 'react-i18next'
|
|
||||||
|
|
||||||
const CollectionsCards = ({data}:{data?:any}) => {
|
|
||||||
const {t} = useTranslation();
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<CollectionInfoCard
|
|
||||||
label={t('total_sells')}
|
|
||||||
value={"210"}
|
|
||||||
/>
|
|
||||||
<CollectionInfoCard
|
|
||||||
label={t('reseller_profit')}
|
|
||||||
value={"210"}
|
|
||||||
/>
|
|
||||||
<CollectionInfoCard
|
|
||||||
label={t('company_profit')}
|
|
||||||
value={"210"}
|
|
||||||
/>
|
|
||||||
<CollectionInfoCard
|
|
||||||
label={t('collected')}
|
|
||||||
value={"210"}
|
|
||||||
/>
|
|
||||||
<CollectionInfoCard
|
|
||||||
label={t('residual')}
|
|
||||||
value={"210"}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CollectionsCards
|
|
||||||
|
|
@ -5,7 +5,8 @@ import useSetPageTitle from "../../../Hooks/useSetPageTitle";
|
||||||
import PageHeader from "../../../Layout/Dashboard/PageHeader";
|
import PageHeader from "../../../Layout/Dashboard/PageHeader";
|
||||||
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
|
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
|
||||||
import FilterForm from "./Model/FilterForm";
|
import FilterForm from "./Model/FilterForm";
|
||||||
import CollectionsCards from "./Model/CollectionsCards";
|
import CollectionInfoCard from "./Model/CollectionInfoCard";
|
||||||
|
import { CollectionData } from "../../../faker/item";
|
||||||
const Table = lazy(() => import("./Table"));
|
const Table = lazy(() => import("./Table"));
|
||||||
|
|
||||||
const TableHeader = () => {
|
const TableHeader = () => {
|
||||||
|
|
@ -22,7 +23,9 @@ const TableHeader = () => {
|
||||||
pageTitle="collections"
|
pageTitle="collections"
|
||||||
/>
|
/>
|
||||||
<div className="collection_infos">
|
<div className="collection_infos">
|
||||||
<CollectionsCards/>
|
{CollectionData?.map((collection:any)=>(
|
||||||
|
<CollectionInfoCard label={collection.label} value={collection.value}/>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
<FilterLayout
|
<FilterLayout
|
||||||
sub_children={<FilterForm />}
|
sub_children={<FilterForm />}
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,13 @@ import DataTable from "../../../Layout/Dashboard/Table/DataTable";
|
||||||
import { useColumns } from "./useTableColumns";
|
import { useColumns } from "./useTableColumns";
|
||||||
import useSearchQuery from "../../../api/utils/useSearchQuery";
|
import useSearchQuery from "../../../api/utils/useSearchQuery";
|
||||||
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
|
import { useFilterState } from "../../../Components/Utils/Filter/FilterState";
|
||||||
import { useGetAllCollections } from "../../../api/collections";
|
import { useGetAllSales } from "../../../api/sales";
|
||||||
|
|
||||||
const App: React.FC = () => {
|
const App: React.FC = () => {
|
||||||
const [searchQuery] = useSearchQuery("name");
|
const [searchQuery] = useSearchQuery("name");
|
||||||
const { filterState } = useFilterState();
|
const { filterState } = useFilterState();
|
||||||
|
|
||||||
const response = useGetAllCollections({
|
const response = useGetAllSales({
|
||||||
name: searchQuery,
|
name: searchQuery,
|
||||||
pagination: true,
|
pagination: true,
|
||||||
...filterState,
|
...filterState,
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,15 @@ import Table from "./Table";
|
||||||
|
|
||||||
import { FaPlus } from "react-icons/fa";
|
import { FaPlus } from "react-icons/fa";
|
||||||
|
|
||||||
|
import AddModalForm from "./Model/AddModel";
|
||||||
|
import EditModalForm from "./Model/EditModel";
|
||||||
|
// import DeleteModalForm from "../../";
|
||||||
|
|
||||||
export {
|
export {
|
||||||
Table,
|
Table,
|
||||||
useColumns,
|
useColumns,
|
||||||
|
AddModalForm,
|
||||||
|
EditModalForm,
|
||||||
|
// DeleteModalForm,
|
||||||
FaPlus,
|
FaPlus,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -41,12 +41,12 @@ const Page = () => {
|
||||||
<TitleDetailsForm />
|
<TitleDetailsForm />
|
||||||
<PasswordDetailsForm/>
|
<PasswordDetailsForm/>
|
||||||
<AttachmentForm />
|
<AttachmentForm />
|
||||||
{/* <div className="resellerButton">
|
<div className="resellerButton">
|
||||||
<button type="button">{t("practical.cancel")}</button>
|
<button type="button">{t("practical.cancel")}</button>
|
||||||
<button type="submit">
|
<button type="submit">
|
||||||
{t("practical.add")} {t("models.reseller")}
|
{t("practical.add")} {t("models.reseller")}
|
||||||
</button>
|
</button>
|
||||||
</div> */}
|
</div>
|
||||||
</Form>
|
</Form>
|
||||||
</Formik>
|
</Formik>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,53 +1,31 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
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 { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
||||||
import ValidationModelForm from "./ValidationModelForm";
|
import ModelForm from "./ModelForm";
|
||||||
import SalesModelForm from "./SalesModelForm";
|
import { useAddStudentPackage } from "../../../../api/studentPackage";
|
||||||
import SubmitModelForm from "./SubmitModelForm";
|
|
||||||
|
|
||||||
import { useAddSales } from "../../../../api/sales";
|
import { useAddSales } from "../../../../api/sales";
|
||||||
import LayoutModel from "./LayoutModel";
|
|
||||||
|
|
||||||
const AddModel: React.FC = () => {
|
const AddModel: React.FC = () => {
|
||||||
const { mutate, status } = useAddSales();
|
const { mutate, status } = useAddSales();
|
||||||
|
|
||||||
const handleSubmit = (values: any) => {
|
const handleSubmit = (values: any) => {
|
||||||
// mutate({
|
mutate({
|
||||||
// ...values,
|
...values,
|
||||||
// });
|
});
|
||||||
};
|
};
|
||||||
enum modal {
|
|
||||||
Number= 0,
|
|
||||||
Package= 1,
|
|
||||||
Sure= 2
|
|
||||||
}
|
|
||||||
|
|
||||||
const Forms = {
|
|
||||||
[modal.Number]: <ValidationModelForm /> ,
|
|
||||||
[modal.Package] : <SalesModelForm /> ,
|
|
||||||
[modal.Sure]: <SubmitModelForm />
|
|
||||||
}
|
|
||||||
// const modelTitle = Forms.[modal.Number] ? "sale" : Forms.Package ? "adcs" : "Ascas";
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<LayoutModel
|
<LayoutModel
|
||||||
status={status as QueryStatusEnum}
|
status={status as QueryStatusEnum}
|
||||||
ModelEnum={ModalEnum.Sales_ADD}
|
ModelEnum={ModalEnum.Sales_ADD}
|
||||||
modelTitle={"modelTitle"}
|
modelTitle="sale"
|
||||||
handleSubmit={handleSubmit}
|
handleSubmit={handleSubmit}
|
||||||
getInitialValues={getInitialValues({})}
|
getInitialValues={getInitialValues({})}
|
||||||
getValidationSchema={getValidationSchema}
|
getValidationSchema={getValidationSchema}
|
||||||
initialButtonName={false}
|
|
||||||
buttonTitle="search"
|
|
||||||
>
|
>
|
||||||
{/* {Forms["Number"]} */}
|
<ModelForm />
|
||||||
<>
|
|
||||||
<SalesModelForm/>
|
|
||||||
</>
|
|
||||||
|
|
||||||
</LayoutModel>
|
</LayoutModel>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,103 +0,0 @@
|
||||||
import React, { useEffect } from "react";
|
|
||||||
import { Divider, Modal, Spin } from "antd";
|
|
||||||
import { useModalState } from "../../../../zustand/Modal";
|
|
||||||
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
|
||||||
import SpinContainer from "../../../../Components/Layout/SpinContainer";
|
|
||||||
import { MdCancel } from "react-icons/md";
|
|
||||||
import { Form, Formik } from "formik";
|
|
||||||
|
|
||||||
interface LayoutModalProps {
|
|
||||||
isAddModal?: boolean;
|
|
||||||
modelTitle: string;
|
|
||||||
handleSubmit: (values: any) => void;
|
|
||||||
getInitialValues: any;
|
|
||||||
getValidationSchema: any;
|
|
||||||
children: React.ReactNode;
|
|
||||||
status: QueryStatusEnum;
|
|
||||||
ModelEnum: any;
|
|
||||||
ModelClassName?: string;
|
|
||||||
width?: string;
|
|
||||||
isLoading?: boolean;
|
|
||||||
buttonTitle?:string;
|
|
||||||
initialButtonName?:boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
const LayoutModel = ({
|
|
||||||
isAddModal = true,
|
|
||||||
children,
|
|
||||||
handleSubmit = () => {},
|
|
||||||
getInitialValues,
|
|
||||||
getValidationSchema,
|
|
||||||
status,
|
|
||||||
modelTitle,
|
|
||||||
ModelEnum,
|
|
||||||
ModelClassName,
|
|
||||||
width = "800px",
|
|
||||||
isLoading = false,
|
|
||||||
buttonTitle,
|
|
||||||
initialButtonName = true,
|
|
||||||
}: LayoutModalProps) => {
|
|
||||||
const { isOpen, setIsOpen } = useModalState((state) => state);
|
|
||||||
const { setObjectToEdit } = useObjectToEdit();
|
|
||||||
useEffect(() => {
|
|
||||||
if (isAddModal && status === QueryStatusEnum.SUCCESS) {
|
|
||||||
setIsOpen("isSuccess");
|
|
||||||
setObjectToEdit({});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (status === QueryStatusEnum.SUCCESS) {
|
|
||||||
setIsOpen("");
|
|
||||||
setObjectToEdit({});
|
|
||||||
}
|
|
||||||
}, [setIsOpen, status]);
|
|
||||||
|
|
||||||
const handleCancel = () => {
|
|
||||||
setIsOpen("");
|
|
||||||
setObjectToEdit({});
|
|
||||||
};
|
|
||||||
|
|
||||||
const [t] = useTranslation();
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Modal
|
|
||||||
className={"ModalForm " + ModelClassName}
|
|
||||||
centered
|
|
||||||
width={width}
|
|
||||||
footer={null}
|
|
||||||
open={isOpen === ModelEnum}
|
|
||||||
onCancel={handleCancel}
|
|
||||||
>
|
|
||||||
|
|
||||||
<Formik
|
|
||||||
enableReinitialize={true}
|
|
||||||
initialValues={getInitialValues}
|
|
||||||
validationSchema={getValidationSchema}
|
|
||||||
onSubmit={handleSubmit}
|
|
||||||
|
|
||||||
>
|
|
||||||
{(formik) => {
|
|
||||||
useEffect(() => {
|
|
||||||
if (isOpen === "" || isOpen === "isSuccess") {
|
|
||||||
formik.setErrors({});
|
|
||||||
formik.resetForm();
|
|
||||||
}
|
|
||||||
}, [isOpen]);
|
|
||||||
|
|
||||||
return <Form className="w-100 reseller_modal_form">
|
|
||||||
|
|
||||||
<Divider />
|
|
||||||
<main className="main_modal">
|
|
||||||
{isLoading ? <SpinContainer /> : children}
|
|
||||||
</main>
|
|
||||||
|
|
||||||
</Form>;
|
|
||||||
}}
|
|
||||||
</Formik>
|
|
||||||
</Modal>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default LayoutModel;
|
|
||||||
26
src/Pages/ReSeller/Sales/Model/ModelForm.tsx
Normal file
26
src/Pages/ReSeller/Sales/Model/ModelForm.tsx
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
import { Col, Row } from "reactstrap";
|
||||||
|
import ValidationField from "../../../../Components/ValidationField/ValidationField";
|
||||||
|
import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect";
|
||||||
|
|
||||||
|
const Form = ({ isEdit }: { isEdit?: boolean }) => {
|
||||||
|
const typeOptions = [
|
||||||
|
{ id: "student", name: "student" },
|
||||||
|
{ id: "reseller", name: "reseller" },
|
||||||
|
{ id: "admin", name: "admin" },
|
||||||
|
];
|
||||||
|
const typeArray = useFormatDataToSelect(typeOptions);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Row className="w-100">
|
||||||
|
<Col>
|
||||||
|
<ValidationField
|
||||||
|
placeholder="phone_number"
|
||||||
|
label="phone_number"
|
||||||
|
name="phone_number"
|
||||||
|
/>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Form;
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
import { Col, Row } from "reactstrap";
|
|
||||||
import ValidationField from "../../../../Components/ValidationField/ValidationField";
|
|
||||||
import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect";
|
|
||||||
import { useFormikContext } from "formik";
|
|
||||||
import { useModalState } from "../../../../zustand/Modal";
|
|
||||||
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
|
||||||
import { Divider, Spin } from "antd";
|
|
||||||
import { MdCancel } from "react-icons/md";
|
|
||||||
|
|
||||||
const Form = ({status}:{status?:any}) => {
|
|
||||||
|
|
||||||
const {values,setFieldValue} = useFormikContext<any>()
|
|
||||||
console.log(values?.currentModalIndex);
|
|
||||||
const { isOpen, setIsOpen } = useModalState((state) => state);
|
|
||||||
const { setObjectToEdit } = useObjectToEdit();
|
|
||||||
const {t} = useTranslation();
|
|
||||||
const formik = useFormikContext();
|
|
||||||
const handleNext = ()=>{
|
|
||||||
setFieldValue( "currentModalIndex" , values?.currentModalIndex + 1 )
|
|
||||||
}
|
|
||||||
const handleCancel = () => {
|
|
||||||
setIsOpen("");
|
|
||||||
setObjectToEdit({});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
values?.currentModalIndex == 0 &&
|
|
||||||
|
|
||||||
<div className="w-100">
|
|
||||||
<header className="modal_title">
|
|
||||||
<span>
|
|
||||||
{t(`models.add_sales`)}{" "}
|
|
||||||
</span>
|
|
||||||
<MdCancel onClick={handleCancel} />
|
|
||||||
</header>
|
|
||||||
<Divider />
|
|
||||||
sac
|
|
||||||
{values?.currentModalIndex}
|
|
||||||
<div className="buttons">
|
|
||||||
<div className="back_button pointer" onClick={handleCancel}>
|
|
||||||
{t("practical.cancel")}
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
className="add_button"
|
|
||||||
disabled={status === QueryStatusEnum.LOADING || !formik.dirty}
|
|
||||||
onClick={handleNext}
|
|
||||||
>
|
|
||||||
{t(`practical.search`)}
|
|
||||||
{status === QueryStatusEnum.LOADING && (
|
|
||||||
<span className="Spinier_Div">
|
|
||||||
<Spin />
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Form;
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
import { Col, Row } from "reactstrap";
|
|
||||||
import ValidationField from "../../../../Components/ValidationField/ValidationField";
|
|
||||||
import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect";
|
|
||||||
import { useFormikContext } from "formik";
|
|
||||||
import { useModalState } from "../../../../zustand/Modal";
|
|
||||||
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
|
||||||
import { Divider, Spin } from "antd";
|
|
||||||
import { MdCancel } from "react-icons/md";
|
|
||||||
|
|
||||||
const Form = ({status}:{status?:any}) => {
|
|
||||||
|
|
||||||
const {values,setFieldValue} = useFormikContext<any>()
|
|
||||||
console.log(values?.currentModalIndex);
|
|
||||||
const { isOpen, setIsOpen } = useModalState((state) => state);
|
|
||||||
const { setObjectToEdit } = useObjectToEdit();
|
|
||||||
const {t} = useTranslation();
|
|
||||||
const formik = useFormikContext();
|
|
||||||
const handleNext = ()=>{
|
|
||||||
setFieldValue( "currentModalIndex" , values?.currentModalIndex + 1 )
|
|
||||||
}
|
|
||||||
const handleCancel = () => {
|
|
||||||
setIsOpen("");
|
|
||||||
setObjectToEdit({});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
values?.currentModalIndex == 1 &&
|
|
||||||
|
|
||||||
<div className="w-100">
|
|
||||||
<header className="modal_title">
|
|
||||||
<span>
|
|
||||||
{t(`models.are_you_sure_about_sale`)}{" "}
|
|
||||||
</span>
|
|
||||||
<MdCancel onClick={handleCancel} />
|
|
||||||
</header>
|
|
||||||
<Divider />
|
|
||||||
|
|
||||||
{values?.currentModalIndex}
|
|
||||||
<div className="buttons">
|
|
||||||
<div className="back_button pointer" onClick={handleCancel}>
|
|
||||||
{t("practical.cancel")}
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
className="add_button"
|
|
||||||
disabled={status === QueryStatusEnum.LOADING || !formik.dirty}
|
|
||||||
onClick={handleNext}
|
|
||||||
>
|
|
||||||
{t(`practical.search`)}
|
|
||||||
{status === QueryStatusEnum.LOADING && (
|
|
||||||
<span className="Spinier_Div">
|
|
||||||
<Spin />
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Form;
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
import { Col, Row } from "reactstrap";
|
|
||||||
import ValidationField from "../../../../Components/ValidationField/ValidationField";
|
|
||||||
import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect";
|
|
||||||
import { useFormikContext } from "formik";
|
|
||||||
import { useModalState } from "../../../../zustand/Modal";
|
|
||||||
import { useObjectToEdit } from "../../../../zustand/ObjectToEditState";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import { QueryStatusEnum } from "../../../../enums/QueryStatus";
|
|
||||||
import { Divider, Spin } from "antd";
|
|
||||||
import { MdCancel } from "react-icons/md";
|
|
||||||
|
|
||||||
const Form = ({status}:{status?:any}) => {
|
|
||||||
|
|
||||||
const {values,setFieldValue} = useFormikContext<any>()
|
|
||||||
console.log(values?.currentModalIndex);
|
|
||||||
const { isOpen, setIsOpen } = useModalState((state) => state);
|
|
||||||
const { setObjectToEdit } = useObjectToEdit();
|
|
||||||
const {t} = useTranslation();
|
|
||||||
const formik = useFormikContext();
|
|
||||||
const handleNext = ()=>{
|
|
||||||
setFieldValue( "currentModalIndex" , values?.currentModalIndex + 1 )
|
|
||||||
}
|
|
||||||
const handleCancel = () => {
|
|
||||||
setIsOpen("");
|
|
||||||
setObjectToEdit({});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
values?.currentModalIndex == 1 &&
|
|
||||||
|
|
||||||
<div className="w-100">
|
|
||||||
<header className="modal_title">
|
|
||||||
<span>
|
|
||||||
{t(`models.`)}{" "}
|
|
||||||
</span>
|
|
||||||
<MdCancel onClick={handleCancel} />
|
|
||||||
</header>
|
|
||||||
<Divider />
|
|
||||||
|
|
||||||
<Row className="w-100">
|
|
||||||
<Col>
|
|
||||||
<ValidationField
|
|
||||||
placeholder="phone_number"
|
|
||||||
label="phone_number"
|
|
||||||
name="phone_number"
|
|
||||||
/>
|
|
||||||
<Divider className="margin_auto"/>
|
|
||||||
</Col>
|
|
||||||
{values?.currentModalIndex}
|
|
||||||
<div className="buttons">
|
|
||||||
<div className="back_button pointer" onClick={handleCancel}>
|
|
||||||
{t("practical.cancel")}
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
className="add_button"
|
|
||||||
disabled={status === QueryStatusEnum.LOADING || !formik.dirty}
|
|
||||||
onClick={handleNext}
|
|
||||||
>
|
|
||||||
{t(`practical.search`)}
|
|
||||||
{status === QueryStatusEnum.LOADING && (
|
|
||||||
<span className="Spinier_Div">
|
|
||||||
<Spin />
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</Row>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Form;
|
|
||||||
|
|
@ -4,16 +4,10 @@ export const getInitialValues = (objectToEdit: any): any => {
|
||||||
return {
|
return {
|
||||||
id: objectToEdit?.id ?? null,
|
id: objectToEdit?.id ?? null,
|
||||||
phone_number: objectToEdit?.phone_number ?? null,
|
phone_number: objectToEdit?.phone_number ?? null,
|
||||||
currentModalIndex: 0
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getValidationSchema = () => {
|
export const getValidationSchema = () => {
|
||||||
return Yup.object().shape({
|
return Yup.object().shape({
|
||||||
phone_number: Yup.string()
|
phone_number: Yup.number().required("validation.required"),
|
||||||
.required("Phone number is required")
|
|
||||||
.length(10, "Phone number must be exactly 10 numbers")
|
|
||||||
.matches(/^\d{10}$/, "Phone number must be a valid 10-number number"),
|
|
||||||
currentModalIndex: Yup.number().max(2)
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import { lazy, Suspense } from "react";
|
||||||
import { Spin } from "antd";
|
import { Spin } from "antd";
|
||||||
import { canAddSales } from "../../../utils/hasAbilityFn";
|
import { canAddSales } from "../../../utils/hasAbilityFn";
|
||||||
import useSetPageTitle from "../../../Hooks/useSetPageTitle";
|
import useSetPageTitle from "../../../Hooks/useSetPageTitle";
|
||||||
|
import { useDeleteTag } from "../../../api/tags";
|
||||||
import PageHeader from "../../../Layout/Dashboard/PageHeader";
|
import PageHeader from "../../../Layout/Dashboard/PageHeader";
|
||||||
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
|
import FilterLayout from "../../../Layout/Dashboard/FilterLayout";
|
||||||
import FilterForm from "./Model/FilterForm";
|
import FilterForm from "./Model/FilterForm";
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
import { TCrudRoute, TMenuItem } from "./types/App";
|
import { TCrudRoute, TMenuItem } from "./types/App";
|
||||||
import { FaCashRegister, FaHome, FaMoneyBill, FaPaperclip, FaSellcast, FaTag, FaUser, FaUserShield } from "react-icons/fa";
|
import { FaCashRegister, FaHome, FaMoneyBill, FaPaperclip, FaSellcast, FaTag, FaUser, FaUserShield } from "react-icons/fa";
|
||||||
import { GoDotFill } from "react-icons/go";
|
import { GoDotFill } from "react-icons/go";
|
||||||
import { MdOutlineSell } from "react-icons/md";
|
|
||||||
import { CgProfile } from "react-icons/cg";
|
|
||||||
import { GrGroup } from "react-icons/gr";
|
import { GrGroup } from "react-icons/gr";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
|
|
@ -184,7 +182,7 @@ export const menuItems: TMenuItem[] = [
|
||||||
{
|
{
|
||||||
header: "page_header.sales",
|
header: "page_header.sales",
|
||||||
element: <Sales />,
|
element: <Sales />,
|
||||||
icon: <MdOutlineSell />,
|
icon: <FaSellcast />,
|
||||||
text: "sidebar.sales",
|
text: "sidebar.sales",
|
||||||
path: `/${ABILITIES_ENUM?.Sales}`,
|
path: `/${ABILITIES_ENUM?.Sales}`,
|
||||||
abilities: ABILITIES_ENUM?.Sales,
|
abilities: ABILITIES_ENUM?.Sales,
|
||||||
|
|
@ -195,7 +193,7 @@ export const menuItems: TMenuItem[] = [
|
||||||
{
|
{
|
||||||
header: "page_header.collections",
|
header: "page_header.collections",
|
||||||
element: <Collections />,
|
element: <Collections />,
|
||||||
icon: <FaMoneyBill />,
|
icon: <FaSellcast />,
|
||||||
text: "sidebar.collections",
|
text: "sidebar.collections",
|
||||||
path: `/${ABILITIES_ENUM?.Collections}`,
|
path: `/${ABILITIES_ENUM?.Collections}`,
|
||||||
abilities: ABILITIES_ENUM?.Collections,
|
abilities: ABILITIES_ENUM?.Collections,
|
||||||
|
|
@ -206,7 +204,7 @@ export const menuItems: TMenuItem[] = [
|
||||||
{
|
{
|
||||||
header: "page_header.profile",
|
header: "page_header.profile",
|
||||||
element: <ProfileReSeller />,
|
element: <ProfileReSeller />,
|
||||||
icon: <CgProfile />,
|
icon: <FaSellcast />,
|
||||||
text: "sidebar.profile",
|
text: "sidebar.profile",
|
||||||
path: `/${ABILITIES_ENUM?.PROFILE}`,
|
path: `/${ABILITIES_ENUM?.PROFILE}`,
|
||||||
abilities: ABILITIES_ENUM?.Profile_RE_SELLER,
|
abilities: ABILITIES_ENUM?.Profile_RE_SELLER,
|
||||||
|
|
@ -268,6 +266,7 @@ export const CrudRoute: TCrudRoute[] = [
|
||||||
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
|
abilities_value: ABILITIES_VALUES_ENUM.INDEX,
|
||||||
prevPath: 2,
|
prevPath: 2,
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
header: "page_header.add_reseller",
|
header: "page_header.add_reseller",
|
||||||
element: <AddReSeller />,
|
element: <AddReSeller />,
|
||||||
|
|
|
||||||
|
|
@ -102,12 +102,6 @@
|
||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.margin_auto{
|
|
||||||
@include Flex;
|
|
||||||
min-width: 100% !important;
|
|
||||||
margin-inline: auto !important;
|
|
||||||
}
|
|
||||||
.disabled{
|
.disabled{
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,3 @@
|
||||||
@import './profile.scss';
|
@import './profile.scss';
|
||||||
@import './collections.scss';
|
@import './collections.scss';
|
||||||
@import './setting.scss';
|
@import './setting.scss';
|
||||||
@import './sales.scss';
|
|
||||||
|
|
|
||||||
|
|
@ -73,13 +73,4 @@
|
||||||
.main_form_body{
|
.main_form_body{
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
.reseller_modal_form{
|
|
||||||
width: 100%;
|
|
||||||
.modal_title{
|
|
||||||
height: 5vh;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -52,7 +52,7 @@
|
||||||
|
|
||||||
|
|
||||||
.setting_tab_header,
|
.setting_tab_header,
|
||||||
.notification_card_setting,
|
.notification_card,
|
||||||
.security_card {
|
.security_card {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
@ -87,7 +87,7 @@
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification_card_setting{
|
.notification_card{
|
||||||
&:nth-last-child(1) {
|
&:nth-last-child(1) {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,5 +6,5 @@ const API = {
|
||||||
|
|
||||||
const KEY = "collections";
|
const KEY = "collections";
|
||||||
|
|
||||||
export const useGetAllCollections = (params?: any, options?: any) =>
|
export const useGetAllSales = (params?: any, options?: any) =>
|
||||||
useGetQuery(KEY, API.GET, params, options);
|
useGetQuery(KEY, API.GET, params, options);
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,10 @@ import useAddMutation from "./helper/useAddMutation";
|
||||||
import useGetQuery from "./helper/useGetQuery";
|
import useGetQuery from "./helper/useGetQuery";
|
||||||
|
|
||||||
const API = {
|
const API = {
|
||||||
GET: "/resellers/studentPackage",
|
GET: "/sales",
|
||||||
ADD: "/resellers/studentPackage",
|
ADD: "/sales",
|
||||||
GET_BY_PHONE: "/resellers/studentPackage/student",
|
DELETE: "/sales",
|
||||||
GET_SUMMERY: "/resellers/studentPackage/summery",
|
UPDATE: "/sales",
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const KEY = "sales";
|
const KEY = "sales";
|
||||||
|
|
|
||||||
|
|
@ -308,8 +308,7 @@
|
||||||
"Devices associated with the account":"الأجهزة المرتبطة بالحساب",
|
"Devices associated with the account":"الأجهزة المرتبطة بالحساب",
|
||||||
"account_activities":"أنشطة الحساب",
|
"account_activities":"أنشطة الحساب",
|
||||||
"This will close your account. Your account will be interactive when you log in again":"سيؤدي هذا إلى إغلاق حسابك. سيكون حسابك تفاعليا عند تسجيل الدخول مرة أخرى",
|
"This will close your account. Your account will be interactive when you log in again":"سيؤدي هذا إلى إغلاق حسابك. سيكون حسابك تفاعليا عند تسجيل الدخول مرة أخرى",
|
||||||
"Your account will be permanently deleted":"سيتم حذف حسابك نهائيا",
|
"Your account will be permanently deleted":"سيتم حذف حسابك نهائيا"
|
||||||
"search":"بحث"
|
|
||||||
},
|
},
|
||||||
"Table": {
|
"Table": {
|
||||||
"header": "",
|
"header": "",
|
||||||
|
|
@ -390,9 +389,7 @@
|
||||||
"sale":"عملية بيع",
|
"sale":"عملية بيع",
|
||||||
"collections": "التحصيلات",
|
"collections": "التحصيلات",
|
||||||
"phone_number":"رقم الهاتف",
|
"phone_number":"رقم الهاتف",
|
||||||
"email_address":"عنوان البريد الإلكتروني",
|
"email_address":"عنوان البريد الإلكتروني"
|
||||||
"add_sales":"إضافة عملية بيع",
|
|
||||||
"are_you_sure_about_sale":"هل أنت متأكد من عملية البيع ؟"
|
|
||||||
},
|
},
|
||||||
"education_class_actions": {
|
"education_class_actions": {
|
||||||
"Student_Records": "سجلات الطلاب",
|
"Student_Records": "سجلات الطلاب",
|
||||||
|
|
@ -521,11 +518,7 @@
|
||||||
"role":"الدور",
|
"role":"الدور",
|
||||||
"submit_password":"تأكيد كلمة المرور",
|
"submit_password":"تأكيد كلمة المرور",
|
||||||
"join_date":"تاريخ الانضمام",
|
"join_date":"تاريخ الانضمام",
|
||||||
"verify":"التحقق",
|
"verify":"التحقق"
|
||||||
"contact_number1":"رقم الهاتف",
|
|
||||||
"contact_number2":"رقم الهاتف الإضافي",
|
|
||||||
"lat":"الطول",
|
|
||||||
"lng":"العرض"
|
|
||||||
},
|
},
|
||||||
"select": {
|
"select": {
|
||||||
"enums": {
|
"enums": {
|
||||||
|
|
@ -906,8 +899,7 @@
|
||||||
"collections": "التحصيلات",
|
"collections": "التحصيلات",
|
||||||
"sales":"المبيعات",
|
"sales":"المبيعات",
|
||||||
"edit_manager":"تعديل مدير",
|
"edit_manager":"تعديل مدير",
|
||||||
"setting":"الإعدادات",
|
"setting":"الإعدادات"
|
||||||
"edit_reseller":"تعديل البائع"
|
|
||||||
},
|
},
|
||||||
"page_header": {
|
"page_header": {
|
||||||
"home": "لوحة القيادة",
|
"home": "لوحة القيادة",
|
||||||
|
|
@ -973,13 +965,6 @@
|
||||||
"upload_your_photo_and_personal_data_here":"قم بتحميل صورتك وبياناتك الشخصية هنا",
|
"upload_your_photo_and_personal_data_here":"قم بتحميل صورتك وبياناتك الشخصية هنا",
|
||||||
"get_notified_of_whats_happening_now_you_can_turn_it_off_at_any_time":"احصل على إشعار بما يحدث الآن ، يمكنك إيقاف تشغيله في أي وقت"
|
"get_notified_of_whats_happening_now_you_can_turn_it_off_at_any_time":"احصل على إشعار بما يحدث الآن ، يمكنك إيقاف تشغيله في أي وقت"
|
||||||
},
|
},
|
||||||
"card" : {
|
|
||||||
"residual":"المتبقي",
|
|
||||||
"collected":"تم تحصيله",
|
|
||||||
"company_profit":"المستحقات",
|
|
||||||
"reseller_profit":"نسبة الأرباح (10%)",
|
|
||||||
"total_sells":"إجمالي المبيعات"
|
|
||||||
},
|
|
||||||
"alphabet": {
|
"alphabet": {
|
||||||
"A": "A",
|
"A": "A",
|
||||||
"B": "B",
|
"B": "B",
|
||||||
|
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
export function objectToKeyValueArray(obj: { [key: string]: any } | null | undefined): Array<{ key: string; value: any }> {
|
|
||||||
if (!obj) {
|
|
||||||
return [{ key: '', value: '' }]
|
|
||||||
}
|
|
||||||
return Object.entries(obj).map(([key, value]) => ({
|
|
||||||
key,
|
|
||||||
value
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user