Merge branch 'dev' of into dev

This commit is contained in:
Moaz Dawalibi 2024-09-14 14:41:07 +03:00
commit 4b3246e6e8
111 changed files with 886 additions and 812 deletions

View File

@ -11,7 +11,6 @@ import { RoleByType } from "./utils/RoleByType";
const Page404 = lazy(() => import("./Layout/Ui/NotFoundPage")); const Page404 = lazy(() => import("./Layout/Ui/NotFoundPage"));
const Auth = lazy(() => import("./Pages/Auth/Page")); const Auth = lazy(() => import("./Pages/Auth/Page"));
const App = () => { const App = () => {
return ( return (
<Routes> <Routes>
<Route <Route

View File

@ -43,12 +43,10 @@ const SelectTag: React.FC = () => {
? [{ id: searchValue, name: searchValue }] ? [{ id: searchValue, name: searchValue }]
: []; : [];
const value =
formik?.values?.tags?.map((item: any) => item?.id ?? item) ?? [];
const AllOptions = [...options, ...additionalData];
const value = formik?.values?.tags?.map((item: any) => item?.id ?? item) ?? [];
const AllOptions = [...options, ...additionalData]
return ( return (
<div className="SelectTag"> <div className="SelectTag">

View File

@ -15,22 +15,17 @@ const SearchField: React.FC<Props> = ({ placeholder, searchBy }) => {
const [searchQuery, setSearchQuery] = useState<string>(""); const [searchQuery, setSearchQuery] = useState<string>("");
const inputRef = useRef<HTMLInputElement>(null); const inputRef = useRef<HTMLInputElement>(null);
const { setFilter } = useFilterStateState();
const {setFilter} = useFilterStateState()
const handleInputChange = (value: string) => { const handleInputChange = (value: string) => {
setSearchQuery(value); setSearchQuery(value);
}; };
const handleInputChangeWithDebounce = useDebounce( const handleInputChangeWithDebounce = useDebounce((value: string) => {
(value: string) => {
setFilter({ setFilter({
name:value name: value,
}) });
} });
)
const handleToggleDropdown = () => { const handleToggleDropdown = () => {
setIsOpen(!isOpen); setIsOpen(!isOpen);
@ -60,7 +55,10 @@ const SearchField: React.FC<Props> = ({ placeholder, searchBy }) => {
className="search__input" className="search__input"
placeholder={t(placeholder)} placeholder={t(placeholder)}
value={searchQuery} value={searchQuery}
onChange={(e) => {handleInputChange(e.target.value) ; handleInputChangeWithDebounce(e.target.value)}} onChange={(e) => {
handleInputChange(e.target.value);
handleInputChangeWithDebounce(e.target.value);
}}
/> />
</div> </div>
</div> </div>

View File

@ -6,11 +6,11 @@ import { useFilterStateState } from "../../zustand/Filter";
const OrderBySelect = () => { const OrderBySelect = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const {setFilter} = useFilterStateState() const { setFilter } = useFilterStateState();
const handleChange = (value: string) => { const handleChange = (value: string) => {
setFilter({ setFilter({
sort_by:value sort_by: value,
}) });
}; };
return ( return (
@ -29,8 +29,14 @@ const OrderBySelect = () => {
options={[ options={[
{ value: "ascending", label: t("select.array.order.ascending") }, { value: "ascending", label: t("select.array.order.ascending") },
{ value: "descending", label: t("select.array.order.descending") }, { value: "descending", label: t("select.array.order.descending") },
{ value: "recently_viewed", label: t("select.array.order.recently_viewed") }, {
{ value: "recently_arrived", label: t("select.array.order.recently_arrived") }, value: "recently_viewed",
label: t("select.array.order.recently_viewed"),
},
{
value: "recently_arrived",
label: t("select.array.order.recently_arrived"),
},
]} ]}
/> />
</div> </div>

View File

@ -4,7 +4,6 @@ import { Divider, Select } from "antd";
import usePagination from "../../Layout/Dashboard/usePagination"; import usePagination from "../../Layout/Dashboard/usePagination";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
const PaginationColumn = () => { const PaginationColumn = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const navigate = useNavigate(); const navigate = useNavigate();
@ -13,7 +12,6 @@ const PaginationColumn = () => {
navigate(`?per_page=${value}`); navigate(`?per_page=${value}`);
}; };
return ( return (
<div className="pagination_column"> <div className="pagination_column">
<Select <Select

View File

@ -1,30 +1,20 @@
import React from 'react' import React from "react";
interface IFilterBody { interface IFilterBody {
children:React.ReactNode children: React.ReactNode;
} }
const useFilter = () => { const useFilter = () => {
const FilterButton = () => { const FilterButton = () => {
return ( return <div>FilterButton</div>;
<div> };
FilterButton
</div>
)
}
const FilterBody = ({ children }: IFilterBody) => { const FilterBody = ({ children }: IFilterBody) => {
return ( return <div>FilterBody</div>;
<div> };
FilterBody
</div>
)
}
return { return {
FilterButton , FilterBody FilterButton,
} FilterBody,
} };
};
export default useFilter export default useFilter;

View File

@ -1,5 +1,3 @@
export enum FilterEnum { export enum FilterEnum {
FILTER="FILTER" FILTER = "FILTER",
} }

View File

@ -21,14 +21,6 @@ export const useFilterState = create<FilterState>((set, get) => ({
}, },
})); }));
// import { create } from "zustand"; // import { create } from "zustand";
// interface FilterState { // interface FilterState {

View File

@ -1,6 +1,12 @@
import React, { ReactNode, useEffect, useState } from "react"; import React, { ReactNode, useEffect, useState } from "react";
import { FaFilter } from "react-icons/fa"; import { FaFilter } from "react-icons/fa";
import { Form, Formik, FormikConfig, FormikHelpers, useFormikContext } from "formik"; import {
Form,
Formik,
FormikConfig,
FormikHelpers,
useFormikContext,
} from "formik";
import { Button, ButtonProps, Divider, Modal } from "antd"; import { Button, ButtonProps, Divider, Modal } from "antd";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useModalState } from "./Modal"; import { useModalState } from "./Modal";
@ -38,7 +44,7 @@ const useFilter = () => {
const { filterState, setFilterState, clearFilterState } = useFilterState(); const { filterState, setFilterState, clearFilterState } = useFilterState();
const [t] = useTranslation(); const [t] = useTranslation();
const [formValues, setFormValues] = useState({}); const [formValues, setFormValues] = useState({});
const formik = useFormikContext() const formik = useFormikContext();
// Define the type for the callback // Define the type for the callback
type SubmitCallback = () => void; type SubmitCallback = () => void;
// console.log(formik?.values); // console.log(formik?.values);
@ -63,12 +69,9 @@ const useFilter = () => {
); );
}; };
useEffect(() => { useEffect(() => {
setFormValues({}) setFormValues({});
setFilterState({}) setFilterState({});
}, []) }, []);
const FilterBody = ({ const FilterBody = ({
onSubmit, onSubmit,
@ -93,7 +96,6 @@ const useFilter = () => {
setIsOpen(""); setIsOpen("");
}; };
const handleCancel = (isCancel = false) => { const handleCancel = (isCancel = false) => {
if (isCancel) { if (isCancel) {
setIsOpen(""); setIsOpen("");
return; return;
@ -127,16 +129,20 @@ const useFilter = () => {
enableReinitialize={true} enableReinitialize={true}
onSubmit={handleSubmit} onSubmit={handleSubmit}
initialValues={formValues} initialValues={formValues}
onReset={()=>{handleCancel(false)}} onReset={() => {
handleCancel(false);
}}
{...formikProps} {...formikProps}
> >
{(formik) => { {(formik) => {
return ( return (
<Form> <Form>
<div> <div>
<header> {t("models.filter")} <FaXmark onClick={()=>handleCancel(true)} /> </header> <header>
{" "}
{t("models.filter")}{" "}
<FaXmark onClick={() => handleCancel(true)} />{" "}
</header>
<Divider /> <Divider />
<main className="main_modal"> <main className="main_modal">
{isLoading ? <SpinContainer /> : children} {isLoading ? <SpinContainer /> : children}
@ -144,25 +150,31 @@ const useFilter = () => {
</main> </main>
</div> </div>
</Form> </Form>
) );
}} }}
</Formik> </Formik>
</Modal> </Modal>
</> </>
); );
}; };
interface SubmitButtonProps extends Omit<ButtonProps, "loading"> { interface SubmitButtonProps extends Omit<ButtonProps, "loading"> {}
}
const FilterSubmit = ({ ...buttonProps }: SubmitButtonProps) => { const FilterSubmit = ({ ...buttonProps }: SubmitButtonProps) => {
return ( return (
<div className="filter-submit-buttons buttons"> <div className="filter-submit-buttons buttons">
<Button className="back_button filter_modal_add_button" type="default" htmlType="reset"> <Button
className="back_button filter_modal_add_button"
type="default"
htmlType="reset"
>
{t("practical.reset")} {t("practical.reset")}
</Button> </Button>
<Button className="add_button pointer filter_modal_add_button" type="primary" {...buttonProps} htmlType="submit"> <Button
className="add_button pointer filter_modal_add_button"
type="primary"
{...buttonProps}
htmlType="submit"
>
{t(`practical.submit`)} {t(`practical.submit`)}
</Button> </Button>
</div> </div>
@ -186,5 +198,4 @@ const useFilter = () => {
}; };
}; };
export default useFilter; export default useFilter;

View File

@ -28,7 +28,7 @@
.ant-btn-default { .ant-btn-default {
padding: 7px 11px; padding: 7px 11px;
height: var(--fieldHeight); min-height: var(--fieldHeight);
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@ -45,12 +45,12 @@
/// input hight /// input hight
.ant-form-item-control-input-content { .ant-form-item-control-input-content {
height: var(--fieldHeight); min-height: var(--fieldHeight);
} }
//// date picker //// date picker
.ant-picker-large { .ant-picker-large {
height: var(--fieldHeight); min-height: var(--fieldHeight);
} }
/// text area /// text area

View File

@ -26,19 +26,23 @@ const Header = () => {
} }
}; };
const content = ( const content = (
<div> <div>
<p> (CTRL + SHIFT + {CombinationKeyEnum.CHOICE}) {t("header.add_choice")} </p> <p>
<p> (CTRL + SHIFT + {CombinationKeyEnum.QUESTION}) {t("header.add_question")} </p> {" "}
(CTRL + SHIFT + {CombinationKeyEnum.CHOICE}) {t("header.add_choice")}{" "}
</p>
<p>
{" "}
(CTRL + SHIFT + {CombinationKeyEnum.QUESTION}){" "}
{t("header.add_question")}{" "}
</p>
</div> </div>
); );
return ( return (
<header className="exercise_add_header mb-4"> <header className="exercise_add_header mb-4">
<article> <article>
<Popover content={content} title={t("practical.Abbreviations")}> <Popover content={content} title={t("practical.Abbreviations")}>
<img src="/Icon/QuestionIcon.svg" alt="" /> <img src="/Icon/QuestionIcon.svg" alt="" />
</Popover> </Popover>

View File

@ -1,4 +1,4 @@
import { useEffect } from 'react'; import { useEffect } from "react";
type KeyCombination = { type KeyCombination = {
ctrlKey?: boolean; ctrlKey?: boolean;
@ -6,12 +6,17 @@ type KeyCombination = {
code: string; // Use string here for flexibility code: string; // Use string here for flexibility
}; };
const useKeyCombination = (keyCombination: KeyCombination, callback: () => void) => { const useKeyCombination = (
keyCombination: KeyCombination,
callback: () => void,
) => {
useEffect(() => { useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => { const handleKeyDown = (event: KeyboardEvent) => {
const matches = const matches =
(keyCombination.ctrlKey === undefined || event.ctrlKey === keyCombination.ctrlKey) && (keyCombination.ctrlKey === undefined ||
(keyCombination.shiftKey === undefined || event.shiftKey === keyCombination.shiftKey) && event.ctrlKey === keyCombination.ctrlKey) &&
(keyCombination.shiftKey === undefined ||
event.shiftKey === keyCombination.shiftKey) &&
event.code === keyCombination.code; event.code === keyCombination.code;
if (matches) { if (matches) {
@ -21,10 +26,10 @@ const useKeyCombination = (keyCombination: KeyCombination, callback: () => void)
} }
}; };
window.addEventListener('keydown', handleKeyDown); window.addEventListener("keydown", handleKeyDown);
return () => { return () => {
window.removeEventListener('keydown', handleKeyDown); window.removeEventListener("keydown", handleKeyDown);
}; };
}, [keyCombination, callback]); }, [keyCombination, callback]);
}; };

View File

@ -10,14 +10,14 @@ interface ModalFormProps {
deleteMutation: any; deleteMutation: any;
ModelEnum: any; ModelEnum: any;
isNavigate?: boolean; isNavigate?: boolean;
idVerify?:boolean idVerify?: boolean;
} }
const DeleteModels: React.FC<ModalFormProps> = ({ const DeleteModels: React.FC<ModalFormProps> = ({
deleteMutation, deleteMutation,
ModelEnum, ModelEnum,
isNavigate = false, isNavigate = false,
idVerify = true idVerify = true,
}) => { }) => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { isOpen, setIsOpen } = useModalState((state) => state);
const [inputValue, setInputValue] = useState(""); const [inputValue, setInputValue] = useState("");
@ -27,9 +27,8 @@ const DeleteModels: React.FC<ModalFormProps> = ({
console.log(objectToEdit?.key); console.log(objectToEdit?.key);
console.log(inputValue); console.log(inputValue);
const iaDisabled = const iaDisabled = idVerify
idVerify ? ? Number(objectToEdit?.id) !== Number(inputValue) || isLoading
Number(objectToEdit?.id) !== Number(inputValue) || isLoading
: objectToEdit?.key !== inputValue || isLoading; : objectToEdit?.key !== inputValue || isLoading;
const navigate = useNavigate(); const navigate = useNavigate();
@ -44,13 +43,13 @@ const DeleteModels: React.FC<ModalFormProps> = ({
}, [isSuccess, setIsOpen]); }, [isSuccess, setIsOpen]);
const handleSubmit = () => { const handleSubmit = () => {
idVerify? idVerify
mutate({ ? mutate({
id: Number(objectToEdit?.id), id: Number(objectToEdit?.id),
}) })
: mutate({ : mutate({
id: objectToEdit?.key, id: objectToEdit?.key,
}) });
}; };
const handleCancel = () => { const handleCancel = () => {

View File

@ -28,7 +28,6 @@ const FilterLayout = ({
const { FilterBody, FilterSubmit } = useFilter(); const { FilterBody, FilterSubmit } = useFilter();
return ( return (
<div className="filter_header"> <div className="filter_header">
<div className="filter_header_top"> <div className="filter_header_top">
<h4>{t(filterTitle)}</h4> <h4>{t(filterTitle)}</h4>
@ -55,7 +54,6 @@ const FilterLayout = ({
<OrderBySelect /> <OrderBySelect />
</span> </span>
</div> </div>
</div> </div>
<Divider /> <Divider />
@ -70,7 +68,6 @@ const FilterLayout = ({
<div className="header_search"> <div className="header_search">
<SearchField searchBy="" placeholder={t("practical.search_here")} /> <SearchField searchBy="" placeholder={t("practical.search_here")} />
</div> </div>
</div> </div>
</div> </div>
); );

View File

@ -29,7 +29,6 @@ const FormikFormModel: React.FC<FormikFormProps> = ({
initialValues={initialValues} initialValues={initialValues}
validationSchema={validationSchema} validationSchema={validationSchema}
onSubmit={handleSubmit} onSubmit={handleSubmit}
> >
{(formik) => { {(formik) => {
useEffect(() => { useEffect(() => {

View File

@ -41,7 +41,7 @@ const PageHeader = ({
navigate(location); navigate(location);
}; };
console.log(); console.log();
const {PageTitle} = usePageTitleState() const { PageTitle } = usePageTitleState();
return ( return (
<div className="page_header"> <div className="page_header">
<header className="d-flex justify-content-between"> <header className="d-flex justify-content-between">

View File

@ -56,7 +56,10 @@ const DataTable: React.FC<DataTableProps> = ({
nextIcon: <>{t("practical.next")}</>, nextIcon: <>{t("practical.next")}</>,
prevIcon: <> {t("practical.prev")} </>, prevIcon: <> {t("practical.prev")} </>,
className: "pagination_antd", className: "pagination_antd",
showSizeChanger:false
}} }}
{...props} {...props}
/> />
); );

View File

@ -14,6 +14,7 @@ const usePagination = (data: Data) => {
current: data?.meta?.current_page || 1, current: data?.meta?.current_page || 1,
pageSize: data?.meta?.per_page || 2, pageSize: data?.meta?.per_page || 2,
total: data?.meta?.total || 0, total: data?.meta?.total || 0,
}); });
useEffect(() => { useEffect(() => {
@ -21,6 +22,7 @@ const usePagination = (data: Data) => {
current: data?.meta?.current_page || 1, current: data?.meta?.current_page || 1,
pageSize: data?.meta?.per_page || 2, pageSize: data?.meta?.per_page || 2,
total: data?.meta?.total || 0, total: data?.meta?.total || 0,
}); });
}, [data]); }, [data]);

View File

@ -51,7 +51,6 @@ const SideBar = ({
return <React.Fragment key={index}></React.Fragment>; return <React.Fragment key={index}></React.Fragment>;
} }
if (!RoleByType(item)) { if (!RoleByType(item)) {
return <React.Fragment key={index}></React.Fragment>; return <React.Fragment key={index}></React.Fragment>;
} }
return ( return (

View File

@ -30,10 +30,7 @@ const TableHeader = () => {
ModelAbility={ModalEnum?.GRADE_ADD} ModelAbility={ModalEnum?.GRADE_ADD}
canAdd={canAddGrade} canAdd={canAddGrade}
/> />
<FilterLayout <FilterLayout sub_children={<FilterForm />} filterTitle="table.grade" />
sub_children={<FilterForm />}
filterTitle="table.grade"
/>
<Table /> <Table />
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />

View File

@ -5,7 +5,12 @@ const Form = ({isEdit}:{isEdit?:boolean}) => {
return ( return (
<Row className="w-100"> <Row className="w-100">
<Col> <Col>
<ValidationField placeholder="key" label="key" name="key" disabled={isEdit? true : false} /> <ValidationField
placeholder="key"
label="key"
name="key"
disabled={isEdit ? true : false}
/>
<ValidationField placeholder="value" label="value" name="value" /> <ValidationField placeholder="value" label="value" name="value" />
</Col> </Col>
</Row> </Row>

View File

@ -18,9 +18,7 @@ const DeleteModalForm = lazy(
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
useSetPageTitle( useSetPageTitle(t(`page_header.param`));
t(`page_header.param`),
);
const deleteMutation = useDeleteParam(); const deleteMutation = useDeleteParam();
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">

View File

@ -15,21 +15,27 @@ const App: React.FC = () => {
pagination: true, pagination: true,
...filterState, ...filterState,
}); });
const [t] = useTranslation() const [t] = useTranslation();
const transformedData = response?.data?.data && typeof response.data.data === 'object' const transformedData =
response?.data?.data && typeof response.data.data === "object"
? Object.entries(response.data.data).map(([key, value]) => ({ ? Object.entries(response.data.data).map(([key, value]) => ({
key: key, key: key,
value: value value: value,
})) }))
: []; : [];
return <DataTable response={response} useColumns={useColumns} dataSource={transformedData} return (
<DataTable
response={response}
useColumns={useColumns}
dataSource={transformedData}
pagination={{ pagination={{
nextIcon: <>{t("practical.next")}</>, nextIcon: <>{t("practical.next")}</>,
prevIcon: <> {t("practical.prev")} </>, prevIcon: <> {t("practical.prev")} </>,
className: "pagination_antd", className: "pagination_antd",
}} }}
/>; />
);
}; };
export default App; export default App;

View File

@ -4,7 +4,12 @@ import { ModalEnum } from "../../../enums/Model";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { useModalState } from "../../../zustand/Modal"; import { useModalState } from "../../../zustand/Modal";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { canDeleteParam, canDeleteUser, canEditParam, canEditUser } from "../../../utils/hasAbilityFn"; import {
canDeleteParam,
canDeleteUser,
canEditParam,
canEditUser,
} from "../../../utils/hasAbilityFn";
import ActionButtons from "../../../Components/Table/ActionButtons"; import ActionButtons from "../../../Components/Table/ActionButtons";
export const useColumns = () => { export const useColumns = () => {
@ -56,5 +61,3 @@ export const useColumns = () => {
return columns; return columns;
}; };

View File

@ -11,15 +11,12 @@ 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";
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
useSetPageTitle(t(`page_header.add_reseller`)); useSetPageTitle(t(`page_header.add_reseller`));
const handelSubmit = (values: any) => { const handelSubmit = (values: any) => {
console.log(values, "values"); console.log(values, "values");
};
}
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">
<Suspense fallback={<Spin />}> <Suspense fallback={<Spin />}>
@ -29,19 +26,20 @@ const TableHeader = () => {
canAdd={false} canAdd={false}
/> />
<div className="bg2"> <div className="bg2">
<Formik initialValues={getInitialValues({})} validationSchema={getValidationSchema} onSubmit={handelSubmit} > <Formik
initialValues={getInitialValues({})}
validationSchema={getValidationSchema}
onSubmit={handelSubmit}
>
<Form> <Form>
<PersonalDetailsForm /> <PersonalDetailsForm />
<TitleDetailsForm /> <TitleDetailsForm />
<AttachmentForm /> <AttachmentForm />
<div className="resellerButton"> <div className="resellerButton">
<button type="button"> <button type="button">{t("practical.cancel")}</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>

View File

@ -1,9 +1,7 @@
import React from 'react' import React from "react";
const Page = () => { const Page = () => {
return ( return <div>Page</div>;
<div>Page</div> };
)
}
export default Page export default Page;

View File

@ -1,24 +1,23 @@
import React from 'react' import React from "react";
import { useTranslation } from 'react-i18next' import { useTranslation } from "react-i18next";
import { FaImage } from 'react-icons/fa' import { FaImage } from "react-icons/fa";
import ImageBoxField from './ImageBoxField/ImageBoxField'; import ImageBoxField from "./ImageBoxField/ImageBoxField";
const AttachmentForm = () => { const AttachmentForm = () => {
const [t] = useTranslation(); const [t] = useTranslation();
return ( return (
<div className='AttachmentForm'> <div className="AttachmentForm">
<header className='header_form'> <header className="header_form">
<FaImage /> <FaImage />
<h4>{t("header.attachment")}</h4> <h4>{t("header.attachment")}</h4>
</header> </header>
<main className='main_form_body'> <main className="main_form_body">
<ImageBoxField name="personal_image" /> <ImageBoxField name="personal_image" />
<ImageBoxField name="id_image" /> <ImageBoxField name="id_image" />
</main> </main>
</div> </div>
) );
} };
export default AttachmentForm export default AttachmentForm;

View File

@ -7,7 +7,11 @@ const FilterForm = () => {
<div> <div>
<Row> <Row>
<Col> <Col>
<ValidationField placeholder="first_name" label="first_name" name="first_name" /> <ValidationField
placeholder="first_name"
label="first_name"
name="first_name"
/>
{/* <ValidationField placeholder="last_name" label="last_name" name="last_name" /> */} {/* <ValidationField placeholder="last_name" label="last_name" name="last_name" /> */}
</Col> </Col>
{/* <Col> {/* <Col>

View File

@ -48,7 +48,7 @@ const ImageBoxField = ({ name }: any) => {
fileInputRef.current.value = ""; fileInputRef.current.value = "";
} }
}; };
const [t] = useTranslation() const [t] = useTranslation();
return ( return (
<div className="ImageBoxField"> <div className="ImageBoxField">
<header>{t(`input.${name}`)}</header> <header>{t(`input.${name}`)}</header>

View File

@ -1,35 +1,76 @@
import React from 'react' import React from "react";
import { useTranslation } from 'react-i18next' import { useTranslation } from "react-i18next";
import { FaStore } from 'react-icons/fa' import { FaStore } from "react-icons/fa";
import ValidationField from '../../../../Components/ValidationField/ValidationField'; import ValidationField from "../../../../Components/ValidationField/ValidationField";
import { convert_data_to_select } from '../../../../Layout/app/Const'; 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 = () => { const PersonalDetailsForm = () => {
const [t] = useTranslation(); const [t] = useTranslation();
return ( return (
<div className='PersonalDetailsForm'> <div className="PersonalDetailsForm">
<header className='header_form'> <header className="header_form">
<FaStore /> <FaStore />
<h4>{t("header.personal_information")}</h4> <h4>{t("header.personal_information")}</h4>
</header> </header>
<main className='main_form_body'> <main className="main_form_body">
<ValidationField name={"id_number"} placeholder={"_"} label={"ID Number"} /> <ValidationField
<ValidationField name={"addition_date"} placeholder={"_"} type='Date' label={"Addition Date"} /> name={"id_number"}
<ValidationField name={"status"} placeholder={"_"} label={"Status"} type='Select' option={statusType} /> placeholder={"_"}
label={"ID Number"}
/>
<ValidationField
name={"addition_date"}
placeholder={"_"}
type="Date"
label={"Addition Date"}
/>
<ValidationField
name={"status"}
placeholder={"_"}
label={"Status"}
type="Select"
option={statusType}
/>
<ValidationField name={"full_name"} placeholder={"_"} label={"Full Name"} /> <ValidationField
<ValidationField name={"phone_number"} placeholder={"_"} label={"Phone Number"} type='text' /> name={"full_name"}
<ValidationField name={"mobile_number"} placeholder={"_"} label={"Mobile Number"} /> placeholder={"_"}
label={"Full Name"}
<ValidationField name={"username"} placeholder={"_"} label={"Username"} /> />
<ValidationField name={"password"} placeholder={"_"} label={"Password"} type='text' /> <ValidationField
<ValidationField name={"seller_percentage"} placeholder={"_"} label={"Seller Percentage"} type='text' /> name={"phone_number"}
placeholder={"_"}
label={"Phone Number"}
type="text"
/>
<ValidationField
name={"mobile_number"}
placeholder={"_"}
label={"Mobile Number"}
/>
<ValidationField
name={"username"}
placeholder={"_"}
label={"Username"}
/>
<ValidationField
name={"password"}
placeholder={"_"}
label={"Password"}
type="text"
/>
<ValidationField
name={"seller_percentage"}
placeholder={"_"}
label={"Seller Percentage"}
type="text"
/>
</main> </main>
</div> </div>
) );
} };
export default PersonalDetailsForm export default PersonalDetailsForm;

View File

@ -1,25 +1,30 @@
import React from 'react' import React from "react";
import { useTranslation } from 'react-i18next' import { useTranslation } from "react-i18next";
import { FaRegAddressBook } from 'react-icons/fa' import { FaRegAddressBook } from "react-icons/fa";
import ValidationField from '../../../../Components/ValidationField/ValidationField'; import ValidationField from "../../../../Components/ValidationField/ValidationField";
import { nationalities } from '../../../../types/App'; import { nationalities } from "../../../../types/App";
const TitleDetailsForm = () => { const TitleDetailsForm = () => {
const [t] = useTranslation(); const [t] = useTranslation();
return ( return (
<div className='TitleDetailsForm'> <div className="TitleDetailsForm">
<header className='header_form'> <header className="header_form">
<FaRegAddressBook /> <FaRegAddressBook />
<h4>{t("header.address")}</h4> <h4>{t("header.address")}</h4>
</header> </header>
<main className='main_form_body'> <main className="main_form_body">
<ValidationField name={"city_id"} placeholder={"_"} label={"city"} type='Select' option={nationalities} /> <ValidationField
name={"city_id"}
placeholder={"_"}
label={"city"}
type="Select"
option={nationalities}
/>
<ValidationField name={"address"} placeholder={"_"} label={"address"} /> <ValidationField name={"address"} placeholder={"_"} label={"address"} />
</main> </main>
</div> </div>
) );
} };
export default TitleDetailsForm export default TitleDetailsForm;

View File

@ -1,8 +1,6 @@
import * as Yup from "yup"; import * as Yup from "yup";
export const getInitialValues = ( export const getInitialValues = (objectToEdit: Partial<any>) => {
objectToEdit: Partial<any>,
) => {
return { return {
id: objectToEdit?.id ?? null, id: objectToEdit?.id ?? null,
name: objectToEdit?.name ?? null, name: objectToEdit?.name ?? null,
@ -11,7 +9,5 @@ export const getInitialValues = (
export const getValidationSchema = () => { export const getValidationSchema = () => {
// validate input // validate input
return Yup.object().shape({ return Yup.object().shape({});
});
}; };

View File

@ -45,7 +45,6 @@ const TableHeader = () => {
deleteMutation={deleteMutation} deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.RE_SELLER_DELETE} ModelEnum={ModalEnum?.RE_SELLER_DELETE}
/> />
</Suspense> </Suspense>
</div> </div>
); );

View File

@ -11,7 +11,7 @@ const App: React.FC = () => {
const response = useGetAllReseller({ const response = useGetAllReseller({
name: searchQuery, name: searchQuery,
pagination: true, pagination: true,
...filterState ...filterState,
}); });
return <DataTable response={response} useColumns={useColumns} />; return <DataTable response={response} useColumns={useColumns} />;

View File

@ -21,7 +21,6 @@ export const useColumns = () => {
const { setObjectToEdit } = useObjectToEdit((state) => state); const { setObjectToEdit } = useObjectToEdit((state) => state);
const navigate = useNavigate(); const navigate = useNavigate();
const handelDelete = (data: ReSeller) => { const handelDelete = (data: ReSeller) => {
setObjectToEdit(data); setObjectToEdit(data);
handel_open_model(ModalEnum?.RE_SELLER_DELETE); handel_open_model(ModalEnum?.RE_SELLER_DELETE);
@ -72,11 +71,9 @@ export const useColumns = () => {
<ActionButtons <ActionButtons
canDelete={canDeleteReSeller} canDelete={canDeleteReSeller}
canEdit={canEditReSeller} canEdit={canEditReSeller}
index={index} index={index}
onDelete={() => handelDelete(record)} onDelete={() => handelDelete(record)}
onEdit={() => handleEdit(record)} onEdit={() => handleEdit(record)}
/> />
); );
}, },

View File

@ -7,8 +7,16 @@ const FilterForm = () => {
<div> <div>
<Row> <Row>
<Col> <Col>
<ValidationField placeholder="first_name" label="first_name" name="first_name" /> <ValidationField
<ValidationField placeholder="last_name" label="last_name" name="last_name" /> placeholder="first_name"
label="first_name"
name="first_name"
/>
<ValidationField
placeholder="last_name"
label="last_name"
name="last_name"
/>
</Col> </Col>
</Row> </Row>
</div> </div>

View File

@ -19,7 +19,6 @@ const Form = () => {
placeholder="term" placeholder="term"
label="term" label="term"
option={termsArray} option={termsArray}
/> />
</Col> </Col>
</Row> </Row>

View File

@ -42,7 +42,7 @@ const TableHeader = () => {
" / " + " / " +
` ${t("header.subject_of_class")} (${gradeName})` + ` ${t("header.subject_of_class")} (${gradeName})` +
" / " + " / " +
SubjectName SubjectName,
); );
return ( return (

View File

@ -8,11 +8,25 @@ const FilterForm = () => {
<div> <div>
<Row> <Row>
<Col> <Col>
<ValidationField placeholder="username" label="username" name="username" /> <ValidationField
<ValidationField placeholder="phone_number" label="phone_number" name="phone_number" /> placeholder="username"
label="username"
name="username"
/>
<ValidationField
placeholder="phone_number"
label="phone_number"
name="phone_number"
/>
</Col> </Col>
<Col> <Col>
<ValidationField type="Select" option={userTypeOptions} placeholder="type" label="type" name="type" /> <ValidationField
type="Select"
option={userTypeOptions}
placeholder="type"
label="type"
name="type"
/>
</Col> </Col>
</Row> </Row>
</div> </div>

View File

@ -4,24 +4,58 @@ import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect";
import { userTypeOptions } from "../../../../config/userTypeOptions"; import { userTypeOptions } from "../../../../config/userTypeOptions";
const Form = ({ isEdit }: { isEdit?: boolean }) => { const Form = ({ isEdit }: { isEdit?: boolean }) => {
return ( return (
<Row className="w-100"> <Row className="w-100">
{isEdit ? "" : {isEdit ? (
""
) : (
<Col> <Col>
<> <>
<ValidationField placeholder="username" label="username" name="username" /> <ValidationField
<ValidationField placeholder="password" label="password" name="password" /> placeholder="username"
<ValidationField placeholder="phone_number" label="phone_number" name="phone_number" /> label="username"
name="username"
/>
<ValidationField
placeholder="password"
label="password"
name="password"
/>
<ValidationField
placeholder="phone_number"
label="phone_number"
name="phone_number"
/>
</> </>
</Col>} </Col>
)}
<Col> <Col>
{isEdit ? "": {isEdit ? (
<ValidationField type="Select" option={userTypeOptions} placeholder="type" label="type" name="type" />} ""
<ValidationField type="Select" option={userTypeOptions} placeholder="roles" label="roles" name="role_id" /> ) : (
<ValidationField type="Select" option={userTypeOptions} placeholder="abilities" label="abilities" name="abilities" isMulti={true} /> <ValidationField
type="Select"
option={userTypeOptions}
placeholder="type"
label="type"
name="type"
/>
)}
<ValidationField
type="Select"
option={userTypeOptions}
placeholder="roles"
label="roles"
name="role_id"
/>
<ValidationField
type="Select"
option={userTypeOptions}
placeholder="abilities"
label="abilities"
name="abilities"
isMulti={true}
/>
</Col> </Col>
</Row> </Row>
); );

View File

@ -6,7 +6,6 @@ export const getInitialValues = (objectToEdit: any): any => {
password: objectToEdit?.password ?? null, password: objectToEdit?.password ?? null,
phone_number: objectToEdit?.phone_number ?? null, phone_number: objectToEdit?.phone_number ?? null,
type: objectToEdit?.type ?? null, type: objectToEdit?.type ?? null,
}; };
}; };

View File

@ -18,9 +18,7 @@ const DeleteModalForm = lazy(
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
useSetPageTitle( useSetPageTitle(t(`page_header.user`));
t(`page_header.user`),
);
const deleteMutation = useDeleteUser(); const deleteMutation = useDeleteUser();
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">

View File

@ -37,7 +37,6 @@ const TableHeader = () => {
show: grade_id, show: grade_id,
}); });
const gradeName = grade?.data?.name ?? ""; const gradeName = grade?.data?.name ?? "";
const SubjectName = Subject?.data?.name ?? ""; const SubjectName = Subject?.data?.name ?? "";
const unitName = unit?.data?.name ?? ""; const unitName = unit?.data?.name ?? "";
@ -49,10 +48,9 @@ const TableHeader = () => {
" / " + " / " +
SubjectName + SubjectName +
" / " + " / " +
unitName unitName,
); );
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">
<Suspense fallback={<Spin />}> <Suspense fallback={<Spin />}>

View File

@ -71,8 +71,7 @@ export const useColumns = () => {
// ), // ),
title: t("columns.procedure"), title: t("columns.procedure"),
key: "actions", key: "actions",
align: "end", align: "center",
width: "25vw",
render: (_text, record, index) => { render: (_text, record, index) => {
return ( return (
<ActionButtons <ActionButtons

View File

@ -22,20 +22,13 @@ import { toast } from "react-toastify";
const AcceptModal = lazy(() => import("./Model/AcceptModal")); const AcceptModal = lazy(() => import("./Model/AcceptModal"));
const AddPage: React.FC = () => { const AddPage: React.FC = () => {
const { mutateAsync,isLoading:LoadingAsync } = useAddQuestionAsync();
const { mutateAsync } = useAddQuestionAsync();
const { mutate, isLoading, isSuccess } = useAddQuestion(); const { mutate, isLoading, isSuccess } = useAddQuestion();
const { const { isBseQuestion, setTagsSearch, objectToEdit, setSuccess } =
isBseQuestion, useObjectToEdit();
setTagsSearch,
objectToEdit,
setSuccess
} = useObjectToEdit();
const [t] = useTranslation(); const [t] = useTranslation();
const { subject_id, lesson_id } = const { subject_id, lesson_id } = useParams<ParamsEnum>();
useParams<ParamsEnum>();
console.log(objectToEdit, "objectToEdit"); console.log(objectToEdit, "objectToEdit");
@ -43,9 +36,9 @@ console.log(objectToEdit,"objectToEdit");
values: any, values: any,
{ resetForm }: { resetForm: () => void }, { resetForm }: { resetForm: () => void },
) => { ) => {
const DataToSend = structuredClone(values); const DataToSend = structuredClone(values);
setTagsSearch(null); setTagsSearch(null);
console.log(1);
const canAnswersBeShuffled = DataToSend?.canAnswersBeShuffled ? 1 : 0; const canAnswersBeShuffled = DataToSend?.canAnswersBeShuffled ? 1 : 0;
@ -76,12 +69,9 @@ console.log(objectToEdit,"objectToEdit");
}); });
console.log(answers); console.log(answers);
if (answers?.length > 0) { if (answers?.length > 0) {
const isValidAnswers = answers?.some((answer:any) => answer?.isCorrect === 1) const isValidAnswers = answers?.some(
(answer: any) => answer?.isCorrect === 1,
if(!isValidAnswers){ );
toast.error(t("validation.at_least_one_answer_should_be_correct"));
return;
}
} }
mutate({ mutate({
...item, ...item,
@ -95,10 +85,10 @@ console.log(objectToEdit,"objectToEdit");
console.log(newBseQuestionId, "newBseQuestionId"); console.log(newBseQuestionId, "newBseQuestionId");
}); });
} else { } else {
console.log(1);
const tags = processTags(DataToSend); const tags = processTags(DataToSend);
const answers = values?.answers?.map((item: any, index: number) => { const answers = values?.answers?.map((item: any, index: number) => {
console.log(item,"item");
return { return {
order: index, order: index,
...item, ...item,
@ -106,8 +96,10 @@ console.log(objectToEdit,"objectToEdit");
}); });
if (answers?.length > 0) { if (answers?.length > 0) {
const isValidAnswers = answers?.some(
const isValidAnswers = answers?.some((answer:any) => answer?.isCorrect === 1) (answer: any) => answer?.isCorrect === 1,
);
console.log(!isValidAnswers);
if (!isValidAnswers) { if (!isValidAnswers) {
toast.error(t("validation.at_least_one_answer_should_be_correct")); toast.error(t("validation.at_least_one_answer_should_be_correct"));
@ -132,26 +124,16 @@ console.log(objectToEdit,"objectToEdit");
const navigate = useNavigate(); const navigate = useNavigate();
const handleCancel = () => { const handleCancel = () => {
navigate(-1); navigate(-1);
}; };
const Loading = LoadingAsync || isLoading
useEffect(() => { useEffect(() => {
console.log("all api success"); console.log("all api success");
if (isSuccess) { if (isSuccess) {
setSuccess(true);
setSuccess(true )
} }
}, [isSuccess]) }, [isSuccess]);
if (isBseQuestion) { if (isBseQuestion) {
return ( return (
@ -167,10 +149,10 @@ console.log(objectToEdit,"objectToEdit");
<div className="exercise_add_buttons"> <div className="exercise_add_buttons">
<div onClick={handleCancel}>{t("practical.back")}</div> <div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} className="relative" type="submit"> <button disabled={Loading} className="relative" type="submit">
{t("practical.add")} {t("practical.add")}
{isLoading && ( {Loading && (
<span className="Spinier_Div"> <span className="Spinier_Div">
<Spin /> <Spin />
</span> </span>
@ -198,10 +180,10 @@ console.log(objectToEdit,"objectToEdit");
<div className="exercise_add_buttons"> <div className="exercise_add_buttons">
<div onClick={handleCancel}>{t("practical.back")}</div> <div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} className="relative" type="submit"> <button disabled={Loading} className="relative" type="submit">
{t("practical.add")} {t("practical.add")}
{isLoading && ( {Loading && (
<span className="Spinier_Div"> <span className="Spinier_Div">
<Spin /> <Spin />
</span> </span>

View File

@ -15,7 +15,7 @@ import {
useUpdateQuestion, useUpdateQuestion,
} from "../../../api/Question"; } from "../../../api/Question";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useNavigate, useParams } from "react-router-dom"; import { useLocation, useNavigate, useParams } from "react-router-dom";
import { ParamsEnum } from "../../../enums/params"; import { ParamsEnum } from "../../../enums/params";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
import { removeStringKeys } from "../../../utils/removeStringKeys"; import { removeStringKeys } from "../../../utils/removeStringKeys";
@ -24,20 +24,16 @@ import ModelForm from "./Model/ModelForm";
import BaseForm from "./Model/Malty/Form"; import BaseForm from "./Model/Malty/Form";
import { Question } from "../../../types/Item"; import { Question } from "../../../types/Item";
import { toast } from "react-toastify"; import { toast } from "react-toastify";
import { deletePathSegments } from "../../../utils/deletePathSegments";
const EditPage: React.FC = () => { const EditPage: React.FC = () => {
const { const { subject_id, lesson_id, question_id } = useParams<ParamsEnum>();
subject_id,
lesson_id,
question_id,
} = useParams<ParamsEnum>();
const { isBseQuestion, setIsBseQuestion, setTagsSearch, DeletedQuestions } = const { isBseQuestion, setIsBseQuestion, setTagsSearch, DeletedQuestions } =
useObjectToEdit(); useObjectToEdit();
const { mutate, isSuccess, isLoading } = useUpdateQuestion(); const { mutate, isSuccess, isLoading } = useUpdateQuestion();
const { mutate: DeleteQuestion } = useDeleteQuestion(); const { mutate: DeleteQuestion } = useDeleteQuestion();
const { mutate: mutateAdd } = useAddQuestion(); const { mutate: mutateAdd , isLoading:LoadingAsync } = useAddQuestion();
const { data, isLoading: dataLoading } = useGetAllQuestion({ const { data, isLoading: dataLoading } = useGetAllQuestion({
show: question_id, show: question_id,
@ -58,8 +54,6 @@ const EditPage: React.FC = () => {
const [t] = useTranslation(); const [t] = useTranslation();
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
const DataToSend = structuredClone(values); const DataToSend = structuredClone(values);
setTagsSearch(null); setTagsSearch(null);
@ -102,13 +96,14 @@ const EditPage: React.FC = () => {
const newAnswers = [] as any; const newAnswers = [] as any;
if (updatedObject?.answers?.length > 0) { if (updatedObject?.answers?.length > 0) {
const isValidAnswers = updatedObject?.answers?.some(
(answer: any) => answer?.isCorrect === 1,
);
const isValidAnswers = updatedObject?.answers?.some((answer:any) => answer?.isCorrect === 1) // if(!isValidAnswers){
// toast.error(t("validation.at_least_one_answer_should_be_correct"));
if(!isValidAnswers){ // return;
toast.error(t("validation.at_least_one_answer_should_be_correct")); // }
return;
}
} }
updatedObject?.answers?.forEach((item: any) => { updatedObject?.answers?.forEach((item: any) => {
if (item?.id) { if (item?.id) {
@ -142,7 +137,6 @@ const EditPage: React.FC = () => {
} }
}); });
} else { } else {
const keysToRemove = ["content_image"]; const keysToRemove = ["content_image"];
console.log(DataToSend); console.log(DataToSend);
const updatedObject = removeStringKeys(DataToSend, keysToRemove); const updatedObject = removeStringKeys(DataToSend, keysToRemove);
@ -155,15 +149,14 @@ const EditPage: React.FC = () => {
const oldAnswers = [] as any; const oldAnswers = [] as any;
const newAnswers = [] as any; const newAnswers = [] as any;
if (updatedObject?.answers?.length > 0) { if (updatedObject?.answers?.length > 0) {
// const isValidAnswers = updatedObject?.answers?.some((answer:any) => answer?.isCorrect === 1 || answer?.isCorrect === true)
const isValidAnswers = updatedObject?.answers?.some((answer:any) => answer?.isCorrect === 1 || answer?.isCorrect === true) // const isValidAnswers2 = updatedObject?.answers?.filter((answer: any) => answer?.isCorrect === 1 || answer?.isCorrect === true ).length > 1;
const isValidAnswers2 = updatedObject?.answers?.filter((answer: any) => answer?.isCorrect === 1 || answer?.isCorrect === true ).length > 1; // console.log(isValidAnswers2);
console.log(isValidAnswers2); // console.log(isValidAnswers,"isValidAnswers");
// if(!isValidAnswers || isValidAnswers2){
if(!isValidAnswers || isValidAnswers2){ // toast.error(t("validation.at_least_one_answer_should_be_correct"));
toast.error(t("validation.at_least_one_answer_should_be_correct")); // return;
return; // }
}
} }
updatedObject?.answers?.forEach((item: any) => { updatedObject?.answers?.forEach((item: any) => {
if (item?.id) { if (item?.id) {
@ -177,22 +170,31 @@ const EditPage: React.FC = () => {
old: oldAnswers, old: oldAnswers,
new: newAnswers, new: newAnswers,
}; };
console.log(tags, "tags");
if (tags?.new?.length < 1 && tags?.old?.length < 1) {
mutate({ ...updatedObject, answers, tags: "" });
} else {
mutate({ ...updatedObject, answers, tags }); mutate({ ...updatedObject, answers, tags });
} }
}
}; };
const location = useLocation();
const navigate = useNavigate(); const navigate = useNavigate();
const handleCancel = () => { const handleCancel = () => {
navigate(-1); navigate(-1);
}; };
// useEffect(() => {
// if (isSuccess) { useEffect(() => {
// toast.success(t("validation.the_possess_done_successful")); if (isSuccess) {
// navigate(-1); toast.success(t("validation.the_possess_done_successful"));
// } navigate(deletePathSegments(location.pathname, 2));
// }, [isSuccess]); }
}, [isSuccess]);
const Loading = LoadingAsync || isLoading
if (dataLoading || QuestionsDataLoading) { if (dataLoading || QuestionsDataLoading) {
return <SpinContainer />; return <SpinContainer />;
@ -216,10 +218,10 @@ const EditPage: React.FC = () => {
<BaseForm /> <BaseForm />
<div className="exercise_add_buttons"> <div className="exercise_add_buttons">
<div onClick={handleCancel}>{t("practical.back")}</div> <div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} className="relative" type="submit"> <button disabled={Loading} className="relative" type="submit">
{t("practical.edit")} {t("practical.edit")}
{isLoading && ( {Loading && (
<span className="Spinier_Div"> <span className="Spinier_Div">
<Spin /> <Spin />
</span> </span>
@ -250,10 +252,10 @@ const EditPage: React.FC = () => {
<ModelForm /> <ModelForm />
<div className="exercise_add_buttons"> <div className="exercise_add_buttons">
<div onClick={handleCancel}>{t("practical.back")}</div> <div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} className="relative" type="submit"> <button disabled={Loading} className="relative" type="submit">
{t("practical.edit")} {t("practical.edit")}
{isLoading && ( {Loading && (
<span className="Spinier_Div"> <span className="Spinier_Div">
<Spin /> <Spin />
</span> </span>

View File

@ -7,12 +7,16 @@ const FilterForm = () => {
const yesNoArray = [ const yesNoArray = [
{ id: "لا", name: "لا" }, { id: "لا", name: "لا" },
{ id: "نعم", name: "نعم" }, { id: "نعم", name: "نعم" },
] ];
return ( return (
<div> <div>
<Row> <Row>
<Col> <Col>
<ValidationField placeholder="content" label="content" name="content" /> <ValidationField
placeholder="content"
label="content"
name="content"
/>
{/* <ValidationField type="Select" option={yesNoArray} placeholder="isBase" label="isBase" name="isBase" /> */} {/* <ValidationField type="Select" option={yesNoArray} placeholder="isBase" label="isBase" name="isBase" /> */}
</Col> </Col>
{/* <Col> {/* <Col>

View File

@ -35,7 +35,10 @@ const CheckboxField = ({
<Checkbox <Checkbox
onChange={onChange || CheckboxhandleChange} onChange={onChange || CheckboxhandleChange}
disabled={isDisabled} disabled={isDisabled}
checked={formik.values?.answers?.[name]?.isCorrect === 1 || formik.values?.answers?.[name]?.isCorrect === true} checked={
formik.values?.answers?.[name]?.isCorrect === 1 ||
formik.values?.answers?.[name]?.isCorrect === true
}
className={className} className={className}
> >
{t(`input.${label ? label : name}`)} {t(`input.${label ? label : name}`)}

View File

@ -28,7 +28,6 @@ const ChoiceFields = ({ index, data }: { index: number; data: Choice }) => {
return ( return (
<> <>
<div className="ChoiceFields"> <div className="ChoiceFields">
<TextField <TextField
className="textarea_exercise" className="textarea_exercise"
placeholder={"choice"} placeholder={"choice"}

View File

@ -42,7 +42,9 @@ const CheckboxField = ({
disabled={isDisabled} disabled={isDisabled}
checked={ checked={
formik.values?.Questions?.[parent_index]?.answers?.[name] formik.values?.Questions?.[parent_index]?.answers?.[name]
?.isCorrect === 1 ?.isCorrect === 1 ||
formik.values?.Questions?.[parent_index]?.answers?.[name]
?.isCorrect === true
} }
className={className} className={className}
> >

View File

@ -44,7 +44,6 @@ const ChoiceFields = ({
formik.setFieldValue(`Questions[${parent_index}].answers`, updatedAnswers); formik.setFieldValue(`Questions[${parent_index}].answers`, updatedAnswers);
}; };
return ( return (
<> <>
<div className="ChoiceFields"> <div className="ChoiceFields">

View File

@ -18,18 +18,21 @@ const Form = () => {
const formik = useFormikContext<any>(); const formik = useFormikContext<any>();
const { setSuccess, Success, setSavedQuestionData } = useObjectToEdit(); const { setSuccess, Success, setSavedQuestionData } = useObjectToEdit();
useEffect(() => { useEffect(() => {
setSavedQuestionData(formik.values); setSavedQuestionData(formik.values);
}, [formik?.values]); }, [formik?.values]);
// console.log(formik?.errors); // console.log(formik?.errors);
const handleAddChoice = (parent_index: number,fromKeyCombination:boolean = false) => { const handleAddChoice = (
parent_index: number,
fromKeyCombination: boolean = false,
) => {
console.log(parent_index); console.log(parent_index);
formik.setFieldValue(`Questions.[${parent_index}].answers`, [ formik.setFieldValue(`Questions.[${parent_index}].answers`, [
...((formik?.values as any)?.Questions?.[parent_index]?.answers as Choice[]), ...((formik?.values as any)?.Questions?.[parent_index]
?.answers as Choice[]),
{ {
answer: null, answer: null,
@ -39,7 +42,7 @@ const Form = () => {
]); ]);
if (fromKeyCombination) { if (fromKeyCombination) {
toast.success(t("header.new_choice_have_been_added")) toast.success(t("header.new_choice_have_been_added"));
} }
}; };
@ -63,26 +66,27 @@ const Form = () => {
formik.setFieldValue("max_mark", max_mark); formik.setFieldValue("max_mark", max_mark);
if (fromKeyCombination) { if (fromKeyCombination) {
toast.success(t("header.new_question_have_been_added")) toast.success(t("header.new_question_have_been_added"));
} }
}; };
const [t] = useTranslation(); const [t] = useTranslation();
const lastQuestions = formik?.values?.Questions?.length - 1; const lastQuestions = formik?.values?.Questions?.length - 1;
useKeyCombination({ ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.CHOICE }, () => { useKeyCombination(
handleAddChoice(lastQuestions,true) { ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.CHOICE },
}); () => {
handleAddChoice(lastQuestions, true);
useKeyCombination({ ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.QUESTION }, () => { },
);
handleAddQuestion(true)
});
useKeyCombination(
{ ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.QUESTION },
() => {
handleAddQuestion(true);
},
);
return ( return (
<Row className="w-100 exercise_form_container"> <Row className="w-100 exercise_form_container">
<div className="exercise_form"> <div className="exercise_form">
<ValidationField <ValidationField

View File

@ -41,14 +41,16 @@ const MaltySelectTag = ({ parent_index }: { parent_index: number }) => {
? [{ id: searchValue, name: searchValue }] ? [{ id: searchValue, name: searchValue }]
: []; : [];
console.log(options); console.log(options);
const value = formik?.values?.Questions[parent_index]?.tags?.map((item: any) => item?.id ?? item) ?? []; const value =
formik?.values?.Questions[parent_index]?.tags?.map(
(item: any) => item?.id ?? item,
) ?? [];
console.log(formik?.values?.Questions[parent_index]); console.log(formik?.values?.Questions[parent_index]);
console.log(value); console.log(value);
const AllOptions = [...options, ...additionalData] const AllOptions = [...options, ...additionalData];
return ( return (
<div className="SelectTag"> <div className="SelectTag">
@ -59,7 +61,6 @@ const value = formik?.values?.Questions[parent_index]?.tags?.map((item: any) =>
style={{ width: "100%", height: "40px" }} style={{ width: "100%", height: "40px" }}
placeholder="" placeholder=""
fieldNames={{ label: "name", value: "id" }} fieldNames={{ label: "name", value: "id" }}
onChange={handleChange} onChange={handleChange}
options={AllOptions} options={AllOptions}
filterOption={false} filterOption={false}

View File

@ -18,11 +18,7 @@ const Form = () => {
const formik = useFormikContext<any>(); const formik = useFormikContext<any>();
const { setSuccess, Success } = useObjectToEdit(); const { setSuccess, Success } = useObjectToEdit();
const handleAddChoice = (fromKeyCombination: boolean = false) => { const handleAddChoice = (fromKeyCombination: boolean = false) => {
formik.setFieldValue("answers", [ formik.setFieldValue("answers", [
...((formik?.values as any)?.answers as Choice[]), ...((formik?.values as any)?.answers as Choice[]),
{ {
@ -33,30 +29,25 @@ const Form = () => {
]); ]);
if (fromKeyCombination) { if (fromKeyCombination) {
toast.success(t("header.new_choice_have_been_added")) toast.success(t("header.new_choice_have_been_added"));
} }
}; };
useKeyCombination(
useKeyCombination({ ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.CHOICE }, () => { { ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.CHOICE },
() => {
handleAddChoice(true) handleAddChoice(true);
},
}); );
console.log(Success);
useEffect(() => { useEffect(() => {
console.log(Success);
if (Success) { if (Success) {
formik?.setValues({}) formik?.setValues({});
formik.setErrors({}) formik.setErrors({});
setSuccess(false) setSuccess(false);
console.log(formik.errors); console.log(formik.errors);
} }
}, [Success]) }, [Success]);
return ( return (
<Row className="w-100 exercise_form_container"> <Row className="w-100 exercise_form_container">

View File

@ -2,7 +2,6 @@ import * as Yup from "yup";
import { Question } from "../../../../types/Item"; import { Question } from "../../../../types/Item";
import { toast } from "react-toastify"; import { toast } from "react-toastify";
export const getInitialValues = (objectToEdit: Question): any => { export const getInitialValues = (objectToEdit: Question): any => {
const tags = objectToEdit?.tags?.map((item: any, index: number) => { const tags = objectToEdit?.tags?.map((item: any, index: number) => {
return { ...item }; return { ...item };
@ -27,21 +26,13 @@ export const getValidationSchema = () => {
return Yup.object().shape({ return Yup.object().shape({
content_image: Yup.string().nullable(), content_image: Yup.string().nullable(),
content: Yup.string().required("validation.required"), content: Yup.string().required("validation.required"),
answers: Yup.array() answers: Yup.array().of(
.of(
Yup.object().shape({ Yup.object().shape({
content: Yup.string().required("validation.required"), content: Yup.string().required("validation.required"),
content_image: Yup.string().nullable(), content_image: Yup.string().nullable(),
isCorrect: Yup.boolean(), isCorrect: Yup.boolean(),
}), }),
).test(
'at-least-one-correct',
'At least one answer must be correct',
(answers:any) => {
return answers.some((answer:any) => answer.isCorrect === true);
}
), ),
}); });
}; };
@ -95,13 +86,16 @@ export const getValidationSchemaBase = () => {
}), }),
) )
.test( .test(
'at-least-one-correct', "at-least-one-correct",
'At least one answer must be correct', "At least one answer must be correct",
(answers: any) => { (answers: any) => {
console.log(answers, "answers"); console.log(answers, "answers");
return answers.some((answer:any) => answer.isCorrect === true); return answers.some(
} (answer: any) =>
answer.isCorrect === true || answer.isCorrect === 1,
);
},
), ),
}), }),
), ),
@ -113,8 +107,8 @@ export function processTags(DataToSend: any) {
const oldTags = DataToSend?.tags const oldTags = DataToSend?.tags
?.map((item: any, index: number) => { ?.map((item: any, index: number) => {
if (typeof item === "number") { if (typeof item === "number" || typeof item?.id === "number") {
return item; return item?.id ?? item;
} }
}) })
.filter((item: any) => item !== undefined); .filter((item: any) => item !== undefined);
@ -123,10 +117,13 @@ export function processTags(DataToSend: any) {
?.map((item: any, index: number) => { ?.map((item: any, index: number) => {
console.log(item); console.log(item);
if (typeof item === "string" && item !== "") { if (
(typeof item === "string" && item !== "") ||
(typeof item?.id === "string" && item?.id !== "")
) {
console.log(item); console.log(item);
return { name: item }; return { name: item?.id ?? item };
} }
}) })
.filter((item: any) => item !== undefined); .filter((item: any) => item !== undefined);

View File

@ -24,8 +24,7 @@ const TableHeader = () => {
const deleteMutation = useDeleteQuestion(); const deleteMutation = useDeleteQuestion();
const { unit_id, grade_id, subject_id, lesson_id } = const { unit_id, grade_id, subject_id, lesson_id } = useParams<ParamsEnum>();
useParams<ParamsEnum>();
const { data: unit } = useGetAllUnit({ show: unit_id }); const { data: unit } = useGetAllUnit({ show: unit_id });
const { data: Subject } = useGetAllSubject({ const { data: Subject } = useGetAllSubject({
@ -53,7 +52,7 @@ const TableHeader = () => {
" / " + " / " +
unitName + unitName +
" / " + " / " +
LessonName LessonName,
); );
return ( return (
@ -68,7 +67,8 @@ const TableHeader = () => {
/> />
<FilterLayout <FilterLayout
sub_children={<FilterForm />} sub_children={<FilterForm />}
filterTitle={` ${unitName} (${LessonName}) `} /> filterTitle={` ${unitName} (${LessonName}) `}
/>
<Table /> <Table />
</Suspense> </Suspense>
<DeleteModels <DeleteModels

View File

@ -35,7 +35,7 @@ const TableWithHeader = () => {
useSetPageTitle( useSetPageTitle(
t(`page_header.grade`) + t(`page_header.grade`) +
" / " + " / " +
` ${t("header.subject_of_class")} (${gradeName})` ` ${t("header.subject_of_class")} (${gradeName})`,
); );
return ( return (

View File

@ -7,14 +7,11 @@ import useFilter from "../../Components/FilterField/components/useFilter";
const Dummy = () => { const Dummy = () => {
const [t] = useTranslation(); const [t] = useTranslation();
useSetPageTitle(`${t(ABILITIES_ENUM?.MAIN_PAGE)} / ${t("dashboard")}`); useSetPageTitle(`${t(ABILITIES_ENUM?.MAIN_PAGE)} / ${t("dashboard")}`);
const {FilterButton,FilterBody} = useFilter() const { FilterButton, FilterBody } = useFilter();
return ( return (
<div className="DummyHomePage"> <div className="DummyHomePage">
<FilterButton/> {/* <FilterButton />
<FilterBody> <FilterBody>karim</FilterBody> */}
karim
</FilterBody>
</div> </div>
); );
}; };

View File

@ -7,7 +7,11 @@ const FilterForm = () => {
<div> <div>
<Row> <Row>
<Col> <Col>
<ValidationField placeholder="activation_date" label="activation_date" name="activation_date" /> <ValidationField
placeholder="activation_date"
label="activation_date"
name="activation_date"
/>
{/* <ValidationField placeholder="name" label="name" name="name" /> */} {/* <ValidationField placeholder="name" label="name" name="name" /> */}
</Col> </Col>
</Row> </Row>

View File

@ -3,23 +3,40 @@ import ValidationField from "../../../../Components/ValidationField/ValidationFi
import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect"; import useFormatDataToSelect from "../../../../utils/useFormatDataToSelect";
const Form = ({ isEdit }: { isEdit?: boolean }) => { const Form = ({ isEdit }: { isEdit?: boolean }) => {
const typeOptions = [ const typeOptions = [
{ id: "student", name: "student" }, { id: "student", name: "student" },
{ id: "reseller", name: "reseller" }, { id: "reseller", name: "reseller" },
{ id: "admin", name: "admin" }, { id: "admin", name: "admin" },
] ];
const typeArray = useFormatDataToSelect(typeOptions) const typeArray = useFormatDataToSelect(typeOptions);
return ( return (
<Row className="w-100"> <Row className="w-100">
<Col> <Col>
<ValidationField type="Date" placeholder="activation_date" label="activation_date" name="activation_date" /> <ValidationField
<ValidationField type="Date" placeholder="expiration_date" label="expiration_date" name="expiration_date" /> type="Date"
<ValidationField placeholder="student_id" label="student_id" name="student_id" /> placeholder="activation_date"
label="activation_date"
name="activation_date"
/>
<ValidationField
type="Date"
placeholder="expiration_date"
label="expiration_date"
name="expiration_date"
/>
<ValidationField
placeholder="student_id"
label="student_id"
name="student_id"
/>
</Col> </Col>
<Col> <Col>
<ValidationField placeholder="package_id" label="package_id" name="package_id" /> <ValidationField
placeholder="package_id"
label="package_id"
name="package_id"
/>
</Col> </Col>
</Row> </Row>
); );

View File

@ -12,7 +12,6 @@ export const getInitialValues = (objectToEdit: any): any => {
: null, : null,
student_id: objectToEdit?.student_id ?? null, student_id: objectToEdit?.student_id ?? null,
package_id: objectToEdit?.package_id ?? null, package_id: objectToEdit?.package_id ?? null,
}; };
}; };
export const getValidationSchema = () => { export const getValidationSchema = () => {

View File

@ -18,9 +18,7 @@ const DeleteModalForm = lazy(
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
useSetPageTitle( useSetPageTitle(t(`page_header.student_package`));
t(`page_header.student_package`),
);
// const deleteMutation = useDeleteUser(); // const deleteMutation = useDeleteUser();
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">

View File

@ -46,24 +46,24 @@ export const useColumns = () => {
key: "first_name", key: "first_name",
align: "center", align: "center",
render: (row) => { render: (row) => {
return(row?.student?.first_name) return row?.student?.first_name;
} },
}, },
{ {
title: t("columns.last_name"), title: t("columns.last_name"),
key: "last_name", key: "last_name",
align: "center", align: "center",
render: (row) => { render: (row) => {
return(row?.student?.last_name) return row?.student?.last_name;
} },
}, },
{ {
title: t("columns.sex"), title: t("columns.sex"),
key: "sex", key: "sex",
align: "center", align: "center",
render: (row) => { render: (row) => {
return(row?.student?.sex) return row?.student?.sex;
} },
}, },
// { // {
// title: t("columns.procedure"), // title: t("columns.procedure"),

View File

@ -25,15 +25,18 @@ const ShowStudent = React.lazy(() => import("./Pages/Admin/Student/show/Page"));
const ReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Page")); const ReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Page"));
const AddReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Add/Page")); const AddReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Add/Page"));
const EditReSeller = React.lazy(() => import("./Pages/Admin/Reseller/Edit/Page")); const EditReSeller = React.lazy(
() => import("./Pages/Admin/Reseller/Edit/Page"),
);
const User = React.lazy(() => import("./Pages/Admin/User/Page")); const User = React.lazy(() => import("./Pages/Admin/User/Page"));
const Param = React.lazy(() => import("./Pages/Admin/Param/Page")); const Param = React.lazy(() => import("./Pages/Admin/Param/Page"));
/// RESELLER /// /// RESELLER ///
const Student_Package = React.lazy(() => import("./Pages/ReSeller/StudentPackage/Page")); const Student_Package = React.lazy(
() => import("./Pages/ReSeller/StudentPackage/Page"),
);
import { hasAbility } from "./utils/hasAbility"; import { hasAbility } from "./utils/hasAbility";
import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "./enums/abilities"; import { ABILITIES_ENUM, ABILITIES_VALUES_ENUM } from "./enums/abilities";
@ -51,7 +54,7 @@ export const menuItems: TMenuItem[] = [
abilities: ABILITIES_ENUM?.PASS, abilities: ABILITIES_ENUM?.PASS,
abilities_value: ABILITIES_VALUES_ENUM.INDEX, abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 0, prevPath: 0,
type:UserTypeEnum?.PASS type: UserTypeEnum?.PASS,
}, },
{ {
header: "page_header.grade", header: "page_header.grade",
@ -92,7 +95,6 @@ export const menuItems: TMenuItem[] = [
abilities: ABILITIES_ENUM?.STUDENT, abilities: ABILITIES_ENUM?.STUDENT,
abilities_value: ABILITIES_VALUES_ENUM.INDEX, abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 0, prevPath: 0,
}, },
{ {
header: "page_header.reSeller", header: "page_header.reSeller",
@ -125,7 +127,6 @@ export const menuItems: TMenuItem[] = [
prevPath: 0, prevPath: 0,
}, },
/// RESELLER ///// /// RESELLER /////
{ {
@ -137,7 +138,7 @@ export const menuItems: TMenuItem[] = [
abilities: ABILITIES_ENUM?.Student_Package, abilities: ABILITIES_ENUM?.Student_Package,
abilities_value: ABILITIES_VALUES_ENUM.INDEX, abilities_value: ABILITIES_VALUES_ENUM.INDEX,
prevPath: 0, prevPath: 0,
type:UserTypeEnum.RE_SELLER type: UserTypeEnum.RE_SELLER,
}, },
]; ];

View File

@ -298,8 +298,6 @@ button:disabled {
visibility: hidden; visibility: hidden;
} }
.bg2 { .bg2 {
background: var(--bg2); background: var(--bg2);
} }
@ -310,7 +308,6 @@ button:disabled {
padding: 20px; padding: 20px;
h4 { h4 {
font-size: 20px; font-size: 20px;
} }
svg { svg {
background: var(--bg); background: var(--bg);
@ -319,4 +316,3 @@ button:disabled {
height: 40px; height: 40px;
} }
} }

View File

@ -18,12 +18,10 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
color: var(--white); color: var(--white);
} }
} }
.AuthForm { .AuthForm {
height: 440px; height: 440px;
width: 600px; width: 600px;
min-width: 300px; min-width: 300px;

View File

@ -61,5 +61,3 @@
font-size: 16px; font-size: 16px;
} }
} }

View File

@ -74,13 +74,14 @@
} }
} }
.filter_modal_add_button,
.filter_modal_add_button, .filter_modal_cancel_button{ .filter_modal_cancel_button {
padding: 20px 10px !important; padding: 20px 10px !important;
} }
@media screen and (max-width: 800px) { @media screen and (max-width: 800px) {
.filter_modal_add_button, .filter_modal_cancel_button{ .filter_modal_add_button,
.filter_modal_cancel_button {
font-size: 8px !important; font-size: 8px !important;
} }
} }

View File

@ -197,20 +197,16 @@
width: 100%; width: 100%;
} }
.SelectTag { .SelectTag {
padding-inline: 20px; padding-inline: 20px;
} }
.exercise_add { .exercise_add {
.add_new_button { .add_new_button {
padding-inline: 20px !important; padding-inline: 20px !important;
} }
} }
.HolderQuestion { .HolderQuestion {
transform: translateY(55px); transform: translateY(55px);
z-index: -1; z-index: -1;

View File

@ -6,12 +6,9 @@
> * { > * {
// max-width: 30%; // max-width: 30%;
flex-basis: 33%; flex-basis: 33%;
} }
} }
.AttachmentForm { .AttachmentForm {
.main_form_body { .main_form_body {
padding: 30px 50px; padding: 30px 50px;
@ -19,8 +16,6 @@
> * { > * {
// max-width: 30%; // max-width: 30%;
flex-basis: 10%; flex-basis: 10%;
} }
} }
} }
@ -40,11 +35,9 @@
background: var(--primary); background: var(--primary);
color: var(--white); color: var(--white);
&:first-child { &:first-child {
background: #F2F4F8; background: #f2f4f8;
color: #515B73; color: #515b73;
box-shadow: 0px 0px 4px rgb(0, 0, 0,.08); box-shadow: 0px 0px 4px rgb(0, 0, 0, 0.08);
} }
} }
} }

View File

@ -5,7 +5,7 @@ import { AxiosResponse } from "../../types/Axios";
type DataToSend = { type DataToSend = {
id?: number | string | any; id?: number | string | any;
key?: string | any key?: string | any;
}; };
function useDeleteMutation( function useDeleteMutation(

View File

@ -13,7 +13,7 @@ function useGetQuery(
options: any = {}, options: any = {},
) { ) {
const axios = useAxios(); const axios = useAxios();
const {Filter} = useFilterStateState() const { Filter } = useFilterStateState();
const sort_by = Filter?.sort_by ?? null; const sort_by = Filter?.sort_by ?? null;
const name = Filter?.name ?? null; const name = Filter?.name ?? null;
const { show, pagination, ...remainingParams } = params; const { show, pagination, ...remainingParams } = params;

View File

@ -19,7 +19,6 @@ const useUpdateMutation = (
request = dataToSend; request = dataToSend;
id = dataToSend.get("id"); id = dataToSend.get("id");
console.log(dataToSend); console.log(dataToSend);
} else { } else {
request = { ...dataToSend, _method: "PUT" }; request = { ...dataToSend, _method: "PUT" };
id = dataToSend?.id || dataToSend?.key; id = dataToSend?.id || dataToSend?.key;

View File

@ -2,4 +2,4 @@ export const statusType = [
{ id: "upcoming", name: "select.upcoming" }, { id: "upcoming", name: "select.upcoming" },
{ id: "waiting", name: "select.waiting" }, { id: "waiting", name: "select.waiting" },
{ id: "done", name: "select.done" }, { id: "done", name: "select.done" },
] ];

View File

@ -2,4 +2,4 @@ export const userTypeOptions = [
{ id: "student", name: "student" }, { id: "student", name: "student" },
{ id: "reseller", name: "reseller" }, { id: "reseller", name: "reseller" },
{ id: "admin", name: "admin" }, { id: "admin", name: "admin" },
] ];

View File

@ -1,6 +1,4 @@
export enum CombinationKeyEnum { export enum CombinationKeyEnum {
QUESTION = "KeyK", QUESTION = "KeyK",
CHOICE = "KeyJ" CHOICE = "KeyJ",
} }

View File

@ -186,6 +186,4 @@ export enum ModalEnum {
Student_Package_EDIT = "Student_Package.edit", Student_Package_EDIT = "Student_Package.edit",
Student_Package_ADD = "Student_Package.add", Student_Package_ADD = "Student_Package.add",
Student_Package_DELETE = "Student_Package.delete", Student_Package_DELETE = "Student_Package.delete",
} }

View File

@ -1,6 +1,5 @@
export enum UserTypeEnum { export enum UserTypeEnum {
ADMIN = "admin", ADMIN = "admin",
RE_SELLER = "reseller", RE_SELLER = "reseller",
PASS="pass" PASS = "pass",
} }

View File

@ -46,7 +46,7 @@ export enum ABILITIES_ENUM {
Report = "report", Report = "report",
User = "user", User = "user",
RE_SELLER = "reseller", RE_SELLER = "reseller",
Student_Package = "student_package" Student_Package = "student_package",
//// ////
} }

View File

@ -777,14 +777,14 @@
"user": "مستخدم", "user": "مستخدم",
"param": "معامل", "param": "معامل",
"student_package": "حزمة الطالب", "student_package": "حزمة الطالب",
"users":"المستخدمون",
"students":"الطلاب",
"students_details":"تفاصيل الطلاب",
"add_reseller": "إضافة بائع", "add_reseller": "إضافة بائع",
"grade": "الصفوف", "grade": "الصفوف",
"report": "تقرير", "report": "تقرير",
"tags": "كلمات مفتاحية", "tags": "كلمات مفتاحية",
"users":"المستخدمون", "reseller":"البائعين"
"reseller":"البائعين",
"students":"الطلاب",
"students_details":"تفاصيل الطلاب"
}, },
"page_header": { "page_header": {
"dashboard": "لوحة القيادة / الصفحة الرئيسية", "dashboard": "لوحة القيادة / الصفحة الرئيسية",

View File

@ -1,3 +1 @@
{ {}
}

View File

@ -16,7 +16,7 @@ type TMenuItemBase = {
withOutLayout?: boolean; withOutLayout?: boolean;
abilities: ABILITIES_ENUM; abilities: ABILITIES_ENUM;
abilities_value: ABILITIES_VALUES_ENUM; abilities_value: ABILITIES_VALUES_ENUM;
type?:UserTypeEnum type?: UserTypeEnum;
prevPath: number; prevPath: number;
}; };
@ -40,7 +40,7 @@ export type TCrudRoute = {
element: ReactElement | LazyExoticComponent<any>; element: ReactElement | LazyExoticComponent<any>;
abilities: ABILITIES_ENUM; abilities: ABILITIES_ENUM;
abilities_value: ABILITIES_VALUES_ENUM; abilities_value: ABILITIES_VALUES_ENUM;
type?:UserTypeEnum type?: UserTypeEnum;
prevPath: number; prevPath: number;
}; };

View File

@ -342,7 +342,6 @@ export type param = {
value: string; value: string;
}; };
export type Student_Package = { export type Student_Package = {
id: number; id: number;
student: student; student: student;
@ -355,10 +354,3 @@ type student = {
last_name:string; last_name:string;
sex:string sex:string
} }
export type single_user = {
id: number;
type: student;
expiration_date: string;
activation_date: string;
};

View File

@ -2,12 +2,11 @@ import { Nullable } from "./App";
// Define the Teacher interface // Define the Teacher interface
interface ReSellerUser { interface ReSellerUser {
id: number; id: number;
username: string; username: string;
phone_number: string | null; phone_number: string | null;
type: 'reseller' | 'other'; // Specify other types if needed type: "reseller" | "other"; // Specify other types if needed
} }
interface ReSellerLocation { interface ReSellerLocation {
@ -21,7 +20,6 @@ interface ContactInfo {
card_number: string | null; card_number: string | null;
} }
export interface ReSeller { export interface ReSeller {
id: number; id: number;
user: ReSellerUser; user: ReSellerUser;
@ -29,8 +27,8 @@ export interface ReSeller {
last_name: string; last_name: string;
location: ReSellerLocation; location: ReSellerLocation;
contact_info: ContactInfo; contact_info: ContactInfo;
contact_number1 : string | number contact_number1: string | number;
contact_number2 : string | number contact_number2: string | number;
} }
export interface InitialValues { export interface InitialValues {
@ -42,9 +40,9 @@ export interface InitialValues {
lat: string | Number; lat: string | Number;
lng: string | Number; lng: string | Number;
contact_info: ContactInfo; contact_info: ContactInfo;
contact_number1 : string | number contact_number1: string | number;
contact_number2 : string | number contact_number2: string | number;
username : string username: string;
} }
export type ReSellerInitialValues = Partial<Nullable<InitialValues>>; export type ReSellerInitialValues = Partial<Nullable<InitialValues>>;

View File

@ -10,9 +10,11 @@ export const RoleByType = (item: { type?: string }):boolean=>{
const isReSellerRoute = type === UserTypeEnum.RE_SELLER; const isReSellerRoute = type === UserTypeEnum.RE_SELLER;
if (!LocalType) { if (!LocalType) {
return false return false;
}
if (type === UserTypeEnum.PASS) {
return true;
} }
if(type === UserTypeEnum.PASS) { return true } ;
if (isAdmin && isReSellerRoute) { if (isAdmin && isReSellerRoute) {
return false; return false;
@ -23,4 +25,4 @@ export const RoleByType = (item: { type?: string }):boolean=>{
} }
return true; return true;
} };

View File

@ -0,0 +1,15 @@
export const deletePathSegments = (path: string, num: number): string => {
// Split the path by '/'
const segments = path.split("/");
// Handle cases where the number of segments to delete is greater than available segments
if (num >= segments.length - 1) {
return "/";
}
// Remove the specified number of segments from the end
const newSegments = segments.slice(0, -num);
// Join the remaining segments back into a path
return newSegments.join("/");
};

View File

@ -3,8 +3,8 @@ export const formatDate = (dateString:any) => {
const date = new Date(dateString); const date = new Date(dateString);
const year = date.getFullYear(); const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based const month = String(date.getMonth() + 1).padStart(2, "0"); // Months are zero-based
const day = String(date.getDate()).padStart(2, '0'); const day = String(date.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`; // Return formatted date return `${year}-${month}-${day}`; // Return formatted date
}; };

View File

@ -640,7 +640,6 @@ export const canShowReSeller = hasAbility(
ABILITIES_VALUES_ENUM.SHOW, ABILITIES_VALUES_ENUM.SHOW,
); );
/// Param /// Param
export const canAddParam = hasAbility( export const canAddParam = hasAbility(
@ -661,7 +660,6 @@ export const canShowParam = hasAbility(
ABILITIES_VALUES_ENUM.SHOW, ABILITIES_VALUES_ENUM.SHOW,
); );
/// User /// User
export const canAddStudent_Package = hasAbility( export const canAddStudent_Package = hasAbility(

View File

@ -1,6 +1,6 @@
export function removeStringKeys(obj: any, keysToRemove: string[]): any { export function removeStringKeys(obj: any, keysToRemove: string[]): any {
// Check if the input is an object or array // Check if the input is an object or array
if (obj && typeof obj === 'object') { if (obj && typeof obj === "object") {
// Handle arrays // Handle arrays
if (Array.isArray(obj)) { if (Array.isArray(obj)) {
obj.forEach((item, index) => { obj.forEach((item, index) => {
@ -12,7 +12,10 @@ export function removeStringKeys(obj: any, keysToRemove: string[]): any {
if (obj.hasOwnProperty(key)) { if (obj.hasOwnProperty(key)) {
const value = obj[key]; const value = obj[key];
// Check if the value is a string or "null" and the key is in keysToRemove // Check if the value is a string or "null" and the key is in keysToRemove
if (keysToRemove.includes(key) && (typeof value === 'string' || value === 'null')) { if (
keysToRemove.includes(key) &&
(typeof value === "string" || value === "null")
) {
delete obj[key]; delete obj[key];
} else { } else {
// Recursively process nested objects or arrays // Recursively process nested objects or arrays

View File

@ -2,7 +2,6 @@ const useFormatDataToSelect = (Data: any) => {
const format = (data: any) => { const format = (data: any) => {
if (!Array.isArray(data)) return []; // Check if data is an array if (!Array.isArray(data)) return []; // Check if data is an array
return data?.map((item: any) => ({ return data?.map((item: any) => ({
value: item?.id, value: item?.id,
label: item?.name ?? item?.title, label: item?.name ?? item?.title,
})); }));