This commit is contained in:
karimaldeen 2024-08-17 11:10:32 +03:00
parent aece39ae8f
commit a0000066ab
64 changed files with 6338 additions and 3702 deletions

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,6 @@ const ColumnsImage = ({ src }: any) => {
const handleError = useImageError; const handleError = useImageError;
return ( return (
<Image <Image
width={45} width={45}

View File

@ -4,23 +4,21 @@ import { Button } from "antd";
import React, { useContext } from "react"; import React, { useContext } from "react";
export const DragHandle: React.FC = () => { export const DragHandle: React.FC = () => {
interface RowContextProps {
interface RowContextProps {
setActivatorNodeRef?: (element: HTMLElement | null) => void; setActivatorNodeRef?: (element: HTMLElement | null) => void;
listeners?: SyntheticListenerMap; listeners?: SyntheticListenerMap;
} }
const RowContext = React.createContext<RowContextProps>({}); const RowContext = React.createContext<RowContextProps>({});
const { setActivatorNodeRef, listeners } = useContext(RowContext); const { setActivatorNodeRef, listeners } = useContext(RowContext);
return ( return (
<Button <Button
type="text" type="text"
size="small" size="small"
icon={<HolderOutlined />} icon={<HolderOutlined />}
style={{ cursor: 'move' }} style={{ cursor: "move" }}
ref={setActivatorNodeRef} ref={setActivatorNodeRef}
{...listeners} {...listeners}
/> />
); );
}; };

View File

@ -1,18 +1,18 @@
import React, { useContext, useMemo } from 'react'; import React, { useContext, useMemo } from "react";
import { HolderOutlined } from '@ant-design/icons'; import { HolderOutlined } from "@ant-design/icons";
import type { DragEndEvent } from '@dnd-kit/core'; import type { DragEndEvent } from "@dnd-kit/core";
import { DndContext } from '@dnd-kit/core'; import { DndContext } from "@dnd-kit/core";
import type { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities'; import type { SyntheticListenerMap } from "@dnd-kit/core/dist/hooks/utilities";
import { restrictToVerticalAxis } from '@dnd-kit/modifiers'; import { restrictToVerticalAxis } from "@dnd-kit/modifiers";
import { import {
arrayMove, arrayMove,
SortableContext, SortableContext,
useSortable, useSortable,
verticalListSortingStrategy, verticalListSortingStrategy,
} from '@dnd-kit/sortable'; } from "@dnd-kit/sortable";
import { CSS } from '@dnd-kit/utilities'; import { CSS } from "@dnd-kit/utilities";
import { Button, Table } from 'antd'; import { Button, Table } from "antd";
import type { TableColumnsType } from 'antd'; import type { TableColumnsType } from "antd";
interface DataType { interface DataType {
key: string; key: string;
@ -36,7 +36,7 @@ const DragHandle: React.FC = () => {
type="text" type="text"
size="small" size="small"
icon={<HolderOutlined />} icon={<HolderOutlined />}
style={{ cursor: 'move' }} style={{ cursor: "move" }}
ref={setActivatorNodeRef} ref={setActivatorNodeRef}
{...listeners} {...listeners}
/> />
@ -44,20 +44,20 @@ const DragHandle: React.FC = () => {
}; };
const columns: TableColumnsType<DataType> = [ const columns: TableColumnsType<DataType> = [
{ key: 'sort', align: 'center', width: 80, render: () => <DragHandle /> }, { key: "sort", align: "center", width: 80, render: () => <DragHandle /> },
{ title: 'Name', dataIndex: 'name' }, { title: "Name", dataIndex: "name" },
{ title: 'Age', dataIndex: 'age' }, { title: "Age", dataIndex: "age" },
{ title: 'Address', dataIndex: 'address' }, { title: "Address", dataIndex: "address" },
]; ];
const initialData: DataType[] = [ const initialData: DataType[] = [
{ key: '1', order: 1, name: '1', age: 32, address: 'Long text Long' }, { key: "1", order: 1, name: "1", age: 32, address: "Long text Long" },
{ key: '4', order: 4, name: '4', age: 42, address: 'London No. 1 Lake Park' }, { key: "4", order: 4, name: "4", age: 42, address: "London No. 1 Lake Park" },
{ key: '3', order: 3, name: '3', age: 32, address: 'Sidney No. 1 Lake Park' }, { key: "3", order: 3, name: "3", age: 32, address: "Sidney No. 1 Lake Park" },
].sort((a, b) => a.order - b.order); ].sort((a, b) => a.order - b.order);
interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> { interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
'data-row-key': string; "data-row-key": string;
} }
const Row: React.FC<RowProps> = (props) => { const Row: React.FC<RowProps> = (props) => {
@ -69,13 +69,13 @@ const Row: React.FC<RowProps> = (props) => {
transform, transform,
transition, transition,
isDragging, isDragging,
} = useSortable({ id: props['data-row-key'] }); } = useSortable({ id: props["data-row-key"] });
const style: React.CSSProperties = { const style: React.CSSProperties = {
...props.style, ...props.style,
transform: CSS.Translate.toString(transform), transform: CSS.Translate.toString(transform),
transition, transition,
...(isDragging ? { position: 'relative', zIndex: 9999 } : {}), ...(isDragging ? { position: "relative", zIndex: 9999 } : {}),
}; };
const contextValue = useMemo<RowContextProps>( const contextValue = useMemo<RowContextProps>(
@ -99,8 +99,12 @@ const DrapableTable: React.FC = () => {
console.log("Old Data:", dataSource); console.log("Old Data:", dataSource);
setDataSource((prevState) => { setDataSource((prevState) => {
const activeIndex = prevState.findIndex((record) => record.key === active?.id); const activeIndex = prevState.findIndex(
const overIndex = prevState.findIndex((record) => record.key === over?.id); (record) => record.key === active?.id,
);
const overIndex = prevState.findIndex(
(record) => record.key === over?.id,
);
const newState = arrayMove(prevState, activeIndex, overIndex); const newState = arrayMove(prevState, activeIndex, overIndex);
// Log the new state after reordering // Log the new state after reordering
@ -113,7 +117,10 @@ const DrapableTable: React.FC = () => {
return ( return (
<DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}> <DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}>
<SortableContext items={dataSource.map((i) => i.key)} strategy={verticalListSortingStrategy}> <SortableContext
items={dataSource.map((i) => i.key)}
strategy={verticalListSortingStrategy}
>
<Table <Table
rowKey="key" rowKey="key"
components={{ body: { row: Row } }} components={{ body: { row: Row } }}

View File

@ -1,4 +1,3 @@
import React from "react"; import React from "react";
import useFormField from "../../../Hooks/useFormField"; import useFormField from "../../../Hooks/useFormField";
import { Checkbox, Form } from "antd"; import { Checkbox, Form } from "antd";

View File

@ -1,18 +1,18 @@
import React, { useContext, useMemo } from 'react'; import React, { useContext, useMemo } from "react";
import { HolderOutlined } from '@ant-design/icons'; import { HolderOutlined } from "@ant-design/icons";
import type { DragEndEvent } from '@dnd-kit/core'; import type { DragEndEvent } from "@dnd-kit/core";
import { DndContext } from '@dnd-kit/core'; import { DndContext } from "@dnd-kit/core";
import type { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities'; import type { SyntheticListenerMap } from "@dnd-kit/core/dist/hooks/utilities";
import { restrictToVerticalAxis } from '@dnd-kit/modifiers'; import { restrictToVerticalAxis } from "@dnd-kit/modifiers";
import { import {
arrayMove, arrayMove,
SortableContext, SortableContext,
useSortable, useSortable,
verticalListSortingStrategy, verticalListSortingStrategy,
} from '@dnd-kit/sortable'; } from "@dnd-kit/sortable";
import { CSS } from '@dnd-kit/utilities'; import { CSS } from "@dnd-kit/utilities";
import { Button, Table } from 'antd'; import { Button, Table } from "antd";
import type { TableColumnsType } from 'antd'; import type { TableColumnsType } from "antd";
interface DataType { interface DataType {
key: string; key: string;
@ -36,7 +36,7 @@ const DragHandle: React.FC = () => {
type="text" type="text"
size="small" size="small"
icon={<HolderOutlined />} icon={<HolderOutlined />}
style={{ cursor: 'move' }} style={{ cursor: "move" }}
ref={setActivatorNodeRef} ref={setActivatorNodeRef}
{...listeners} {...listeners}
/> />
@ -44,20 +44,20 @@ const DragHandle: React.FC = () => {
}; };
const columns: TableColumnsType<DataType> = [ const columns: TableColumnsType<DataType> = [
{ key: 'sort', align: 'center', width: 80, render: () => <DragHandle /> }, { key: "sort", align: "center", width: 80, render: () => <DragHandle /> },
{ title: 'Name', dataIndex: 'name' }, { title: "Name", dataIndex: "name" },
{ title: 'Age', dataIndex: 'age' }, { title: "Age", dataIndex: "age" },
{ title: 'Address', dataIndex: 'address' }, { title: "Address", dataIndex: "address" },
]; ];
const initialData: DataType[] = [ const initialData: DataType[] = [
{ key: '1', order: 1, name: '1', age: 32, address: 'Long text Long' }, { key: "1", order: 1, name: "1", age: 32, address: "Long text Long" },
{ key: '4', order: 4, name: '4', age: 42, address: 'London No. 1 Lake Park' }, { key: "4", order: 4, name: "4", age: 42, address: "London No. 1 Lake Park" },
{ key: '3', order: 3, name: '3', age: 32, address: 'Sidney No. 1 Lake Park' }, { key: "3", order: 3, name: "3", age: 32, address: "Sidney No. 1 Lake Park" },
].sort((a, b) => a.order - b.order); ].sort((a, b) => a.order - b.order);
interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> { interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
'data-row-key': string; "data-row-key": string;
} }
const Row: React.FC<RowProps> = (props) => { const Row: React.FC<RowProps> = (props) => {
@ -69,13 +69,13 @@ const Row: React.FC<RowProps> = (props) => {
transform, transform,
transition, transition,
isDragging, isDragging,
} = useSortable({ id: props['data-row-key'] }); } = useSortable({ id: props["data-row-key"] });
const style: React.CSSProperties = { const style: React.CSSProperties = {
...props.style, ...props.style,
transform: CSS.Translate.toString(transform), transform: CSS.Translate.toString(transform),
transition, transition,
...(isDragging ? { position: 'relative', zIndex: 9999 } : {}), ...(isDragging ? { position: "relative", zIndex: 9999 } : {}),
}; };
const contextValue = useMemo<RowContextProps>( const contextValue = useMemo<RowContextProps>(
@ -99,8 +99,12 @@ const App: React.FC = () => {
console.log("Old Data:", dataSource); console.log("Old Data:", dataSource);
setDataSource((prevState) => { setDataSource((prevState) => {
const activeIndex = prevState.findIndex((record) => record.key === active?.id); const activeIndex = prevState.findIndex(
const overIndex = prevState.findIndex((record) => record.key === over?.id); (record) => record.key === active?.id,
);
const overIndex = prevState.findIndex(
(record) => record.key === over?.id,
);
const newState = arrayMove(prevState, activeIndex, overIndex); const newState = arrayMove(prevState, activeIndex, overIndex);
// Log the new state after reordering // Log the new state after reordering
@ -113,7 +117,10 @@ const App: React.FC = () => {
return ( return (
<DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}> <DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}>
<SortableContext items={dataSource.map((i) => i.key)} strategy={verticalListSortingStrategy}> <SortableContext
items={dataSource.map((i) => i.key)}
strategy={verticalListSortingStrategy}
>
<Table <Table
rowKey="key" rowKey="key"
components={{ body: { row: Row } }} components={{ body: { row: Row } }}

View File

@ -27,10 +27,10 @@ const NavBar = () => {
return ( return (
<div className="NavBar"> <div className="NavBar">
<Suspense fallback={<SpinContainer />}> <Suspense fallback={<SpinContainer />}>
<span className="navbar_link" onClick={handelNavigate}> <span className="navbar_link" onClick={handelNavigate}>
<MdOutlineArrowForwardIos /> {PageTitle} <MdOutlineArrowForwardIos /> {PageTitle}
</span> </span>
<NavBarRightSide /> <NavBarRightSide />
<ChangePasswordModel /> <ChangePasswordModel />
</Suspense> </Suspense>
</div> </div>

View File

@ -32,7 +32,7 @@ const EditModel: React.FC = () => {
getInitialValues={getInitialValues(objectToEdit)} getInitialValues={getInitialValues(objectToEdit)}
getValidationSchema={getValidationSchema} getValidationSchema={getValidationSchema}
isAddModal={false} isAddModal={false}
width="40vw" width="40vw"
> >
<ModelForm /> <ModelForm />
</LayoutModel> </LayoutModel>

View File

@ -9,16 +9,18 @@ import { ModalEnum } from "../../enums/Model";
import { useDeleteCurriculum } from "../../api/curriculum"; import { useDeleteCurriculum } from "../../api/curriculum";
import { useGetAllGrade } from "../../api/grade"; import { useGetAllGrade } from "../../api/grade";
const Table = lazy(() => import('./Table')); const Table = lazy(() => import("./Table"));
const AddModalForm = lazy(() => import('./Model/AddModel')); const AddModalForm = lazy(() => import("./Model/AddModel"));
const EditModalForm = lazy(() => import('./Model/EditModel')); const EditModalForm = lazy(() => import("./Model/EditModel"));
const DeleteModalForm = lazy(() => import('../../Layout/Dashboard/DeleteModels')); const DeleteModalForm = lazy(
() => import("../../Layout/Dashboard/DeleteModels"),
);
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
const deleteMutation = useDeleteCurriculum(); const deleteMutation = useDeleteCurriculum();
const { subject_id,grade_id} = useParams<ParamsEnum>(); const { subject_id, grade_id } = useParams<ParamsEnum>();
const { data: Subject } = useGetAllSubject({ const { data: Subject } = useGetAllSubject({
show: subject_id, show: subject_id,
@ -31,24 +33,31 @@ const TableHeader = () => {
const SubjectName = Subject?.data?.name ?? ""; const SubjectName = Subject?.data?.name ?? "";
useSetPageTitle( t(`page_header.grade`)+ "/"+ gradeName +"/"+t(`PageTitle.subject`)+"/"+SubjectName+"/"+t("PageTitle.curriculum")); useSetPageTitle(
t(`page_header.grade`) +
"/" +
gradeName +
"/" +
t(`PageTitle.subject`) +
"/" +
SubjectName +
"/" +
t("PageTitle.curriculum"),
);
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">
<Suspense fallback={<Spin />}> <Suspense fallback={<Spin />}>
<header> <header>
<h6> <h6>{t("models.curriculum")}</h6>
{t("models.curriculum")}
</h6>
</header> </header>
<Table /> <Table />
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />
<DeleteModalForm <DeleteModalForm
deleteMutation={deleteMutation} deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.CURRICULUM_DELETE} ModelEnum={ModalEnum?.CURRICULUM_DELETE}
/> />
</Suspense> </Suspense>
</div> </div>
); );

View File

@ -7,7 +7,10 @@ import { ParamsEnum } from "../../enums/params";
const App: React.FC = () => { const App: React.FC = () => {
const { subject_id } = useParams<ParamsEnum>(); const { subject_id } = useParams<ParamsEnum>();
const response = useGetAllCurriculum({ subject_id: subject_id, pagination: true }); const response = useGetAllCurriculum({
subject_id: subject_id,
pagination: true,
});
console.log(response?.data?.data, "response?.data"); console.log(response?.data?.data, "response?.data");
return <DataTable response={response} useColumns={useColumns} />; return <DataTable response={response} useColumns={useColumns} />;

View File

@ -1,4 +1,4 @@
import { TableColumnsType } from "antd"; import { TableColumnsType } from "antd";
import { Curriculum } from "../../types/Curriculum"; import { Curriculum } from "../../types/Curriculum";
import { FaPlus } from "react-icons/fa"; import { FaPlus } from "react-icons/fa";
import useModalHandler from "../../utils/useModalHandler"; import useModalHandler from "../../utils/useModalHandler";
@ -52,7 +52,6 @@ export const useColumns = () => {
render: (text, record) => record?.name, render: (text, record) => record?.name,
}, },
{ {
title: canAddCurriculum ? ( title: canAddCurriculum ? (
<button <button

View File

@ -1,7 +1,9 @@
import * as Yup from "yup"; import * as Yup from "yup";
import { Grade, GradeInitialValues } from "../../../types/Grade"; import { Grade, GradeInitialValues } from "../../../types/Grade";
export const getInitialValues = (objectToEdit: Partial<Grade>): GradeInitialValues => { export const getInitialValues = (
objectToEdit: Partial<Grade>,
): GradeInitialValues => {
return { return {
id: objectToEdit?.id, id: objectToEdit?.id,
name: objectToEdit?.name ?? "", name: objectToEdit?.name ?? "",
@ -13,6 +15,5 @@ export const getValidationSchema = () => {
// validate input // validate input
return Yup.object().shape({ return Yup.object().shape({
name: Yup.string().required("validation.required"), name: Yup.string().required("validation.required"),
}); });
}; };

View File

@ -5,10 +5,12 @@ import useSetPageTitle from "../../Hooks/useSetPageTitle";
import { ModalEnum } from "../../enums/Model"; import { ModalEnum } from "../../enums/Model";
import { useDeleteGrade } from "../../api/grade"; import { useDeleteGrade } from "../../api/grade";
const Table = lazy(() => import('./Table')); const Table = lazy(() => import("./Table"));
const AddModalForm = lazy(() => import('./Model/AddModel')); const AddModalForm = lazy(() => import("./Model/AddModel"));
const EditModalForm = lazy(() => import('./Model/EditModel')); const EditModalForm = lazy(() => import("./Model/EditModel"));
const DeleteModalForm = lazy(() => import('../../Layout/Dashboard/DeleteModels')); const DeleteModalForm = lazy(
() => import("../../Layout/Dashboard/DeleteModels"),
);
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
@ -20,17 +22,15 @@ const TableHeader = () => {
<div className="TableWithHeader"> <div className="TableWithHeader">
<Suspense fallback={<Spin />}> <Suspense fallback={<Spin />}>
<header> <header>
<h6> <h6>{t("models.grade")}</h6>
{t("models.grade")}
</h6>
</header> </header>
<Table /> <Table />
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />
<DeleteModalForm <DeleteModalForm
deleteMutation={deleteMutation} deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.GRADE_DELETE} ModelEnum={ModalEnum?.GRADE_DELETE}
/> />
</Suspense> </Suspense>
</div> </div>
); );

View File

@ -1,4 +1,4 @@
import { TableColumnsType } from "antd"; import { TableColumnsType } from "antd";
import { Grade } from "../../types/Grade"; import { Grade } from "../../types/Grade";
import { FaPlus } from "react-icons/fa"; import { FaPlus } from "react-icons/fa";
import useModalHandler from "../../utils/useModalHandler"; import useModalHandler from "../../utils/useModalHandler";
@ -57,7 +57,7 @@ export const useColumns = () => {
dataIndex: "image", dataIndex: "image",
key: "image", key: "image",
align: "center", align: "center",
render: (_text: any,record:Grade) => { render: (_text: any, record: Grade) => {
let str = record?.icon; let str = record?.icon;
return <ColumnsImage src={str} />; return <ColumnsImage src={str} />;
}, },

View File

@ -10,7 +10,9 @@ import { useDeleteTag } from "../../api/tags";
const Table = lazy(() => import("./Table")); const Table = lazy(() => import("./Table"));
const AddModalForm = lazy(() => import("./Model/AddModel")); const AddModalForm = lazy(() => import("./Model/AddModel"));
const EditModalForm = lazy(() => import("./Model/EditModel")); const EditModalForm = lazy(() => import("./Model/EditModel"));
const DeleteModalForm = lazy(() => import("../../Layout/Dashboard/DeleteModels")); const DeleteModalForm = lazy(
() => import("../../Layout/Dashboard/DeleteModels"),
);
const SearchField = lazy( const SearchField = lazy(
() => import("../../Components/DataTable/SearchField"), () => import("../../Components/DataTable/SearchField"),
); );
@ -18,9 +20,7 @@ const SearchField = lazy(
const TableHeader = () => { const TableHeader = () => {
const { handel_open_model } = useModalHandler(); const { handel_open_model } = useModalHandler();
const [t] = useTranslation(); const [t] = useTranslation();
useSetPageTitle( useSetPageTitle(t(`page_header.tags`));
t(`page_header.tags`),
);
const deleteMutation = useDeleteTag(); const deleteMutation = useDeleteTag();
return ( return (
@ -48,7 +48,7 @@ const TableHeader = () => {
<DeleteModalForm <DeleteModalForm
deleteMutation={deleteMutation} deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.TAGS_DELETE} ModelEnum={ModalEnum?.TAGS_DELETE}
/> />
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />
</Suspense> </Suspense>

View File

@ -13,11 +13,11 @@ export const useColumns = () => {
const { setIsOpen } = useModalState((state) => state); const { setIsOpen } = useModalState((state) => state);
const { setObjectToEdit } = useObjectToEdit((state) => state); const { setObjectToEdit } = useObjectToEdit((state) => state);
const handelDelete = (record:any) => { const handelDelete = (record: any) => {
setObjectToEdit(record); setObjectToEdit(record);
setIsOpen(ModalEnum?.TAGS_DELETE); setIsOpen(ModalEnum?.TAGS_DELETE);
}; };
const handleEdit = (record:any) => { const handleEdit = (record: any) => {
setObjectToEdit(record); setObjectToEdit(record);
setIsOpen(ModalEnum?.TAGS_EDIT); setIsOpen(ModalEnum?.TAGS_EDIT);
}; };

View File

@ -1,21 +1,21 @@
import React, { useContext, useEffect, useMemo } from 'react'; import React, { useContext, useEffect, useMemo } from "react";
import { HolderOutlined } from '@ant-design/icons'; import { HolderOutlined } from "@ant-design/icons";
import type { DragEndEvent } from '@dnd-kit/core'; import type { DragEndEvent } from "@dnd-kit/core";
import { DndContext } from '@dnd-kit/core'; import { DndContext } from "@dnd-kit/core";
import type { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities'; import type { SyntheticListenerMap } from "@dnd-kit/core/dist/hooks/utilities";
import { restrictToVerticalAxis } from '@dnd-kit/modifiers'; import { restrictToVerticalAxis } from "@dnd-kit/modifiers";
import { import {
arrayMove, arrayMove,
SortableContext, SortableContext,
useSortable, useSortable,
verticalListSortingStrategy, verticalListSortingStrategy,
} from '@dnd-kit/sortable'; } from "@dnd-kit/sortable";
import { CSS } from '@dnd-kit/utilities'; import { CSS } from "@dnd-kit/utilities";
import { Button, Table } from 'antd'; import { Button, Table } from "antd";
import type { TableColumnsType } from 'antd'; import type { TableColumnsType } from "antd";
import { useParams } from 'react-router-dom'; import { useParams } from "react-router-dom";
import { ParamsEnum } from '../../enums/params'; import { ParamsEnum } from "../../enums/params";
import { useGetAllUnit } from '../../api/unit'; import { useGetAllUnit } from "../../api/unit";
interface DataType { interface DataType {
id: string; // Unique identifier for each row id: string; // Unique identifier for each row
@ -39,7 +39,7 @@ const DragHandle: React.FC = () => {
type="text" type="text"
size="small" size="small"
icon={<HolderOutlined />} icon={<HolderOutlined />}
style={{ cursor: 'move' }} style={{ cursor: "move" }}
ref={setActivatorNodeRef} ref={setActivatorNodeRef}
{...listeners} {...listeners}
/> />
@ -47,14 +47,14 @@ const DragHandle: React.FC = () => {
}; };
const columns: TableColumnsType<DataType> = [ const columns: TableColumnsType<DataType> = [
{ key: 'sort', align: 'center', width: 80, render: () => <DragHandle /> }, { key: "sort", align: "center", width: 80, render: () => <DragHandle /> },
{ title: 'Name', dataIndex: 'name' }, { title: "Name", dataIndex: "name" },
{ title: 'Age', dataIndex: 'age' }, { title: "Age", dataIndex: "age" },
{ title: 'Address', dataIndex: 'address' }, { title: "Address", dataIndex: "address" },
]; ];
interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> { interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
'data-row-key': string; "data-row-key": string;
} }
const Row: React.FC<RowProps> = (props) => { const Row: React.FC<RowProps> = (props) => {
@ -66,13 +66,13 @@ const Row: React.FC<RowProps> = (props) => {
transform, transform,
transition, transition,
isDragging, isDragging,
} = useSortable({ id: props['data-row-key'] }); } = useSortable({ id: props["data-row-key"] });
const style: React.CSSProperties = { const style: React.CSSProperties = {
...props.style, ...props.style,
transform: CSS.Translate.toString(transform), transform: CSS.Translate.toString(transform),
transition, transition,
...(isDragging ? { position: 'relative', zIndex: 9999 } : {}), ...(isDragging ? { position: "relative", zIndex: 9999 } : {}),
}; };
const contextValue = useMemo<RowContextProps>( const contextValue = useMemo<RowContextProps>(
@ -92,28 +92,33 @@ const DrapableTable: React.FC = () => {
const response = useGetAllUnit({ subject_id: subject_id, pagination: false }); const response = useGetAllUnit({ subject_id: subject_id, pagination: false });
// Assuming the response contains a unique id for each item // Assuming the response contains a unique id for each item
const data = response?.data?.data?.map((item: any, index: number) => ({ const data =
id: item.id, // Ensure this is a unique identifier response?.data?.data?.map((item: any, index: number) => ({
order: index + 1, // Assign order based on index id: item.id, // Ensure this is a unique identifier
name: item.name, order: index + 1, // Assign order based on index
age: item.age, name: item.name,
address: item.address, age: item.age,
})) ?? []; address: item.address,
})) ?? [];
const [dataSource, setDataSource] = React.useState<DataType[]>(data); const [dataSource, setDataSource] = React.useState<DataType[]>(data);
console.log(dataSource,"dataSource"); console.log(dataSource, "dataSource");
useEffect(() => { useEffect(() => {
// Update dataSource when the fetched data changes // Update dataSource when the fetched data changes
const sortedData = data.sort((a:any, b:any) => a.order - b.order); const sortedData = data.sort((a: any, b: any) => a.order - b.order);
setDataSource(sortedData); setDataSource(sortedData);
}, [response?.data?.data]); }, [response?.data?.data]);
const onDragEnd = ({ active, over }: DragEndEvent) => { const onDragEnd = ({ active, over }: DragEndEvent) => {
if (active.id !== over?.id) { if (active.id !== over?.id) {
setDataSource((prevState) => { setDataSource((prevState) => {
const activeIndex = prevState.findIndex((record) => record.id === active.id); const activeIndex = prevState.findIndex(
const overIndex = prevState.findIndex((record) => record.id === over.id); (record) => record.id === active.id,
);
const overIndex = prevState.findIndex(
(record) => record.id === over.id,
);
// Move the items in the array // Move the items in the array
const newState = arrayMove(prevState, activeIndex, overIndex); const newState = arrayMove(prevState, activeIndex, overIndex);
@ -129,7 +134,10 @@ const DrapableTable: React.FC = () => {
return ( return (
<DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}> <DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}>
<SortableContext items={dataSource.map((i) => i.id)} strategy={verticalListSortingStrategy}> <SortableContext
items={dataSource.map((i) => i.id)}
strategy={verticalListSortingStrategy}
>
<Table <Table
rowKey="id" rowKey="id"
components={{ body: { row: Row } }} components={{ body: { row: Row } }}

View File

@ -11,20 +11,18 @@ import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
const AddModel: React.FC = () => { const AddModel: React.FC = () => {
const { mutate, status } = useAddUnit(); const { mutate, status } = useAddUnit();
const { curriculum_id } = useParams(); const { curriculum_id } = useParams();
const {OldObjectToEdit} = useObjectToEdit() const { OldObjectToEdit } = useObjectToEdit();
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
let order = 0 ; let order = 0;
if(OldObjectToEdit?.order || OldObjectToEdit?.order === 0){ if (OldObjectToEdit?.order || OldObjectToEdit?.order === 0) {
order = Number(OldObjectToEdit.order) + 1; order = Number(OldObjectToEdit.order) + 1;
} }
mutate({ mutate({
...values, ...values,
curriculum_id: curriculum_id, curriculum_id: curriculum_id,
order:order order: order,
}); });
}; };
return ( return (

View File

@ -11,7 +11,6 @@ const EditModel: React.FC = () => {
const { mutate, status } = useUpdateUnit(); const { mutate, status } = useUpdateUnit();
const { objectToEdit } = useObjectToEdit((state) => state); const { objectToEdit } = useObjectToEdit((state) => state);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
mutate({ mutate({
...values, ...values,

View File

@ -4,9 +4,8 @@ import { TermEnum } from "../../../enums/Term";
import { enumToArray } from "../../../utils/enumToArray"; import { enumToArray } from "../../../utils/enumToArray";
const Form = () => { const Form = () => {
const termsArray = enumToArray(TermEnum);
const termsArray = enumToArray(TermEnum); console.log(termsArray, "termsArray");
console.log(termsArray,"termsArray");
return ( return (
<Row className="w-100"> <Row className="w-100">
@ -14,7 +13,13 @@ console.log(termsArray,"termsArray");
<ValidationField name="name" placeholder="name" label="name" /> <ValidationField name="name" placeholder="name" label="name" />
</Col> </Col>
<Col> <Col>
<ValidationField name="term" type="Select" placeholder="term" label="term" option={termsArray} /> <ValidationField
name="term"
type="Select"
placeholder="term"
label="term"
option={termsArray}
/>
</Col> </Col>
</Row> </Row>
); );

View File

@ -1,7 +1,9 @@
import * as Yup from "yup"; import * as Yup from "yup";
import { UnitInitialValues,Unit } from "../../../types/Unit"; import { UnitInitialValues, Unit } from "../../../types/Unit";
export const getInitialValues = (objectToEdit: Partial<Unit>): UnitInitialValues => { export const getInitialValues = (
objectToEdit: Partial<Unit>,
): UnitInitialValues => {
return { return {
id: objectToEdit?.id, id: objectToEdit?.id,
name: objectToEdit?.name ?? null, name: objectToEdit?.name ?? null,

View File

@ -11,16 +11,18 @@ import DrapableTable from "./DrapableTable";
import { useGetAllGrade } from "../../api/grade"; import { useGetAllGrade } from "../../api/grade";
import { useGetAllCurriculum } from "../../api/curriculum"; import { useGetAllCurriculum } from "../../api/curriculum";
const Table = lazy(() => import('./Table')); const Table = lazy(() => import("./Table"));
const AddModalForm = lazy(() => import('./Model/AddModel')); const AddModalForm = lazy(() => import("./Model/AddModel"));
const EditModalForm = lazy(() => import('./Model/EditModel')); const EditModalForm = lazy(() => import("./Model/EditModel"));
const DeleteModalForm = lazy(() => import('../../Layout/Dashboard/DeleteModels')); const DeleteModalForm = lazy(
() => import("../../Layout/Dashboard/DeleteModels"),
);
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
const deleteMutation = useDeleteUnit(); const deleteMutation = useDeleteUnit();
const { subject_id,grade_id,curriculum_id} = useParams<ParamsEnum>(); const { subject_id, grade_id, curriculum_id } = useParams<ParamsEnum>();
const { data: Subject } = useGetAllSubject({ const { data: Subject } = useGetAllSubject({
show: subject_id, show: subject_id,
@ -36,26 +38,35 @@ const TableHeader = () => {
const SubjectName = Subject?.data?.name ?? ""; const SubjectName = Subject?.data?.name ?? "";
const CurriculumName = Curriculum?.data?.name ?? ""; const CurriculumName = Curriculum?.data?.name ?? "";
useSetPageTitle( t(`page_header.grade`)+ "/"+ gradeName +"/"+t(`PageTitle.subject`)+"/"+SubjectName+"/"+t("PageTitle.curriculum")+"/"+CurriculumName+"/"+t("PageTitle.unit")); useSetPageTitle(
t(`page_header.grade`) +
"/" +
gradeName +
"/" +
t(`PageTitle.subject`) +
"/" +
SubjectName +
"/" +
t("PageTitle.curriculum") +
"/" +
CurriculumName +
"/" +
t("PageTitle.unit"),
);
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">
<Suspense fallback={<Spin />}> <Suspense fallback={<Spin />}>
<header> <header>
<h6> <h6>{t("models.units")}</h6>
{t("models.units")}
</h6>
</header> </header>
<Table /> <Table />
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />
<DeleteModalForm <DeleteModalForm
deleteMutation={deleteMutation} deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.UNIT_DELETE} ModelEnum={ModalEnum?.UNIT_DELETE}
/> />
</Suspense> </Suspense>
</div> </div>
); );

View File

@ -9,17 +9,18 @@ import { useObjectToEdit } from "../../zustand/ObjectToEditState";
const App: React.FC = () => { const App: React.FC = () => {
const { subject_id } = useParams<ParamsEnum>(); const { subject_id } = useParams<ParamsEnum>();
const response = useGetAllUnit({ subject_id: subject_id, pagination: true }); const response = useGetAllUnit({ subject_id: subject_id, pagination: true });
const {setOldObjectToEdit} = useObjectToEdit() const { setOldObjectToEdit } = useObjectToEdit();
console.log(response?.data?.data, "response?.data"); console.log(response?.data?.data, "response?.data");
const data = response?.data?.data; const data = response?.data?.data;
const lastElement = response?.data?.data && response?.data?.data[data?.length - 1] const lastElement =
response?.data?.data && response?.data?.data[data?.length - 1];
console.log(lastElement); console.log(lastElement);
useEffect(() => { useEffect(() => {
if(lastElement){ if (lastElement) {
setOldObjectToEdit(lastElement) setOldObjectToEdit(lastElement);
} }
}, [lastElement]) }, [lastElement]);
return <DataTable response={response} useColumns={useColumns} />; return <DataTable response={response} useColumns={useColumns} />;
}; };

View File

@ -12,11 +12,10 @@ import { useModalState } from "../../../zustand/Modal";
import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState";
const AddModel: React.FC = () => { const AddModel: React.FC = () => {
const { isOpen, setIsOpen } = useModalState((state) => state); const { isOpen, setIsOpen } = useModalState((state) => state);
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { mutate, isSuccess, status } = useAddLesson(); const { mutate, isSuccess, status } = useAddLesson();
const {OldObjectToEdit} = useObjectToEdit() const { OldObjectToEdit } = useObjectToEdit();
const { unit_id } = useParams<ParamsEnum>(); const { unit_id } = useParams<ParamsEnum>();
useEffect(() => { useEffect(() => {
if (isSuccess) { if (isSuccess) {
@ -26,11 +25,9 @@ const AddModel: React.FC = () => {
}, [setIsOpen, isSuccess, queryClient]); }, [setIsOpen, isSuccess, queryClient]);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
let order = 0;
let order = 0 ; if (OldObjectToEdit?.order || OldObjectToEdit?.order === 0) {
if(OldObjectToEdit?.order || OldObjectToEdit?.order === 0){
order = Number(OldObjectToEdit.order) + 1; order = Number(OldObjectToEdit.order) + 1;
} }
mutate({ ...values, unit_id: unit_id }); mutate({ ...values, unit_id: unit_id });

View File

@ -3,7 +3,7 @@ import ValidationField from "../../../Components/ValidationField/ValidationField
const Form = () => { const Form = () => {
return ( return (
<Row className="w-100"> <Row className="w-100">
<ValidationField name="name" label="name" /> <ValidationField name="name" label="name" />
</Row> </Row>
); );
}; };

View File

@ -11,19 +11,21 @@ import { useGetAllGrade } from "../../api/grade";
import { useGetAllCurriculum } from "../../api/curriculum"; import { useGetAllCurriculum } from "../../api/curriculum";
import { useGetAllSubject } from "../../api/subject"; import { useGetAllSubject } from "../../api/subject";
const Table = lazy(() => import('./Table')); const Table = lazy(() => import("./Table"));
const AddModalForm = lazy(() => import('./Model/AddModel')); const AddModalForm = lazy(() => import("./Model/AddModel"));
const EditModalForm = lazy(() => import('./Model/EditModel')); const EditModalForm = lazy(() => import("./Model/EditModel"));
const DeleteModelsForm = lazy(() => import('../../Layout/Dashboard/DeleteModels')); const DeleteModelsForm = lazy(
() => import("../../Layout/Dashboard/DeleteModels"),
);
const TableHeader = () => { const TableHeader = () => {
const [t] = useTranslation(); const [t] = useTranslation();
const deleteMutation = useDeleteLesson(); const deleteMutation = useDeleteLesson();
const { unit_id,curriculum_id,grade_id ,subject_id} = useParams<ParamsEnum>(); const { unit_id, curriculum_id, grade_id, subject_id } =
useParams<ParamsEnum>();
const { data: unit } = useGetAllUnit({ show: unit_id }); const { data: unit } = useGetAllUnit({ show: unit_id });
const { data: Subject } = useGetAllSubject({ const { data: Subject } = useGetAllSubject({
show: subject_id, show: subject_id,
}); });
@ -39,10 +41,25 @@ const TableHeader = () => {
const CurriculumName = Curriculum?.data?.name ?? ""; const CurriculumName = Curriculum?.data?.name ?? "";
const unitName = unit?.data?.name ?? ""; const unitName = unit?.data?.name ?? "";
useSetPageTitle(
useSetPageTitle( t(`page_header.grade`)+ "/"+ gradeName +"/"+t(`PageTitle.subject`)+"/"+SubjectName+"/"+t("PageTitle.curriculum")+"/"+CurriculumName+"/"+t("PageTitle.unit")+"/"+unitName+"/"+t("PageTitle.lesson")); t(`page_header.grade`) +
"/" +
gradeName +
"/" +
t(`PageTitle.subject`) +
"/" +
SubjectName +
"/" +
t("PageTitle.curriculum") +
"/" +
CurriculumName +
"/" +
t("PageTitle.unit") +
"/" +
unitName +
"/" +
t("PageTitle.lesson"),
);
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">
@ -54,11 +71,11 @@ const TableHeader = () => {
</header> </header>
<Table /> <Table />
<AddModalForm /> <AddModalForm />
<EditModalForm /> <EditModalForm />
<DeleteModelsForm <DeleteModelsForm
deleteMutation={deleteMutation} deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.LESSON_DELETE} ModelEnum={ModalEnum?.LESSON_DELETE}
/> />
</Suspense> </Suspense>
</div> </div>
); );

View File

@ -10,17 +10,18 @@ const App: React.FC = () => {
const { unit_id } = useParams<ParamsEnum>(); const { unit_id } = useParams<ParamsEnum>();
const response = useGetAllLesson({ unit_id: unit_id, pagination: true }); const response = useGetAllLesson({ unit_id: unit_id, pagination: true });
const {setOldObjectToEdit} = useObjectToEdit() const { setOldObjectToEdit } = useObjectToEdit();
console.log(response?.data?.data, "response?.data"); console.log(response?.data?.data, "response?.data");
const data = response?.data?.data; const data = response?.data?.data;
const lastElement = response?.data?.data && response?.data?.data[data?.length - 1] const lastElement =
response?.data?.data && response?.data?.data[data?.length - 1];
console.log(lastElement); console.log(lastElement);
useEffect(() => { useEffect(() => {
if(lastElement){ if (lastElement) {
setOldObjectToEdit(lastElement) setOldObjectToEdit(lastElement);
} }
}, [lastElement]) }, [lastElement]);
return <DataTable response={response} useColumns={useColumns} />; return <DataTable response={response} useColumns={useColumns} />;
}; };

View File

@ -16,9 +16,9 @@ import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import Header from "../../Components/exercise/Header"; import Header from "../../Components/exercise/Header";
import { Question } from "../../types/Item"; import { Question } from "../../types/Item";
import BaseForm from './Model/Malty/Add' import BaseForm from "./Model/Malty/Add";
import ModelForm from './Model/ModelForm' import ModelForm from "./Model/ModelForm";
const AcceptModal = lazy(() => import('./Model/AcceptModal')); const AcceptModal = lazy(() => import("./Model/AcceptModal"));
import { useModalState } from "../../zustand/Modal"; import { useModalState } from "../../zustand/Modal";
import { ModalEnum } from "../../enums/Model"; import { ModalEnum } from "../../enums/Model";
@ -48,12 +48,11 @@ const AddPage: React.FC = () => {
const { setIsOpen } = useModalState((state) => state); const { setIsOpen } = useModalState((state) => state);
const [t] = useTranslation(); const [t] = useTranslation();
const { unit_id,curriculum_id,grade_id ,subject_id,lesson_id} = useParams<ParamsEnum>(); const { unit_id, curriculum_id, grade_id, subject_id, lesson_id } =
useParams<ParamsEnum>();
const { data: unit } = useGetAllUnit({ show: unit_id }); const { data: unit } = useGetAllUnit({ show: unit_id });
const { data: Subject } = useGetAllSubject({ const { data: Subject } = useGetAllSubject({
show: subject_id, show: subject_id,
}); });
@ -73,7 +72,31 @@ const AddPage: React.FC = () => {
const unitName = unit?.data?.name ?? ""; const unitName = unit?.data?.name ?? "";
const LessonName = Lesson?.data?.name ?? ""; const LessonName = Lesson?.data?.name ?? "";
useSetPageTitle( t(`page_header.grade`)+ "/"+ gradeName +"/"+t(`PageTitle.subject`)+"/"+SubjectName+"/"+t("PageTitle.curriculum")+"/"+CurriculumName+"/"+t("PageTitle.unit")+"/"+unitName+"/"+t("PageTitle.lesson")+"/"+LessonName+"/"+t("PageTitle.question")+"/"+t("practical.add")); useSetPageTitle(
t(`page_header.grade`) +
"/" +
gradeName +
"/" +
t(`PageTitle.subject`) +
"/" +
SubjectName +
"/" +
t("PageTitle.curriculum") +
"/" +
CurriculumName +
"/" +
t("PageTitle.unit") +
"/" +
unitName +
"/" +
t("PageTitle.lesson") +
"/" +
LessonName +
"/" +
t("PageTitle.question") +
"/" +
t("practical.add"),
);
const handleSubmit = ( const handleSubmit = (
values: any, values: any,
{ resetForm }: { resetForm: () => void }, { resetForm }: { resetForm: () => void },
@ -81,7 +104,7 @@ const AddPage: React.FC = () => {
const DataToSend = structuredClone(values); const DataToSend = structuredClone(values);
setTagsSearch(null); setTagsSearch(null);
const canAnswersBeShuffled = DataToSend?.canAnswersBeShuffled ? 1 : 0 ; const canAnswersBeShuffled = DataToSend?.canAnswersBeShuffled ? 1 : 0;
if (isBseQuestion || DataToSend?.isBase === 1) { if (isBseQuestion || DataToSend?.isBase === 1) {
const newBseQuestion = { const newBseQuestion = {
subject_id: subject_id, subject_id: subject_id,
@ -90,8 +113,7 @@ const AddPage: React.FC = () => {
isBase: 1, isBase: 1,
lessons_ids: [lesson_id], lessons_ids: [lesson_id],
canAnswersBeShuffled, canAnswersBeShuffled,
hint:DataToSend?.hint hint: DataToSend?.hint,
}; };
mutateAsync(newBseQuestion).then((data: any) => { mutateAsync(newBseQuestion).then((data: any) => {
@ -120,7 +142,7 @@ const AddPage: React.FC = () => {
subject_id: subject_id, subject_id: subject_id,
tags, tags,
lessons_ids: [lesson_id], lessons_ids: [lesson_id],
canAnswersBeShuffled canAnswersBeShuffled,
}); });
} }
}; };
@ -169,8 +191,8 @@ const AddPage: React.FC = () => {
validationSchema={getValidationSchemaBase} validationSchema={getValidationSchemaBase}
> >
<main className="w-100 exercise_add_main"> <main className="w-100 exercise_add_main">
<Header/> <Header />
<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>

View File

@ -21,8 +21,8 @@ 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";
import SpinContainer from "../../Components/Layout/SpinContainer"; import SpinContainer from "../../Components/Layout/SpinContainer";
import ModelForm from './Model/ModelForm' import ModelForm from "./Model/ModelForm";
import BaseForm from './Model/Malty/Edit' import BaseForm from "./Model/Malty/Edit";
import { Question } from "../../types/Item"; import { Question } from "../../types/Item";
import { toast } from "react-toastify"; import { toast } from "react-toastify";
import useSetPageTitle from "../../Hooks/useSetPageTitle"; import useSetPageTitle from "../../Hooks/useSetPageTitle";
@ -33,7 +33,14 @@ import { useGetAllGrade } from "../../api/grade";
import { useGetAllCurriculum } from "../../api/curriculum"; import { useGetAllCurriculum } from "../../api/curriculum";
const EditPage: React.FC = () => { const EditPage: React.FC = () => {
const { unit_id,curriculum_id,grade_id ,subject_id,lesson_id,question_id } = useParams<ParamsEnum>(); const {
unit_id,
curriculum_id,
grade_id,
subject_id,
lesson_id,
question_id,
} = useParams<ParamsEnum>();
const { isBseQuestion, setIsBseQuestion, setTagsSearch, DeletedQuestions } = const { isBseQuestion, setIsBseQuestion, setTagsSearch, DeletedQuestions } =
useObjectToEdit(); useObjectToEdit();
@ -59,12 +66,9 @@ const EditPage: React.FC = () => {
} }
}, [objectToEdit?.isBase]); }, [objectToEdit?.isBase]);
const [t] = useTranslation(); const [t] = useTranslation();
const { data: unit } = useGetAllUnit({ show: unit_id }); const { data: unit } = useGetAllUnit({ show: unit_id });
const { data: Subject } = useGetAllSubject({ const { data: Subject } = useGetAllSubject({
show: subject_id, show: subject_id,
}); });
@ -84,7 +88,31 @@ const EditPage: React.FC = () => {
const unitName = unit?.data?.name ?? ""; const unitName = unit?.data?.name ?? "";
const LessonName = Lesson?.data?.name ?? ""; const LessonName = Lesson?.data?.name ?? "";
useSetPageTitle( t(`page_header.grade`)+ "/"+ gradeName +"/"+t(`PageTitle.subject`)+"/"+SubjectName+"/"+t("PageTitle.curriculum")+"/"+CurriculumName+"/"+t("PageTitle.unit")+"/"+unitName+"/"+t("PageTitle.lesson")+"/"+LessonName+"/"+t("PageTitle.question")+"/"+t("practical.edit")); useSetPageTitle(
t(`page_header.grade`) +
"/" +
gradeName +
"/" +
t(`PageTitle.subject`) +
"/" +
SubjectName +
"/" +
t("PageTitle.curriculum") +
"/" +
CurriculumName +
"/" +
t("PageTitle.unit") +
"/" +
unitName +
"/" +
t("PageTitle.lesson") +
"/" +
LessonName +
"/" +
t("PageTitle.question") +
"/" +
t("practical.edit"),
);
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
const DataToSend = structuredClone(values); const DataToSend = structuredClone(values);
@ -96,8 +124,6 @@ const EditPage: React.FC = () => {
id: DataToSend?.id, id: DataToSend?.id,
content: DataToSend?.content, content: DataToSend?.content,
image: DataToSend?.image ?? "", image: DataToSend?.image ?? "",
}; };
if ( if (
typeof UpdateBseQuestion?.image === "string" && typeof UpdateBseQuestion?.image === "string" &&
@ -157,8 +183,6 @@ const EditPage: React.FC = () => {
tags, tags,
lessons_ids: [lesson_id], lessons_ids: [lesson_id],
parent_id: values?.id, parent_id: values?.id,
}); });
} }
}); });

View File

@ -28,44 +28,38 @@ 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"}
label2={t(`input.choice`) + ` ` + `(${getCharFromNumber(index)})`} label2={t(`input.choice`) + ` ` + `(${getCharFromNumber(index)})`}
name={index} name={index}
id={`choice_${index + 1}`} id={`choice_${index + 1}`}
type="TextArea" type="TextArea"
/> />
<File <File
className="file_exercise" className="file_exercise"
label={"attachment"} label={"attachment"}
name={index} name={index}
type="File" type="File"
/> />
<CheckboxField <CheckboxField
className="" className=""
label="The_correct_answer" label="The_correct_answer"
name={index} name={index}
type="Checkbox" type="Checkbox"
/> />
<p className="delete_question_options"> <p className="delete_question_options">
<FaTrash onClick={handleDeleteChoice} size={17} /> <FaTrash onClick={handleDeleteChoice} size={17} />
</p> </p>
</div> </div>
<div> <div>
<HintField <HintField placeholder={"hint"} name={index} label="hint" id={`hint`} />
placeholder={"hint"} </div>
name={index} </>
label="hint"
id={`hint`}
/>
</div>
</>
); );
}; };

View File

@ -1,8 +1,8 @@
import React from 'react'; import React from "react";
import { Choice } from '../../../../types/Item'; import { Choice } from "../../../../types/Item";
import ChoiceFields from './ChoiceFields'; import ChoiceFields from "./ChoiceFields";
import { useFormikContext } from 'formik'; import { useFormikContext } from "formik";
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd'; import { DragDropContext, Droppable, Draggable } from "react-beautiful-dnd";
const Choices = () => { const Choices = () => {
const formik = useFormikContext<any>(); const formik = useFormikContext<any>();
@ -22,43 +22,47 @@ const Choices = () => {
// Update the order keys based on the new indices // Update the order keys based on the new indices
const updatedItems = items.map((item, index) => ({ const updatedItems = items.map((item, index) => ({
...item ?? {}, ...(item ?? {}),
order: index + 1, // Update order to be 1-based index order: index + 1, // Update order to be 1-based index
})); }));
// Update the formik state with the new order // Update the formik state with the new order
console.log(updatedItems,"updatedItems"); console.log(updatedItems, "updatedItems");
formik.setFieldValue('QuestionOptions', updatedItems); formik.setFieldValue("QuestionOptions", updatedItems);
}; };
return ( return (
<DragDropContext onDragEnd={handleDragEnd}> <DragDropContext onDragEnd={handleDragEnd}>
<Droppable droppableId="choices"> <Droppable droppableId="choices">
{(provided) => ( {(provided) => (
<div <div {...provided.droppableProps} ref={provided.innerRef}>
{...provided.droppableProps} {formik?.values?.QuestionOptions?.map(
ref={provided.innerRef} (item: Choice, index: number) => {
// Use a unique identifier for draggableId
const draggableId = item.name
? item.name.toString()
: `item-${index}`;
> return (
{formik?.values?.QuestionOptions?.map((item: Choice, index: number) => { <Draggable
// Use a unique identifier for draggableId key={draggableId}
const draggableId = item.name ? item.name.toString() : `item-${index}`; draggableId={draggableId}
index={index}
return ( >
<Draggable key={draggableId} draggableId={draggableId} index={index}> {(provided) => (
{(provided) => ( <div
<div ref={provided.innerRef}
ref={provided.innerRef} {...provided.draggableProps}
{...provided.draggableProps} {...provided.dragHandleProps}
{...provided.dragHandleProps} >
> <ChoiceFields index={index} data={item} />
<ChoiceFields index={index} data={item} /> </div>
</div> )}
)} </Draggable>
</Draggable> );
); },
})} )}
{provided.placeholder} {/* Placeholder for spacing */} {provided.placeholder} {/* Placeholder for spacing */}
</div> </div>
)} )}

View File

@ -58,7 +58,7 @@ const HintField = ({
disabled={isDisabled} disabled={isDisabled}
size="large" size="large"
onChange={onChange || TextFilehandleChange} onChange={onChange || TextFilehandleChange}
style={{width:200}} style={{ width: 200 }}
id={id} id={id}
/> />
</Form.Item> </Form.Item>

View File

@ -104,7 +104,7 @@ const Form = () => {
/> />
</div> </div>
<Choices parent_index={parent_index} /> <Choices parent_index={parent_index} />
{formik?.values?.Questions?.[parent_index]?.QuestionOptions {formik?.values?.Questions?.[parent_index]?.QuestionOptions
?.length < 5 && ( ?.length < 5 && (

View File

@ -1,13 +1,12 @@
import React from 'react' import React from "react";
import ChoiceFields from './ChoiceFields'; import ChoiceFields from "./ChoiceFields";
import { Choice } from '../../../../../types/Item'; import { Choice } from "../../../../../types/Item";
import { useFormikContext } from 'formik'; import { useFormikContext } from "formik";
import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd'; import { DragDropContext, Draggable, Droppable } from "react-beautiful-dnd";
const Choices = ({parent_index}:{parent_index:number}) => { const Choices = ({ parent_index }: { parent_index: number }) => {
const formik = useFormikContext<any>(); const formik = useFormikContext<any>();
const handleDragEnd = (result: any) => { const handleDragEnd = (result: any) => {
// Check if the item was dropped outside the list // Check if the item was dropped outside the list
if (!result.destination) return; if (!result.destination) return;
@ -23,65 +22,61 @@ const Choices = ({parent_index}:{parent_index:number}) => {
// Update the order keys based on the new indices // Update the order keys based on the new indices
const updatedItems = items.map((item, index) => ({ const updatedItems = items.map((item, index) => ({
...item ?? {}, ...(item ?? {}),
order: index + 1, // Update order to be 1-based index order: index + 1, // Update order to be 1-based index
})); }));
// Update the formik state with the new order // Update the formik state with the new order
console.log(updatedItems,"updatedItems"); console.log(updatedItems, "updatedItems");
formik.setFieldValue('QuestionOptions', updatedItems); formik.setFieldValue("QuestionOptions", updatedItems);
}; };
return ( return (
<> <>
<DragDropContext onDragEnd={handleDragEnd}> <DragDropContext onDragEnd={handleDragEnd}>
<Droppable droppableId="choices"> <Droppable droppableId="choices">
{(provided) => ( {(provided) => (
<div <div {...provided.droppableProps} ref={provided.innerRef}>
{...provided.droppableProps} {(
ref={provided.innerRef} (formik?.values as any)?.Questions?.[parent_index]
>
{(
(formik?.values as any)?.Questions?.[parent_index]
?.QuestionOptions || [] ?.QuestionOptions || []
).map((item: Choice, index: number) => { ).map((item: Choice, index: number) => {
const draggableId = item.name ? item.name.toString() : `item-${index}`; const draggableId = item.name
? item.name.toString()
: `item-${index}`;
return ( return (
<Draggable key={draggableId} draggableId={draggableId} index={index}> <Draggable
{(provided) => ( key={draggableId}
<div draggableId={draggableId}
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
>
<ChoiceFields
key={index}
parent_index={parent_index}
index={index} index={index}
data={item} >
/> {(provided) => (
<div
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
>
<ChoiceFields
key={index}
parent_index={parent_index}
index={index}
data={item}
/>
</div> </div>
)} )}
</Draggable> </Draggable>
); );
})} })}
{provided.placeholder} {provided.placeholder}
</div> </div>
)} )}
</Droppable> </Droppable>
</DragDropContext> </DragDropContext>
</> </>
) );
} };
export default Choices export default Choices;

View File

@ -47,12 +47,11 @@ const QuestionFIeld = ({ index, data }: { index: number; data: Choice }) => {
name={index} name={index}
type="File" type="File"
/> />
<CheckboxField <CheckboxField
className="canAnswersBeShuffled" className="canAnswersBeShuffled"
label={"canAnswersBeShuffled"} label={"canAnswersBeShuffled"}
name={index} name={index}
/>
/>
<p className="delete_question_options"> <p className="delete_question_options">
<FaTrash onClick={handleDeleteQuestion} size={17} /> <FaTrash onClick={handleDeleteQuestion} size={17} />

View File

@ -11,7 +11,7 @@ import { useEffect } from "react";
import Choices from "./Field/Choices"; import Choices from "./Field/Choices";
const Form = () => { const Form = () => {
const [t] = useTranslation() const [t] = useTranslation();
const formik = useFormikContext<any>(); const formik = useFormikContext<any>();
const { setSuccess, Success, setSavedQuestionData } = useObjectToEdit(); const { setSuccess, Success, setSavedQuestionData } = useObjectToEdit();
@ -24,37 +24,58 @@ const Form = () => {
}, [Success]); }, [Success]);
useEffect(() => { useEffect(() => {
setSavedQuestionData(formik.values) setSavedQuestionData(formik.values);
}, [formik?.values]) }, [formik?.values]);
const handleAddChoice = () => { const handleAddChoice = () => {
formik.setFieldValue('QuestionOptions', [...(formik?.values as any)?.QuestionOptions as Choice[], formik.setFieldValue("QuestionOptions", [
{ ...((formik?.values as any)?.QuestionOptions as Choice[]),
answer:null, {
answer_image:null, answer: null,
isCorrect:0, answer_image: null,
}]) isCorrect: 0,
} },
]);
};
return ( return (
<Row className="w-100"> <Row className="w-100">
<div className="exercise_form"> <div className="exercise_form">
<ValidationField className="textarea_exercise" name="content" label="details" type="TextArea" /> <ValidationField
<ValidationField className="file_exercise" name="image" label="attachment" type="File" /> className="textarea_exercise"
<ValidationField name="canAnswersBeShuffled" label="canAnswersBeShuffled" type="Checkbox" /> name="content"
label="details"
type="TextArea"
/>
<ValidationField
className="file_exercise"
name="image"
label="attachment"
type="File"
/>
<ValidationField
name="canAnswersBeShuffled"
label="canAnswersBeShuffled"
type="Checkbox"
/>
</div> </div>
<div> <div>
<ValidationField className="hint" name="hint" label="hint" type="text" style={{width:200}} /> <ValidationField
className="hint"
name="hint"
label="hint"
type="text"
style={{ width: 200 }}
/>
</div> </div>
<Choices /> <Choices />
{formik?.values?.QuestionOptions?.length < 5 && ( {formik?.values?.QuestionOptions?.length < 5 && (
<p className="add_new_button" > <p className="add_new_button">
<FaCirclePlus onClick={handleAddChoice} size={23} /> {t("header.add_new_choice")} <FaCirclePlus onClick={handleAddChoice} size={23} />{" "}
{t("header.add_new_choice")}
</p> </p>
)} )}
<DynamicTags/> <DynamicTags />
</Row> </Row>
); );
}; };

View File

@ -39,7 +39,6 @@ export const getValidationSchema = () => {
}; };
export const getInitialValuesBase = (objectToEdit: Question): any => { export const getInitialValuesBase = (objectToEdit: Question): any => {
const newQuestions = objectToEdit?.Questions?.map((item: any) => { const newQuestions = objectToEdit?.Questions?.map((item: any) => {
const tags = item?.tags?.map((tag: any) => ({ const tags = item?.tags?.map((tag: any) => ({
id: tag?.id, id: tag?.id,
@ -69,7 +68,6 @@ export const getInitialValuesBase = (objectToEdit: Question): any => {
}; };
}; };
export const getValidationSchemaBase = () => { export const getValidationSchemaBase = () => {
// validate input // validate input
return Yup.object().shape({ return Yup.object().shape({

View File

@ -19,10 +19,10 @@ const TableHeader = () => {
const deleteMutation = useDeleteQuestion(); const deleteMutation = useDeleteQuestion();
const { unit_id,curriculum_id,grade_id ,subject_id,lesson_id} = useParams<ParamsEnum>(); const { unit_id, curriculum_id, grade_id, subject_id, lesson_id } =
useParams<ParamsEnum>();
const { data: unit } = useGetAllUnit({ show: unit_id }); const { data: unit } = useGetAllUnit({ show: unit_id });
const { data: Subject } = useGetAllSubject({ const { data: Subject } = useGetAllSubject({
show: subject_id, show: subject_id,
}); });
@ -42,22 +42,42 @@ const TableHeader = () => {
const unitName = unit?.data?.name ?? ""; const unitName = unit?.data?.name ?? "";
const LessonName = Lesson?.data?.name ?? ""; const LessonName = Lesson?.data?.name ?? "";
useSetPageTitle( t(`page_header.grade`)+ "/"+ gradeName +"/"+t(`PageTitle.subject`)+"/"+SubjectName+"/"+t("PageTitle.curriculum")+"/"+CurriculumName+"/"+t("PageTitle.unit")+"/"+unitName+"/"+t("PageTitle.lesson")+"/"+LessonName+"/"+t("PageTitle.question")); useSetPageTitle(
t(`page_header.grade`) +
"/" +
gradeName +
"/" +
t(`PageTitle.subject`) +
"/" +
SubjectName +
"/" +
t("PageTitle.curriculum") +
"/" +
CurriculumName +
"/" +
t("PageTitle.unit") +
"/" +
unitName +
"/" +
t("PageTitle.lesson") +
"/" +
LessonName +
"/" +
t("PageTitle.question"),
);
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">
<Suspense fallback={<Spin />}> <Suspense fallback={<Spin />}>
<header> <header>
<h6> <h6>{t("models.Question")}</h6>
{t("models.Question")}
</h6>
</header> </header>
<Table /> <Table />
</Suspense> </Suspense>
<DeleteModels <DeleteModels
deleteMutation={deleteMutation} deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.QUESTION_DELETE} ModelEnum={ModalEnum?.QUESTION_DELETE}
/> />
</div> </div>
); );
}; };

View File

@ -10,9 +10,9 @@ import { ParamsEnum } from "../../../enums/params";
const AddModel: React.FC = () => { const AddModel: React.FC = () => {
const { mutate, status } = useAddSubject(); const { mutate, status } = useAddSubject();
const {grade_id} = useParams<ParamsEnum>() const { grade_id } = useParams<ParamsEnum>();
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
mutate({ ...values,grade_id }); mutate({ ...values, grade_id });
}; };
return ( return (
<> <>

View File

@ -11,7 +11,7 @@ import ModelForm from "./ModelForm";
const ModalForm: React.FC = () => { const ModalForm: React.FC = () => {
const { objectToEdit } = useObjectToEdit((state) => state); const { objectToEdit } = useObjectToEdit((state) => state);
const { mutate ,status} = useUpdateSubject(); const { mutate, status } = useUpdateSubject();
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
const Data_to_send = { ...values }; const Data_to_send = { ...values };

View File

@ -1,16 +1,16 @@
import * as Yup from "yup"; import * as Yup from "yup";
import { SubjectInitialValues } from "../../../types/Subject"; import { SubjectInitialValues } from "../../../types/Subject";
export const getInitialValues = (objectToEdit: Partial<SubjectInitialValues>): SubjectInitialValues => { export const getInitialValues = (
objectToEdit: Partial<SubjectInitialValues>,
): SubjectInitialValues => {
// console.log(objectToEdit,"objectToEdit"); // console.log(objectToEdit,"objectToEdit");
return { return {
id: objectToEdit?.id ?? null, id: objectToEdit?.id ?? null,
name: objectToEdit?.name ?? null, name: objectToEdit?.name ?? null,
icon: objectToEdit?.icon ?? null, icon: objectToEdit?.icon ?? null,
grade_id: objectToEdit?.grade_id ?? null, grade_id: objectToEdit?.grade_id ?? null,
}; };
}; };

View File

@ -13,22 +13,29 @@ import { useGetAllGrade } from "../../../api/grade";
const Table = lazy(() => import("./TablePage")); const Table = lazy(() => import("./TablePage"));
const AddModalForm = lazy(() => import("../Model/AddModel")); const AddModalForm = lazy(() => import("../Model/AddModel"));
const EditModalForm = lazy(() => import("../Model/EditModel")); const EditModalForm = lazy(() => import("../Model/EditModel"));
const DeleteModalForm = lazy(() => import("../../../Layout/Dashboard/DeleteModels")); const DeleteModalForm = lazy(
() => import("../../../Layout/Dashboard/DeleteModels"),
);
const TableWithHeader = () => { const TableWithHeader = () => {
const { handel_open_model } = useModalHandler(); const { handel_open_model } = useModalHandler();
const [t] = useTranslation(); const [t] = useTranslation();
const deleteMutation = useDeleteSubject(); const deleteMutation = useDeleteSubject();
const { grade_id} = useParams<ParamsEnum>(); const { grade_id } = useParams<ParamsEnum>();
const { data: grade } = useGetAllGrade({ const { data: grade } = useGetAllGrade({
show: grade_id, show: grade_id,
}); });
const gradeName = grade?.data?.name ?? ""; const gradeName = grade?.data?.name ?? "";
useSetPageTitle( t(`page_header.grade`)+ "/"+ `${gradeName}` +"/"+t(`PageTitle.subject`)); useSetPageTitle(
t(`page_header.grade`) +
"/" +
`${gradeName}` +
"/" +
t(`PageTitle.subject`),
);
return ( return (
<div className="TableWithHeader"> <div className="TableWithHeader">
@ -50,9 +57,9 @@ const TableWithHeader = () => {
<DeleteModalForm <DeleteModalForm
deleteMutation={deleteMutation} deleteMutation={deleteMutation}
ModelEnum={ModalEnum?.SUBJECT_DELETE} ModelEnum={ModalEnum?.SUBJECT_DELETE}
/> />
</div> </div>
) );
} };
export default TableWithHeader; export default TableWithHeader;

View File

@ -16,11 +16,11 @@ export const useColumns = () => {
const { setObjectToEdit } = useObjectToEdit((state) => state); const { setObjectToEdit } = useObjectToEdit((state) => state);
const { setIsOpen } = useModalState((state) => state); const { setIsOpen } = useModalState((state) => state);
const handelDelete = (record:Subject) => { const handelDelete = (record: Subject) => {
setObjectToEdit(record); setObjectToEdit(record);
setIsOpen(ModalEnum?.SUBJECT_DELETE); setIsOpen(ModalEnum?.SUBJECT_DELETE);
}; };
const handleEdit = (record:Subject) => { const handleEdit = (record: Subject) => {
setObjectToEdit(record); setObjectToEdit(record);
setIsOpen(ModalEnum?.SUBJECT_EDIT); setIsOpen(ModalEnum?.SUBJECT_EDIT);
}; };
@ -44,7 +44,7 @@ export const useColumns = () => {
dataIndex: "icon", dataIndex: "icon",
key: "icon", key: "icon",
align: "center", align: "center",
render: (row: Subject,record) => { render: (row: Subject, record) => {
let str = record.icon; let str = record.icon;
return <ColumnsImage src={str} />; return <ColumnsImage src={str} />;
}, },

View File

@ -63,8 +63,6 @@ export const menuItems: TMenuItem[] = [
]; ];
export const CrudRoute: TCrudRoute[] = [ export const CrudRoute: TCrudRoute[] = [
{ {
header: "page_header.grade_details", header: "page_header.grade_details",
element: <Subject />, element: <Subject />,
@ -74,7 +72,6 @@ export const CrudRoute: TCrudRoute[] = [
prevPath: 1, prevPath: 1,
}, },
{ {
header: "page_header.subject_details", header: "page_header.subject_details",
element: <Curriculum />, element: <Curriculum />,

View File

@ -5,7 +5,6 @@
@import "./Segmented.scss"; @import "./Segmented.scss";
@import "./Mix.scss"; @import "./Mix.scss";
.draggable-row { .draggable-row {
cursor: move; /* Change cursor to indicate draggable rows */ cursor: move; /* Change cursor to indicate draggable rows */
} }

View File

@ -272,7 +272,6 @@ button:disabled {
.h1 { .h1 {
text-align: center; text-align: center;
font-weight: bold; font-weight: bold;
} }
.buttonAction { .buttonAction {

View File

@ -121,9 +121,7 @@
left: 100px; left: 100px;
} }
.hint_canAnswersBeShuffled {
.hint_canAnswersBeShuffled{ display: flex;
gap: 5px;
display: flex;
gap: 5px;
} }

View File

@ -15,7 +15,6 @@ const KEY = "grade";
export const useGetAllGrade = (params?: any, options?: any) => export const useGetAllGrade = (params?: any, options?: any) =>
useGetQuery(KEY, API.GET, params, options); useGetQuery(KEY, API.GET, params, options);
export const useAddGrade = () => useAddMutation(KEY, API.ADD); export const useAddGrade = () => useAddMutation(KEY, API.ADD);
export const useUpdateGrade = (params?: any) => export const useUpdateGrade = (params?: any) => useUpdateMutation(KEY, API.GET);
useUpdateMutation(KEY, API.GET);
export const useDeleteGrade = (params?: any) => export const useDeleteGrade = (params?: any) =>
useDeleteMutation(KEY, API.DELETE); useDeleteMutation(KEY, API.DELETE);

View File

@ -141,19 +141,15 @@ export enum ModalEnum {
QUESTION_DELETE = "Question.delete", QUESTION_DELETE = "Question.delete",
QUESTION_ACCEPT = "Question.ACCEPT", QUESTION_ACCEPT = "Question.ACCEPT",
///Grade
///Grade GRADE_EDIT = "GRADE.edit",
GRADE_ADD = "GRADE.add",
GRADE_EDIT = "GRADE.edit", GRADE_DELETE = "GRADE.delete",
GRADE_ADD = "GRADE.add",
GRADE_DELETE = "GRADE.delete",
///Curriculum
CURRICULUM_EDIT = "CURRICULUM.edit",
CURRICULUM_ADD = "CURRICULUM.add",
CURRICULUM_DELETE = "CURRICULUM.delete",
///Curriculum
CURRICULUM_EDIT = "CURRICULUM.edit",
CURRICULUM_ADD = "CURRICULUM.add",
CURRICULUM_DELETE = "CURRICULUM.delete",
} }

View File

@ -1,5 +1,4 @@
export enum TermEnum { export enum TermEnum {
FIRST_TERM = "first_term", FIRST_TERM = "first_term",
SECOND_TERM = "second_term", SECOND_TERM = "second_term",
} }

View File

@ -107,8 +107,7 @@
"malty_exercise": "تمرين متعدد", "malty_exercise": "تمرين متعدد",
"add_new_question": "اضافة سؤال جديد", "add_new_question": "اضافة سؤال جديد",
"exercise": "تمارين", "exercise": "تمارين",
"icon" :"الايقونة" "icon": "الايقونة"
}, },
"columns": { "columns": {
"id": "الرقم التعريفي", "id": "الرقم التعريفي",
@ -121,7 +120,7 @@
"payment_type": "نوع الدفع", "payment_type": "نوع الدفع",
"value": "القيمة", "value": "القيمة",
"subject_name": "اسم المادة", "subject_name": "اسم المادة",
"icon" :"الايقونة", "icon": "الايقونة",
"image": "الصورة", "image": "الصورة",
"card": "البطاقة", "card": "البطاقة",
"birthday": "تاريخ الميلاد", "birthday": "تاريخ الميلاد",
@ -197,7 +196,7 @@
"Are you sure you want to go back and not save any changes?": "هل أنت متأكد أنك تريد العودة وعدم حفظ أي تغييرات؟", "Are you sure you want to go back and not save any changes?": "هل أنت متأكد أنك تريد العودة وعدم حفظ أي تغييرات؟",
"accept_back": "قبول العودة ", "accept_back": "قبول العودة ",
"accept": "قبول ", "accept": "قبول ",
"to_confirm_deletion_please_re_enter_id":"يرجى اعادة ادخال رقم التعريف" "to_confirm_deletion_please_re_enter_id": "يرجى اعادة ادخال رقم التعريف"
}, },
"Table": { "Table": {
"header": "", "header": "",
@ -255,10 +254,10 @@
"exams": "اختبارات", "exams": "اختبارات",
"lessons": "دروس", "lessons": "دروس",
"sex": "الجنس", "sex": "الجنس",
"Question":"اسئلة", "Question": "اسئلة",
"tags":"كلمات مفتاحية", "tags": "كلمات مفتاحية",
"tags_details":"تفاصيل الكلمة المفتاحية", "tags_details": "تفاصيل الكلمة المفتاحية",
"curriculum": "مقرر" "curriculum": "مقرر"
}, },
"education_class_actions": { "education_class_actions": {
@ -320,7 +319,7 @@
"due_date": "تاريخ الاستحقاق", "due_date": "تاريخ الاستحقاق",
"assigning_date": "تاريخ التعيين", "assigning_date": "تاريخ التعيين",
"subject_name": "اسم المادة", "subject_name": "اسم المادة",
"icon" :"الايقونة", "icon": "الايقونة",
"exam_type": "نوع الامتحان", "exam_type": "نوع الامتحان",
"grade_to_pass": "الدرجة اللازمة للنجاح", "grade_to_pass": "الدرجة اللازمة للنجاح",
"max_grade": "الدرجة القصوى", "max_grade": "الدرجة القصوى",
@ -359,8 +358,8 @@
"main_question": "النص الأساسي ", "main_question": "النص الأساسي ",
"question": "السؤال", "question": "السؤال",
"id": "الرقم التعريفي", "id": "الرقم التعريفي",
"canAnswersBeShuffled":"يمكن خلط الإجابات", "canAnswersBeShuffled": "يمكن خلط الإجابات",
"hint":"لحليح" "hint": "لحليح"
}, },
"select": { "select": {
@ -661,7 +660,7 @@
"admin": "المسؤولون", "admin": "المسؤولون",
"subject": "المواد", "subject": "المواد",
"tags": "كلمات مفتاحية", "tags": "كلمات مفتاحية",
"grade":"الدرجات", "grade": "الدرجات",
"curriculum": "مقرر" "curriculum": "مقرر"
}, },
"message": { "message": {
@ -686,8 +685,8 @@
"questions": "اسئلة", "questions": "اسئلة",
"lesson": "الدرس", "lesson": "الدرس",
"curriculum": "مقرر", "curriculum": "مقرر",
"subject":"المادة", "subject": "المادة",
"question":"السؤال" "question": "السؤال"
}, },
"page_header": { "page_header": {
"dashboard": "لوحة القيادة / الصفحة الرئيسية", "dashboard": "لوحة القيادة / الصفحة الرئيسية",
@ -718,6 +717,6 @@
"add_Question": "لوحة القيادة /إضافة اسئلة ", "add_Question": "لوحة القيادة /إضافة اسئلة ",
"edit_Question": "لوحة القيادة /تعديل اسئلة ", "edit_Question": "لوحة القيادة /تعديل اسئلة ",
"grade": "لوحة القيادة /الدرجات ", "grade": "لوحة القيادة /الدرجات ",
"curriculum":"لوحة القيادة / تعديل مقرر " "curriculum": "لوحة القيادة / تعديل مقرر "
} }
} }

View File

@ -226,7 +226,7 @@
"param": "Param", "param": "Param",
"subjectProgress": "Subject Progress", "subjectProgress": "Subject Progress",
"main_page": "Main Page", "main_page": "Main Page",
"tags_details":"tags details" "tags_details": "tags details"
}, },
"education_class_actions": { "education_class_actions": {
"Student_Records": "Student_Records", "Student_Records": "Student_Records",

View File

@ -404,5 +404,4 @@ export interface showAdmin {
branches: BranchRole[]; branches: BranchRole[];
} }
export type Nullable<T> = { [K in keyof T]: T[K] | null }; export type Nullable<T> = { [K in keyof T]: T[K] | null };

View File

@ -3,15 +3,13 @@ import { Nullable } from "./App";
// Define the Teacher interface // Define the Teacher interface
export interface InitialValues { export interface InitialValues {
id: number; // Unique identifier for the user id: number; // Unique identifier for the user
name: string; // Name of the user name: string; // Name of the user
icon: string; // URL of the user's icon icon: string; // URL of the user's icon
}
export type Curriculum ={
id: number; // Unique identifier for the user
name: string; // Name of the user
icon: string; // URL of the user's icon
} }
export type Curriculum = {
id: number; // Unique identifier for the user
name: string; // Name of the user
icon: string; // URL of the user's icon
};
export type CurriculumInitialValues = Partial<Nullable<InitialValues>>; export type CurriculumInitialValues = Partial<Nullable<InitialValues>>;

View File

@ -3,15 +3,13 @@ import { Nullable } from "./App";
// Define the Teacher interface // Define the Teacher interface
export interface InitialValues { export interface InitialValues {
id: number; // Unique identifier for the user id: number; // Unique identifier for the user
name: string; // Name of the user name: string; // Name of the user
icon: string; // URL of the user's icon icon: string; // URL of the user's icon
}
export type Grade ={
id: number; // Unique identifier for the user
name: string; // Name of the user
icon: string; // URL of the user's icon
} }
export type Grade = {
id: number; // Unique identifier for the user
name: string; // Name of the user
icon: string; // URL of the user's icon
};
export type GradeInitialValues = Partial<Nullable<InitialValues>>; export type GradeInitialValues = Partial<Nullable<InitialValues>>;

View File

@ -306,7 +306,7 @@ export interface Question {
parent_id: number; parent_id: number;
isBase: number; isBase: number;
content: string; content: string;
canAnswersBeShuffled:number ; canAnswersBeShuffled: number;
max_mark: number; max_mark: number;
min_mark_to_pass: number; min_mark_to_pass: number;
image: string | null; image: string | null;

View File

@ -3,17 +3,17 @@ import { Nullable } from "./App";
// Define the Teacher interface // Define the Teacher interface
export interface Subject { export interface Subject {
id: number; // Unique identifier for the user id: number; // Unique identifier for the user
name: string; // Name of the user name: string; // Name of the user
icon: string; // URL of the user's icon icon: string; // URL of the user's icon
grade_id: number; grade_id: number;
} }
export interface InitialValues { export interface InitialValues {
id: number; // Unique identifier for the user id: number; // Unique identifier for the user
name: string; // Name of the user name: string; // Name of the user
icon: string; // URL of the user's icon icon: string; // URL of the user's icon
grade_id: number; grade_id: number;
} }
export type SubjectInitialValues = Partial<Nullable<InitialValues>>; export type SubjectInitialValues = Partial<Nullable<InitialValues>>;

View File

@ -3,19 +3,19 @@ import { Nullable } from "./App";
// Define the type for the object // Define the type for the object
export interface Unit { export interface Unit {
curriculum_id: number; curriculum_id: number;
id: number; // Represents the student ID id: number; // Represents the student ID
name: string; // Represents the student's name name: string; // Represents the student's name
order: number; // Represents the order (could be for sorting) order: number; // Represents the order (could be for sorting)
term: TermEnum; // Represents the term using the Term enum term: TermEnum; // Represents the term using the Term enum
} }
export interface InitialValues { export interface InitialValues {
curriculum_id: number; curriculum_id: number;
id: number; // Represents the student ID id: number; // Represents the student ID
name: string; // Represents the student's name name: string; // Represents the student's name
order: number; // Represents the order (could be for sorting) order: number; // Represents the order (could be for sorting)
term: TermEnum; term: TermEnum;
} }
export type UnitInitialValues = Partial<Nullable<InitialValues>>; export type UnitInitialValues = Partial<Nullable<InitialValues>>;

View File

@ -1,6 +1,6 @@
export const enumToArray = (enumObj: any) => { export const enumToArray = (enumObj: any) => {
return Object.keys(enumObj).map(key => ({ return Object.keys(enumObj).map((key) => ({
value: enumObj[key], value: enumObj[key],
label: enumObj[key], label: enumObj[key],
})); }));
}; };

View File

@ -21,7 +21,7 @@ class AbilityManager {
} }
private loadAbilities(): Set<string> { private loadAbilities(): Set<string> {
const abilitiesString = getLocalStorage(ABILITIES_KEY) const abilitiesString = getLocalStorage(ABILITIES_KEY);
if (!abilitiesString) { if (!abilitiesString) {
return new Set<string>(); return new Set<string>();

View File

@ -518,8 +518,6 @@ export const canShowQuestion = hasAbility(
ABILITIES_VALUES_ENUM.SHOW, ABILITIES_VALUES_ENUM.SHOW,
); );
///// Grade ///// Grade
export const canAddGrade = hasAbility( export const canAddGrade = hasAbility(
@ -543,7 +541,6 @@ export const canIndexGrade = hasAbility(
ABILITIES_VALUES_ENUM.INDEX, ABILITIES_VALUES_ENUM.INDEX,
); );
///// Curriculum ///// Curriculum
export const canAddCurriculum = hasAbility( export const canAddCurriculum = hasAbility(
@ -566,4 +563,3 @@ export const canIndexCurriculum = hasAbility(
ABILITIES_ENUM.EDUCATION_CLASS, ABILITIES_ENUM.EDUCATION_CLASS,
ABILITIES_VALUES_ENUM.INDEX, ABILITIES_VALUES_ENUM.INDEX,
); );