format
This commit is contained in:
parent
aece39ae8f
commit
a0000066ab
8860
pnpm-lock.yaml
8860
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
|
@ -15,7 +15,6 @@ const ColumnsImage = ({ src }: any) => {
|
||||||
|
|
||||||
const handleError = useImageError;
|
const handleError = useImageError;
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Image
|
<Image
|
||||||
width={45}
|
width={45}
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 } }}
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
|
|
|
||||||
|
|
@ -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 } }}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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} />;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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} />;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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 } }}
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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} />;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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 });
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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} />;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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>
|
|
||||||
</>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 && (
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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} />
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
||||||
<>
|
<>
|
||||||
|
|
|
||||||
|
|
@ -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 };
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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} />;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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 />,
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
}
|
}
|
||||||
|
|
@ -272,7 +272,6 @@ button:disabled {
|
||||||
.h1 {
|
.h1 {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.buttonAction {
|
.buttonAction {
|
||||||
|
|
|
||||||
|
|
@ -121,9 +121,7 @@
|
||||||
left: 100px;
|
left: 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hint_canAnswersBeShuffled {
|
||||||
.hint_canAnswersBeShuffled{
|
display: flex;
|
||||||
|
gap: 5px;
|
||||||
display: flex;
|
|
||||||
gap: 5px;
|
|
||||||
}
|
}
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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": "لوحة القيادة / تعديل مقرر "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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 };
|
||||||
|
|
|
||||||
|
|
@ -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>>;
|
||||||
|
|
|
||||||
|
|
@ -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>>;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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>>;
|
||||||
|
|
|
||||||
|
|
@ -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>>;
|
||||||
|
|
|
||||||
|
|
@ -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],
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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>();
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user