From 513ba6cb6a4b127efbff9a9e19c269ff70ba3ab5 Mon Sep 17 00:00:00 2001 From: karimaldeen Date: Wed, 11 Sep 2024 14:55:59 +0300 Subject: [PATCH 1/2] add CombinationKey --- src/Components/Columns/ColumnsImage.tsx | 1 - .../ImageBoxField/ImageBoxField.tsx | 3 - src/Components/CustomFields/PdfUploader.tsx | 3 +- .../FilterField/components/useFilter.tsx | 30 ++++++++++ src/Components/FilterField/enums/Filter.ts | 5 ++ .../FilterField/states/FilterState.ts | 22 +++++++ src/Hooks/useKeyCombination.tsx | 32 ++++++++++ src/Pages/Admin/question/AddPage.tsx | 4 ++ .../question/Model/Field/ChoiceFields.tsx | 1 + .../Admin/question/Model/Field/Choices.tsx | 6 ++ src/Pages/Admin/question/Model/Malty/Add.tsx | 4 ++ .../Model/Malty/ChoiceField/ChoiceFields.tsx | 2 + .../Model/Malty/ChoiceField/Choices.tsx | 4 ++ src/Pages/Admin/question/Model/Malty/Form.tsx | 19 +++++- src/Pages/Admin/question/Model/ModelForm.tsx | 10 +++- src/Pages/Home/Dummy.tsx | 11 +++- src/Styles/Pages/exercise.scss | 5 ++ src/api/config.ts | 4 +- src/enums/CombinationKeyEnum.ts | 6 ++ src/translate/ar.json | 58 +++++++++---------- src/zustand/AuthState.ts | 1 - 21 files changed, 189 insertions(+), 42 deletions(-) create mode 100644 src/Components/FilterField/components/useFilter.tsx create mode 100644 src/Components/FilterField/enums/Filter.ts create mode 100644 src/Components/FilterField/states/FilterState.ts create mode 100644 src/Hooks/useKeyCombination.tsx create mode 100644 src/enums/CombinationKeyEnum.ts 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, From 9ecb7ae551e0422d8e9500be909f673d85f983b8 Mon Sep 17 00:00:00 2001 From: karimaldeen Date: Wed, 11 Sep 2024 16:42:17 +0300 Subject: [PATCH 2/2] fix question --- src/Components/CustomFields/SelectTag.tsx | 21 +++- src/Pages/Admin/question/AddPage.tsx | 63 +---------- src/Pages/Admin/question/EditPage.tsx | 105 ++++-------------- .../Model/Malty/ChoiceField/ChoiceFields.tsx | 2 +- src/Pages/Admin/question/Model/Malty/Form.tsx | 4 +- .../Malty/QuestionFIeld/QuestionFIeld.tsx | 2 +- .../Model/Malty/Tags/MaltySelectTag.tsx | 22 +++- src/Pages/Admin/question/Model/formUtil.ts | 13 ++- src/Pages/Admin/question/Page.tsx | 11 +- src/utils/removeStringKeys.ts | 26 +++-- 10 files changed, 88 insertions(+), 181 deletions(-) diff --git a/src/Components/CustomFields/SelectTag.tsx b/src/Components/CustomFields/SelectTag.tsx index 474074f..abdc83f 100644 --- a/src/Components/CustomFields/SelectTag.tsx +++ b/src/Components/CustomFields/SelectTag.tsx @@ -37,11 +37,20 @@ const SelectTag: React.FC = () => { const [t] = useTranslation(); const options = data?.data ?? []; - const additionalData = - options?.length < 1 && searchValue.length > 1 && !isLoading - ? [{ id: `${searchValue}`, name: searchValue }] - : []; + const additionalData = + options.length < 1 && searchValue.length > 1 && !isLoading + ? [{ id: searchValue, name: searchValue }] + : []; + + console.log(options); +console.log(formik?.values?.tags); +const value = formik?.values?.tags?.map((item: any) => item?.id ?? item) ?? []; + + + const AllOptions = [...options, ...additionalData] + console.log(AllOptions); + return (
@@ -52,7 +61,7 @@ const SelectTag: React.FC = () => { placeholder="" fieldNames={{ label: "name", value: "id" }} onChange={handleChange} - options={[...options, ...additionalData]} + options={AllOptions} filterOption={false} loading={isLoading} notFoundContent={isLoading ? : t("practical.not_found")} @@ -66,7 +75,7 @@ const SelectTag: React.FC = () => { handleBlur(); } }} - value={formik?.values?.tags ?? []} + value={value} />
); diff --git a/src/Pages/Admin/question/AddPage.tsx b/src/Pages/Admin/question/AddPage.tsx index 1d38668..9da576a 100644 --- a/src/Pages/Admin/question/AddPage.tsx +++ b/src/Pages/Admin/question/AddPage.tsx @@ -21,21 +21,6 @@ import ModelForm from "./Model/ModelForm"; const AcceptModal = lazy(() => import("./Model/AcceptModal")); import { useModalState } from "../../../zustand/Modal"; -import { ModalEnum } from "../../../enums/Model"; -import { cleanObject } from "../../../utils/cleanObject"; -import { hasItems } from "../../../utils/hasItems"; -import { QUESTION_OBJECT_KEY } from "../../../config/AppKey"; -import useSaveOnDisconnect from "../../../Hooks/useSaveOnDisconnect"; -import { getLocalStorageQuestions } from "../../../utils/setLocalStorageQuestions"; -import { toast } from "react-toastify"; -import useSetPageTitle from "../../../Hooks/useSetPageTitle"; -import { useGetAllUnit } from "../../../api/unit"; -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(); const { mutate, isSuccess, isLoading } = useAddQuestion(); @@ -44,8 +29,6 @@ const AddPage: React.FC = () => { setTagsSearch, setObjectToEdit, objectToEdit, - setSuccess, - SavedQuestionData, } = useObjectToEdit(); const { setIsOpen } = useModalState((state) => state); @@ -53,52 +36,8 @@ const AddPage: React.FC = () => { const [t] = useTranslation(); const { unit_id, curriculum_id, grade_id, subject_id, lesson_id } = useParams(); - const { data: unit } = useGetAllUnit({ show: unit_id }); + - const { data: Subject } = useGetAllSubject({ - show: subject_id, - }); - const { data: grade } = useGetAllGrade({ - show: grade_id, - }); - const { data: Curriculum } = useGetAllCurriculum({ - show: curriculum_id, - }); - const { data: Lesson } = useGetAllLesson({ - show: lesson_id, - }); - - const gradeName = grade?.data?.name ?? ""; - const SubjectName = Subject?.data?.name ?? ""; - const CurriculumName = Curriculum?.data?.name ?? ""; - const unitName = unit?.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"), - ); const handleSubmit = ( values: any, diff --git a/src/Pages/Admin/question/EditPage.tsx b/src/Pages/Admin/question/EditPage.tsx index 78f5e63..cb7bd1b 100644 --- a/src/Pages/Admin/question/EditPage.tsx +++ b/src/Pages/Admin/question/EditPage.tsx @@ -14,7 +14,6 @@ import { useGetAllQuestion, useUpdateQuestion, } from "../../../api/Question"; -import { useQueryClient } from "react-query"; import { useTranslation } from "react-i18next"; import { useNavigate, useParams } from "react-router-dom"; import { ParamsEnum } from "../../../enums/params"; @@ -25,18 +24,10 @@ import ModelForm from "./Model/ModelForm"; import BaseForm from "./Model/Malty/Form"; import { Question } from "../../../types/Item"; import { toast } from "react-toastify"; -import useSetPageTitle from "../../../Hooks/useSetPageTitle"; -import { useGetAllUnit } from "../../../api/unit"; -import { useGetAllLesson } from "../../../api/lesson"; -import { useGetAllSubject } from "../../../api/subject"; -import { useGetAllGrade } from "../../../api/grade"; -import { useGetAllCurriculum } from "../../../api/curriculum"; + const EditPage: React.FC = () => { const { - unit_id, - curriculum_id, - grade_id, subject_id, lesson_id, question_id, @@ -54,8 +45,7 @@ const EditPage: React.FC = () => { const { data: Questions, isLoading: QuestionsDataLoading } = useGetAllQuestion({ - questionParentId: question_id, - onlyWithNoParents: false, + parent_id: question_id, }); const objectToEdit = { ...data?.data, Questions: Questions?.data }; @@ -67,52 +57,8 @@ const EditPage: React.FC = () => { }, [objectToEdit?.isBase]); const [t] = useTranslation(); - const { data: unit } = useGetAllUnit({ show: unit_id }); - const { data: Subject } = useGetAllSubject({ - show: subject_id, - }); - const { data: grade } = useGetAllGrade({ - show: grade_id, - }); - const { data: Curriculum } = useGetAllCurriculum({ - show: curriculum_id, - }); - const { data: Lesson } = useGetAllLesson({ - show: lesson_id, - }); - const gradeName = grade?.data?.name ?? ""; - const SubjectName = Subject?.data?.name ?? ""; - const CurriculumName = Curriculum?.data?.name ?? ""; - const unitName = unit?.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"), - ); const handleSubmit = (values: any) => { const DataToSend = structuredClone(values); @@ -123,13 +69,13 @@ const EditPage: React.FC = () => { const UpdateBseQuestion = { id: DataToSend?.id, content: DataToSend?.content, - image: DataToSend?.image ?? "", + content_image: DataToSend?.content_image ?? "", }; if ( - typeof UpdateBseQuestion?.image === "string" && - UpdateBseQuestion?.image !== "" + typeof UpdateBseQuestion?.content_image === "string" && + UpdateBseQuestion?.content_image !== "" ) { - delete UpdateBseQuestion["image"]; + delete UpdateBseQuestion["content_image"]; } console.log(DeletedQuestions, "DeletedQuestions"); console.log(UpdateBseQuestion); @@ -147,24 +93,24 @@ const EditPage: React.FC = () => { console.log(item); if (item?.id) { const itemToSend = structuredClone(item); - const keysToRemove = ["image", "answer_image"]; + const keysToRemove = ["content_image"]; const updatedObject = removeStringKeys(itemToSend, keysToRemove); console.log(updatedObject, "updatedObject"); const tags = processTags(updatedObject); - const oldanswers = [] as any; - const newanswers = [] as any; + const oldAnswers = [] as any; + const newAnswers = [] as any; updatedObject?.answers?.forEach((item: any) => { if (item?.id) { - oldanswers.push(item); + oldAnswers.push({...item,isCorrect:item?.isCorrect ? 1 : 0}); } else { - newanswers.push(item); + newAnswers.push({...item,isCorrect:item?.isCorrect ? 1 : 0}); } }); const answers = { - old: oldanswers, - new: newanswers, + old: oldAnswers, + new: newAnswers, }; console.log(answers); @@ -187,34 +133,31 @@ const EditPage: React.FC = () => { } }); } else { - const keysToRemove = ["image", "answer_image"]; + + const keysToRemove = ["content_image"]; + console.log(DataToSend); const updatedObject = removeStringKeys(DataToSend, keysToRemove); delete updatedObject["parent_id"]; const tags = processTags(updatedObject); - console.log(updatedObject, "updatedObject"); - if (!updatedObject?.image) { - updatedObject["image"] = ""; + if (!updatedObject?.content_image) { + updatedObject["content_image"] = ""; } - console.log(updatedObject); - const oldanswers = [] as any; - const newanswers = [] as any; + const oldAnswers = [] as any; + const newAnswers = [] as any; updatedObject?.answers?.forEach((item: any) => { if (item?.id) { - console.log(item); - - oldanswers.push(item); + oldAnswers.push({...item,isCorrect:item?.isCorrect ? 1 : 0}); } else { - newanswers.push(item); + newAnswers.push({...item,isCorrect:item?.isCorrect ? 1 : 0}); } }); const answers = { - old: oldanswers, - new: newanswers, + old: oldAnswers, + new: newAnswers, }; - console.log(answers, "answers"); mutate({ ...updatedObject, answers, tags }); } diff --git a/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx b/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx index 7b8990e..d35a97e 100644 --- a/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx +++ b/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx @@ -62,7 +62,7 @@ const ChoiceFields = ({ />
diff --git a/src/Pages/Admin/question/Model/Malty/Form.tsx b/src/Pages/Admin/question/Model/Malty/Form.tsx index 1701636..1e0e093 100644 --- a/src/Pages/Admin/question/Model/Malty/Form.tsx +++ b/src/Pages/Admin/question/Model/Malty/Form.tsx @@ -93,7 +93,7 @@ const Form = () => { label="main_question" type="TextArea" /> - +
@@ -128,7 +128,7 @@ const Form = () => { { type="TextArea" /> - +

diff --git a/src/Pages/Admin/question/Model/Malty/Tags/MaltySelectTag.tsx b/src/Pages/Admin/question/Model/Malty/Tags/MaltySelectTag.tsx index 584a085..1a4dfc0 100644 --- a/src/Pages/Admin/question/Model/Malty/Tags/MaltySelectTag.tsx +++ b/src/Pages/Admin/question/Model/Malty/Tags/MaltySelectTag.tsx @@ -36,11 +36,20 @@ const MaltySelectTag = ({ parent_index }: { parent_index: number }) => { const [t] = useTranslation(); const options = data?.data ?? []; - const additionalData = - options?.length < 1 && searchValue.length > 1 && !isLoading - ? [{ id: `new_${searchValue}`, name: searchValue }] - : []; + const additionalData = + options.length < 1 && searchValue.length > 1 && !isLoading + ? [{ id: searchValue, name: searchValue }] + : []; + + console.log(options); +const value = formik?.values?.Questions[parent_index]?.tags?.map((item: any) => item?.id ?? item) ?? []; + console.log(formik?.values?.Questions[parent_index]); + + console.log(value); + + const AllOptions = [...options, ...additionalData] + return (

@@ -50,8 +59,9 @@ const MaltySelectTag = ({ parent_index }: { parent_index: number }) => { style={{ width: "100%", height: "40px" }} placeholder="" fieldNames={{ label: "name", value: "id" }} + onChange={handleChange} - options={[...options, ...additionalData]} + options={AllOptions} filterOption={false} loading={isLoading} notFoundContent={isLoading ? : t("practical.not_found")} @@ -65,7 +75,7 @@ const MaltySelectTag = ({ parent_index }: { parent_index: number }) => { handleBlur(); } }} - value={values ?? []} + value={value} />
); diff --git a/src/Pages/Admin/question/Model/formUtil.ts b/src/Pages/Admin/question/Model/formUtil.ts index 39b85fa..2a2fdaa 100644 --- a/src/Pages/Admin/question/Model/formUtil.ts +++ b/src/Pages/Admin/question/Model/formUtil.ts @@ -5,10 +5,10 @@ import { QUESTION_OBJECT_KEY } from "../../../../config/AppKey"; export const getInitialValues = (objectToEdit: Question): any => { const tags = objectToEdit?.tags?.map((item: any, index: number) => { - return { ...item, key: index }; + return { ...item }; }); - console.log(objectToEdit); - + console.log(tags); + return { id: objectToEdit?.id ?? null, content: objectToEdit?.content ?? "", @@ -45,13 +45,14 @@ export const getInitialValuesBase = (objectToEdit: Question): any => { const tags = item?.tags?.map((tag: any) => ({ id: tag?.id, name: tag?.name, - key: `${tag?.id}_key_${tag?.name}`, })); - + console.log(tags); + return { ...item, canAnswersBeShuffled: objectToEdit?.canAnswersBeShuffled ? 1 : 0, - hint: item?.hint ?? "", + hint: objectToEdit?.hint ?? "", + isBase:0, tags, }; }); diff --git a/src/Pages/Admin/question/Page.tsx b/src/Pages/Admin/question/Page.tsx index d4fe210..79245e3 100644 --- a/src/Pages/Admin/question/Page.tsx +++ b/src/Pages/Admin/question/Page.tsx @@ -24,7 +24,7 @@ const TableHeader = () => { const deleteMutation = useDeleteQuestion(); - const { unit_id, curriculum_id, grade_id, subject_id, lesson_id } = + const { unit_id, grade_id, subject_id, lesson_id } = useParams(); const { data: unit } = useGetAllUnit({ show: unit_id }); @@ -34,16 +34,13 @@ const TableHeader = () => { const { data: grade } = useGetAllGrade({ show: grade_id, }); - const { data: Curriculum } = useGetAllCurriculum({ - show: curriculum_id, - }); + const { data: Lesson } = useGetAllLesson({ show: lesson_id, }); const gradeName = grade?.data?.name ?? ""; const SubjectName = Subject?.data?.name ?? ""; - const CurriculumName = Curriculum?.data?.name ?? ""; const unitName = unit?.data?.name ?? ""; const LessonName = Lesson?.data?.name ?? ""; @@ -56,10 +53,6 @@ const TableHeader = () => { "/" + SubjectName + "/" + - t("PageTitle.curriculum") + - "/" + - CurriculumName + - "/" + t("PageTitle.unit") + "/" + unitName + diff --git a/src/utils/removeStringKeys.ts b/src/utils/removeStringKeys.ts index 85f55ab..c433b15 100644 --- a/src/utils/removeStringKeys.ts +++ b/src/utils/removeStringKeys.ts @@ -1,11 +1,23 @@ export function removeStringKeys(obj: any, keysToRemove: string[]): any { - if (typeof obj === "object" && obj !== null) { - for (const key in obj) { - if (obj.hasOwnProperty(key)) { - if (keysToRemove.includes(key) && typeof obj[key] === "string") { - delete obj[key]; - } else { - removeStringKeys(obj[key], keysToRemove); + // Check if the input is an object or array + if (obj && typeof obj === 'object') { + // Handle arrays + if (Array.isArray(obj)) { + obj.forEach((item, index) => { + obj[index] = removeStringKeys(item, keysToRemove); + }); + } else { + // Handle objects + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + const value = obj[key]; + // Check if the value is a string or "null" and the key is in keysToRemove + if (keysToRemove.includes(key) && (typeof value === 'string' || value === 'null')) { + delete obj[key]; + } else { + // Recursively process nested objects or arrays + obj[key] = removeStringKeys(value, keysToRemove); + } } } }