diff --git a/src/Components/Columns/ColumnsImage.tsx b/src/Components/Columns/ColumnsImage.tsx index 5663d3a..7dc1e80 100644 --- a/src/Components/Columns/ColumnsImage.tsx +++ b/src/Components/Columns/ColumnsImage.tsx @@ -8,7 +8,6 @@ import { } from "@ant-design/icons"; import React from "react"; import { Image, Space } from "antd"; -import { ImageBaseURL } from "../../api/config"; import useImageError from "../../Hooks/useImageError"; import { ErrorImage } from "../../Layout/app/Const"; diff --git a/src/Components/CustomFields/ImageBoxField/ImageBoxField.tsx b/src/Components/CustomFields/ImageBoxField/ImageBoxField.tsx index 1542702..7e1b753 100644 --- a/src/Components/CustomFields/ImageBoxField/ImageBoxField.tsx +++ b/src/Components/CustomFields/ImageBoxField/ImageBoxField.tsx @@ -13,9 +13,6 @@ const ImageBoxField = ({ name }: any) => { const value = getNestedValue(formik.values, name); const [imagePreview, setImagePreview] = useState(null); const fileInputRef = useRef(null); - console.log(formik.values); - - console.log(value, name); useEffect(() => { if (value instanceof File) { diff --git a/src/Components/CustomFields/PdfUploader.tsx b/src/Components/CustomFields/PdfUploader.tsx index 740223c..e76460c 100644 --- a/src/Components/CustomFields/PdfUploader.tsx +++ b/src/Components/CustomFields/PdfUploader.tsx @@ -1,7 +1,6 @@ import { Button, Image, Upload, UploadFile } from "antd"; import useFormField from "../../Hooks/useFormField"; import { UploadOutlined } from "@ant-design/icons"; -import { ImageBaseURL } from "../../api/config"; import { useTranslation } from "react-i18next"; import { FaRegFilePdf } from "react-icons/fa"; import { useState } from "react"; @@ -17,7 +16,7 @@ const PdfUploader = ({ }: any) => { const { formik, t, isError } = useFormField(name, props); let FormikName = formik.values[name]; - const imageUrl = formik.values[name] ? ImageBaseURL + FormikName : ""; + const imageUrl = formik.values[name] ? FormikName : ""; const [Imageurl, setImageurl] = useState(null); const FilehandleChange = (value: any) => { diff --git a/src/Components/FilterField/components/useFilter.tsx b/src/Components/FilterField/components/useFilter.tsx new file mode 100644 index 0000000..9811f4c --- /dev/null +++ b/src/Components/FilterField/components/useFilter.tsx @@ -0,0 +1,30 @@ +import React from 'react' + + + +interface IFilterBody { + children:React.ReactNode +} +const useFilter = () => { + + const FilterButton = ()=>{ + return ( +
+ FilterButton +
+ ) + } + const FilterBody = ({children}:IFilterBody)=>{ + return ( +
+ FilterBody +
+ ) + } + + return { + FilterButton , FilterBody + } +} + +export default useFilter \ No newline at end of file diff --git a/src/Components/FilterField/enums/Filter.ts b/src/Components/FilterField/enums/Filter.ts new file mode 100644 index 0000000..02e36ce --- /dev/null +++ b/src/Components/FilterField/enums/Filter.ts @@ -0,0 +1,5 @@ +export enum FilterEnum { + FILTER="FILTER" + + +} diff --git a/src/Components/FilterField/states/FilterState.ts b/src/Components/FilterField/states/FilterState.ts new file mode 100644 index 0000000..91f4e72 --- /dev/null +++ b/src/Components/FilterField/states/FilterState.ts @@ -0,0 +1,22 @@ +import { create } from "zustand"; + +interface FilterState { + filterState: any[]; + setFilterState: (data: any) => void; + clearFilterState: () => void; + setWithOldValue: (data: any) => void; + setInitialValue: (data: any) => void; +} + +export const useFilterState = create((set, get) => ({ + filterState: [], + setFilterState: (data) => set(() => ({ filterState: data })), + clearFilterState: () => set(() => ({ filterState: [] })), + setWithOldValue: (data) => + set((state) => ({ filterState: [...state.filterState, data] })), + setInitialValue: (data) => { + if (get().filterState.length < 1) { + set(() => ({ filterState: data })); + } + }, +})); diff --git a/src/Hooks/useKeyCombination.tsx b/src/Hooks/useKeyCombination.tsx new file mode 100644 index 0000000..c8b530b --- /dev/null +++ b/src/Hooks/useKeyCombination.tsx @@ -0,0 +1,32 @@ +import { useEffect } from 'react'; + +type KeyCombination = { + ctrlKey?: boolean; + shiftKey?: boolean; + code: string; // Use string here for flexibility +}; + +const useKeyCombination = (keyCombination: KeyCombination, callback: () => void) => { + useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + const matches = + (keyCombination.ctrlKey === undefined || event.ctrlKey === keyCombination.ctrlKey) && + (keyCombination.shiftKey === undefined || event.shiftKey === keyCombination.shiftKey) && + event.code === keyCombination.code; + + if (matches) { + callback(); + event.preventDefault(); // Prevent the default action for the event + event.stopPropagation(); // Stop the event from propagating further + } + }; + + window.addEventListener('keydown', handleKeyDown); + + return () => { + window.removeEventListener('keydown', handleKeyDown); + }; + }, [keyCombination, callback]); +}; + +export default useKeyCombination; diff --git a/src/Pages/Admin/question/AddPage.tsx b/src/Pages/Admin/question/AddPage.tsx index 10c126d..1d38668 100644 --- a/src/Pages/Admin/question/AddPage.tsx +++ b/src/Pages/Admin/question/AddPage.tsx @@ -34,6 +34,7 @@ import { useGetAllLesson } from "../../../api/lesson"; import { useGetAllSubject } from "../../../api/subject"; import { useGetAllGrade } from "../../../api/grade"; import { useGetAllCurriculum } from "../../../api/curriculum"; +import useKeyCombination from "../../../Hooks/useKeyCombination"; const AddPage: React.FC = () => { const { isSuccess: isSuccessAsync, mutateAsync } = useAddQuestionAsync(); @@ -206,6 +207,9 @@ const AddPage: React.FC = () => { // } }; + + + if (isBseQuestion) { return (
diff --git a/src/Pages/Admin/question/Model/Field/ChoiceFields.tsx b/src/Pages/Admin/question/Model/Field/ChoiceFields.tsx index 19c7003..646e27e 100644 --- a/src/Pages/Admin/question/Model/Field/ChoiceFields.tsx +++ b/src/Pages/Admin/question/Model/Field/ChoiceFields.tsx @@ -28,6 +28,7 @@ const ChoiceFields = ({ index, data }: { index: number; data: Choice }) => { return ( <>
+ { const formik = useFormikContext(); @@ -55,6 +58,9 @@ const Choices = () => { {...provided.draggableProps} {...provided.dragHandleProps} > +
+ +
)} diff --git a/src/Pages/Admin/question/Model/Malty/Add.tsx b/src/Pages/Admin/question/Model/Malty/Add.tsx index bb1ed3e..4529f9e 100644 --- a/src/Pages/Admin/question/Model/Malty/Add.tsx +++ b/src/Pages/Admin/question/Model/Malty/Add.tsx @@ -67,6 +67,10 @@ const Form = () => { }; const [t] = useTranslation(); + + + + return (
diff --git a/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx b/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx index 190e660..7b8990e 100644 --- a/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx +++ b/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx @@ -43,6 +43,8 @@ const ChoiceFields = ({ ].answers.filter((_: any, i: any) => i !== index); formik.setFieldValue(`Questions[${parent_index}].answers`, updatedAnswers); }; + + return ( <>
diff --git a/src/Pages/Admin/question/Model/Malty/ChoiceField/Choices.tsx b/src/Pages/Admin/question/Model/Malty/ChoiceField/Choices.tsx index 5bd116b..9016ccc 100644 --- a/src/Pages/Admin/question/Model/Malty/ChoiceField/Choices.tsx +++ b/src/Pages/Admin/question/Model/Malty/ChoiceField/Choices.tsx @@ -3,6 +3,7 @@ import ChoiceFields from "./ChoiceFields"; import { Choice } from "../../../../../../types/Item"; import { useFormikContext } from "formik"; import { DragDropContext, Draggable, Droppable } from "react-beautiful-dnd"; +import { HolderOutlined } from "@ant-design/icons"; const Choices = ({ parent_index }: { parent_index: number }) => { const formik = useFormikContext(); @@ -67,6 +68,9 @@ const Choices = ({ parent_index }: { parent_index: number }) => { {...provided.draggableProps} {...provided.dragHandleProps} > +
+ +
{ const formik = useFormikContext(); @@ -36,8 +38,7 @@ const Form = () => { console.log(parent_index); formik.setFieldValue(`Questions.[${parent_index}].answers`, [ - ...((formik?.values as any)?.Questions?.[parent_index] - .answers as Choice[]), + ...((formik?.values as any)?.Questions?.[parent_index]?.answers as Choice[]), { answer: null, @@ -69,7 +70,21 @@ const Form = () => { }; const [t] = useTranslation(); + + const lastQuestions = formik?.values?.Questions?.length -1 ; + useKeyCombination({ ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.CHOICE }, () => { + handleAddChoice(lastQuestions) + }); + + useKeyCombination({ ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.QUESTION }, () => { + + handleAddQuestion() + }); + + + return ( +
{ const [t] = useTranslation(); @@ -42,7 +44,13 @@ const Form = () => { ]); }; - console.log(formik?.values); + + useKeyCombination({ ctrlKey: true, shiftKey: true, code: CombinationKeyEnum.CHOICE }, () => { + + handleAddChoice() + }); + + return ( diff --git a/src/Pages/Home/Dummy.tsx b/src/Pages/Home/Dummy.tsx index ef03d6e..56c33ab 100644 --- a/src/Pages/Home/Dummy.tsx +++ b/src/Pages/Home/Dummy.tsx @@ -2,12 +2,21 @@ import React from "react"; import { useTranslation } from "react-i18next"; import { ABILITIES_ENUM } from "../../enums/abilities"; import useSetPageTitle from "../../Hooks/useSetPageTitle"; +import useFilter from "../../Components/FilterField/components/useFilter"; const Dummy = () => { const [t] = useTranslation(); useSetPageTitle(`${t(ABILITIES_ENUM?.MAIN_PAGE)} / ${t("dashboard")}`); + const {FilterButton,FilterBody} = useFilter() + return( +
+ + + karim + - return
; +
+ ); }; export default Dummy; diff --git a/src/Styles/Pages/exercise.scss b/src/Styles/Pages/exercise.scss index 30aba5f..09e2552 100644 --- a/src/Styles/Pages/exercise.scss +++ b/src/Styles/Pages/exercise.scss @@ -204,4 +204,9 @@ .add_new_button{ padding-inline: 20px !important; } +} + + +.HolderQuestion{ + transform: translateY(25px); } \ No newline at end of file diff --git a/src/api/config.ts b/src/api/config.ts index 18c6331..f5790b8 100644 --- a/src/api/config.ts +++ b/src/api/config.ts @@ -1,4 +1,4 @@ export const BaseURL = "https://nerd-back.point-dev.net/api/"; +// export const BaseURL = "http://192.168.1.109:8000/api/"; -export const ImageBaseURL = "https://nerd-back.point-dev.net/api/"; -export const HEADER_KEY = "X-Custom-Query-Key"; +export const HEADER_KEY = "X-Custom-Query-Key"; \ No newline at end of file diff --git a/src/enums/CombinationKeyEnum.ts b/src/enums/CombinationKeyEnum.ts new file mode 100644 index 0000000..2cff70e --- /dev/null +++ b/src/enums/CombinationKeyEnum.ts @@ -0,0 +1,6 @@ +export enum CombinationKeyEnum { + + QUESTION = "KeyK", + CHOICE = "KeyJ" + +} \ No newline at end of file diff --git a/src/translate/ar.json b/src/translate/ar.json index 2fa5ec8..247d208 100644 --- a/src/translate/ar.json +++ b/src/translate/ar.json @@ -241,7 +241,7 @@ "Pass": "نجاح", "users": "المستخدمين", "branchAdmin": "مسؤول الفروع", - "grade": "الدرجات", + "grade": "الصفوف", "homeworkAttachment": "مرفق الواجب المنزلي", "lateArrival": "وصول متأخر", "noteAttachment": "مرفق الملاحظة", @@ -685,7 +685,7 @@ "tags": "كلمات مفتاحية", "main_menu": "القائمة الرئيسية", "setting": "الإعدادات", - "grade": "الدرجات", + "grade": "الصفوف", "curriculum": "مقرر", "package": "حزمة", "subjects": "مواد", @@ -751,7 +751,7 @@ "Question": "لوحة القيادة /اسئلة ", "add_Question": "لوحة القيادة /إضافة اسئلة ", "edit_Question": "لوحة القيادة /تعديل اسئلة ", - "grade": "الدرجات", + "grade": "الصفوف", "report": "تقرير", "user": "مستخدم", "reseller":" لوحة القيادة / البائعين" @@ -761,31 +761,31 @@ "reseller":"البائعين" }, "alphabet": { - "A": "أ", - "B": "ب", - "C": "ت", - "D": "ث", - "E": "ج", - "F": "ح", - "G": "خ", - "H": "د", - "I": "ذ", - "J": "ر", - "K": "ز", - "L": "س", - "M": "ش", - "N": "ص", - "O": "ض", - "P": "ط", - "Q": "ظ", - "R": "ع", - "S": "غ", - "T": "ف", - "U": "ق", - "V": "ك", - "W": "ل", - "X": "م", - "Y": "ن", - "Z": "ه" + "A": "A", + "B": "B", + "C": "C", + "D": "D", + "E": "E", + "F": "F", + "G": "G", + "H": "H", + "I": "I", + "J": "J", + "K": "K", + "L": "L", + "M": "M", + "N": "N", + "O": "O", + "P": "P", + "Q": "Q", + "R": "R", + "S": "S", + "T": "T", + "U": "U", + "V": "V", + "W": "W", + "X": "X", + "Y": "Y", + "Z": "Z" } } diff --git a/src/zustand/AuthState.ts b/src/zustand/AuthState.ts index 1fbd6a2..ebdcdff 100644 --- a/src/zustand/AuthState.ts +++ b/src/zustand/AuthState.ts @@ -15,7 +15,6 @@ const useAuthState = create((set) => { const storedToken = localStorage.getItem(TOKEN_KEY); const storedAbilities = localStorage.getItem(ABILITIES_KEY); const storedType = localStorage.getItem(TYPE_KEY); - console.log(storedAbilities); return { isAuthenticated: !!storedToken,