diff --git a/src/Components/CustomFields/ImageBoxField/ImageBoxField.tsx b/src/Components/CustomFields/ImageBoxField/ImageBoxField.tsx index 65ef83e..89888fc 100644 --- a/src/Components/CustomFields/ImageBoxField/ImageBoxField.tsx +++ b/src/Components/CustomFields/ImageBoxField/ImageBoxField.tsx @@ -27,6 +27,7 @@ const ImageBoxField = ({ name }: any) => { const handleFileChange = (event: any) => { const file = event.target.files[0]; + if (file) { const maxSize = 2 * 1024 * 1024; @@ -42,6 +43,8 @@ const ImageBoxField = ({ name }: any) => { if (file) { generateImagePreview(file, setImagePreview); + console.log(file,"file"); + formik.setFieldValue(name, file); } }; @@ -55,7 +58,7 @@ const ImageBoxField = ({ name }: any) => { const handleCancel = () => { setImagePreview(""); - formik.setFieldValue(name, ""); + formik.setFieldValue(name, null); if (fileInputRef.current) { fileInputRef.current.value = ""; @@ -79,9 +82,9 @@ const ImageBoxField = ({ name }: any) => {
{imagePreview ? ( - Preview + Preview ) : ( - + )}
{ const [searchValue, setSearchValue] = useState(""); const [fieldValue, setFieldValue] = useState(""); + const [NewAdditionalData, setNewAdditionalData] = useState({}) const formik = useFormikContext(); - const handleChange = (value: string[]) => { + const handleChange = (value: any,option:any) => { + console.log(option); console.log(value); + const newSelectedOption = option?.pop() + console.log(newSelectedOption); + const newObject = { + id:newSelectedOption?.id, + name:newSelectedOption?.name + } + setNewAdditionalData(newObject) formik.setFieldValue("tags", value); setSearchValue(""); setFieldValue(""); }; const handleSearch = useDebounce((value: string) => { + console.log(value,"value"); + setSearchValue(value); }); const handleFieldChange = (value: string) => { + setFieldValue(value); }; @@ -36,18 +48,33 @@ const SelectTag: React.FC = () => { }); const [t] = useTranslation(); + const initialData = formik?.values?.tags?.filter((item:any)=>{ + return item?.id + + }) ?? [] + + const options = data?.data ?? []; const additionalData = options.length < 1 && searchValue.length > 1 && !isLoading ? [{ id: searchValue, name: searchValue }] : []; - + const value = formik?.values?.tags?.map((item: any) => item?.id ?? item) ?? []; - const AllOptions = [...options, ...additionalData]; + const AllOptions = [...options, ...additionalData,NewAdditionalData, ...(initialData)]; + + const uniqueOptions = Array.from( + new Map( + AllOptions + .filter(item => Object.keys(item).length > 0) // Filter out empty objects + .map(item => [item.id, item]) // Create [id, item] pairs to ensure uniqueness + ).values() + ); + return (
@@ -58,7 +85,7 @@ const SelectTag: React.FC = () => { placeholder="" fieldNames={{ label: "name", value: "id" }} onChange={handleChange} - options={AllOptions} + options={uniqueOptions} filterOption={false} loading={isLoading} notFoundContent={isLoading ? : t("practical.not_found")} diff --git a/src/Components/ValidationField/utils/ValidationField.scss b/src/Components/ValidationField/utils/ValidationField.scss index 909abd9..049c303 100644 --- a/src/Components/ValidationField/utils/ValidationField.scss +++ b/src/Components/ValidationField/utils/ValidationField.scss @@ -7,7 +7,6 @@ margin-bottom: 10px; position: relative; min-height: 80px; - // padding-inline: 20px; > * { width: 100% !important; min-width: 150px; diff --git a/src/Components/exercise/Header.tsx b/src/Components/exercise/Header.tsx index a524b5f..325ee98 100644 --- a/src/Components/exercise/Header.tsx +++ b/src/Components/exercise/Header.tsx @@ -1,37 +1,59 @@ import { useFormikContext } from "formik"; -import React from "react"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { GoArrowSwitch } from "react-icons/go"; import { useObjectToEdit } from "../../zustand/ObjectToEditState"; -import { QUESTION_OBJECT_KEY } from "../../config/AppKey"; -import { Popconfirm, Popover } from "antd"; +import { Checkbox, CheckboxProps, Popconfirm, Popover } from "antd"; import { CombinationKeyEnum } from "../../enums/CombinationKeyEnum"; import { PopconfirmProps } from "antd/lib"; +import { SettingFilled } from "@ant-design/icons"; const Header = () => { const [t] = useTranslation(); - const { values, setFieldValue, setValues } = useFormikContext(); - const { isBseQuestion, setIsBseQuestion } = useObjectToEdit(); - const { setSavedQuestionData } = useObjectToEdit(); + const { values, setValues } = useFormikContext(); + const { isBseQuestion, setIsBseQuestion,ShowHint,setShowHint } = useObjectToEdit(); + // const [Setting, setSetting] = useState(false) + const isEdited = ()=>{ + if(isBseQuestion || values?.isBase === 1){ + + const content = !values?.content ; + const content_image = !values?.content_image ; + + const Questions = values?.Questions?.length <= 1 && values?.Questions?.[0]?.answers?.length === 0 ; + const defaultQuestionHint = Object.keys(values?.Questions?.[0] ?? {})?.length <= 1 + + + + if(content && content_image && Questions && defaultQuestionHint) { + return false + } + }else{ + const content = !values?.content ; + const content_image = !values?.content_image ; + const hint = !values?.hint ; + const answers = !(values?.answers?.length > 0) ; + const tags = !(values?.tags?.length > 0) ; + if(content && content_image && hint && answers && tags) { + return false + } + } + return true + } + const handleChange = () => { - setSavedQuestionData(null); - localStorage.removeItem(QUESTION_OBJECT_KEY); if (isBseQuestion) { setIsBseQuestion(false); setValues(null); - setFieldValue("isBase", 0); } else { setIsBseQuestion(true); setValues(null); - setFieldValue("isBase", 1); } }; const confirm: PopconfirmProps['onConfirm'] = (e) => { - console.log(e); setTimeout(() => { - handleChange() + handleChange() ; }, 500); }; @@ -50,6 +72,25 @@ const Header = () => {
); + + const handleOpenChange = (newOpen: boolean) => { + // setSetting(newOpen); + }; + const onChange: CheckboxProps['onChange'] = (e) => { + setShowHint(e.target.checked); + }; + + + const contentSetting = ( +
+ + + { t("header.show_hint")} + + +
+ ); + return (
@@ -62,7 +103,17 @@ const Header = () => {
- + + + + +
+ + { + isEdited() ? + { : t("header.exercise")} + + + : + + <> + + + confirm()} className="m-2" /> + {isBseQuestion || values?.isBase === 1 + ? t("header.malty_exercise") + : t("header.exercise")} + + + + + } +
); diff --git a/src/Layout/Dashboard/FormikFormModel.tsx b/src/Layout/Dashboard/FormikFormModel.tsx index 3f99817..e738956 100644 --- a/src/Layout/Dashboard/FormikFormModel.tsx +++ b/src/Layout/Dashboard/FormikFormModel.tsx @@ -33,7 +33,7 @@ const FormikFormModel: React.FC = ({ > {(formik) => { useEffect(() => { - if (isOpen === "") { + if (isOpen === "" || isOpen === "isSuccess") { formik.setErrors({}); formik.resetForm(); } diff --git a/src/Layout/Dashboard/Table/DataTable.tsx b/src/Layout/Dashboard/Table/DataTable.tsx index a5569c4..b8de0a3 100644 --- a/src/Layout/Dashboard/Table/DataTable.tsx +++ b/src/Layout/Dashboard/Table/DataTable.tsx @@ -1,6 +1,7 @@ -import React, { lazy, Suspense } from "react"; +import React, { lazy, Suspense, useEffect } from "react"; import { useAddKeyToData, Table, useTranslation, usePagination } from "."; import { DataTableProps } from "../../../types/Table"; +import { useDataTableState } from "../../../zustand/TabState"; const NotFoundLottie = React.lazy( () => import("../../../Components/Lottie/NotFound/NotFoundLottie"), ); @@ -14,21 +15,26 @@ const DataTable: React.FC = ({ ...props }) => { const data: any[] = response?.data?.data || []; - const dataSource = useAddKeyToData(data); const columns = useColumns(); const { pagination, handlePageChange } = usePagination(response?.data); const [t] = useTranslation(); - const getRowClassName = (record: any, index: number): string => { + const getRowClassName = (_record: any, index: number): string => { return index % 2 === 0 ? "even-row" : "odd-row"; }; const isRefetching = response?.isRefetching; const isLoading = response?.isLoading; - + const dataLength = data?.length ; + const {setDataTableLength} = useDataTableState() + useEffect(() => { + setDataTableLength(dataLength) + }, [dataLength]) + return ( getRowClassName(record, index)} className="DataTable" loading={{ diff --git a/src/Layout/Dashboard/usePagination.ts b/src/Layout/Dashboard/usePagination.ts index 0f50841..b0c6330 100644 --- a/src/Layout/Dashboard/usePagination.ts +++ b/src/Layout/Dashboard/usePagination.ts @@ -1,5 +1,4 @@ import { useState, useEffect } from "react"; -import { useLocation, useNavigate } from "react-router-dom"; import { PaginationAntd, PaginationMeta } from "../../types/Table"; import { useFilterStateState } from "../../zustand/Filter"; @@ -8,8 +7,6 @@ interface Data { } const usePagination = (data: Data) => { - const navigate = useNavigate(); - const location = useLocation(); const { Filter ,setFilter } = useFilterStateState(); const [pagination, setPagination] = useState({ @@ -29,7 +26,6 @@ const usePagination = (data: Data) => { }, [data]); const handlePageChange = (page: number) => { - // navigate(`?page=${page}`); setFilter({ ...Filter, page:page diff --git a/src/Pages/Admin/Grade/Table.tsx b/src/Pages/Admin/Grade/Table.tsx index 7a9dc43..71c8528 100644 --- a/src/Pages/Admin/Grade/Table.tsx +++ b/src/Pages/Admin/Grade/Table.tsx @@ -17,7 +17,7 @@ const App: React.FC = () => { sort_by }); - return ; + return ; }; export default App; diff --git a/src/Pages/Admin/Grade/useTableColumns.tsx b/src/Pages/Admin/Grade/useTableColumns.tsx index 437b3c8..bc10a12 100644 --- a/src/Pages/Admin/Grade/useTableColumns.tsx +++ b/src/Pages/Admin/Grade/useTableColumns.tsx @@ -1,13 +1,10 @@ import { TableColumnsType } from "antd"; -import { FaPlus } from "react-icons/fa"; import useModalHandler from "../../../utils/useModalHandler"; import { ModalEnum } from "../../../enums/Model"; import { useObjectToEdit } from "../../../zustand/ObjectToEditState"; import { useTranslation } from "react-i18next"; -import { ABILITIES_ENUM } from "../../../enums/abilities"; import { useNavigate } from "react-router-dom"; import { - canAddGrade, canDeleteGrade, canEditGrade, canShowGrade, @@ -15,7 +12,6 @@ import { import ActionButtons from "../../../Components/Table/ActionButtons"; import ColumnsImage from "../../../Components/Columns/ColumnsImage"; import { Grade } from "../../../types/Grade"; -import { useFilterState } from "../../../Components/Utils/Filter/FilterState"; import { useFilterStateState } from "../../../zustand/Filter"; export const useColumns = () => { @@ -26,7 +22,7 @@ export const useColumns = () => { const { setFilter } = useFilterStateState(); - + const handelShow = (record: Grade) => { setFilter({}) navigate(`${record?.id}`); diff --git a/src/Pages/Admin/Tags/field/SelectTag.tsx b/src/Pages/Admin/Tags/field/SelectTag.tsx index 5a307cb..3b276ed 100644 --- a/src/Pages/Admin/Tags/field/SelectTag.tsx +++ b/src/Pages/Admin/Tags/field/SelectTag.tsx @@ -11,7 +11,7 @@ const SelectTag: React.FC = () => { const [fieldValue, setFieldValue] = useState(""); const formik = useFormikContext(); const handleChange = (value: string[]) => { - console.log(value); + console.log(value,"value"); formik.setFieldValue("tags", value); setSearchValue(""); diff --git a/src/Pages/Admin/question/AddPage.tsx b/src/Pages/Admin/question/AddPage.tsx index 0aa7986..ea94e47 100644 --- a/src/Pages/Admin/question/AddPage.tsx +++ b/src/Pages/Admin/question/AddPage.tsx @@ -115,7 +115,7 @@ const AddPage: React.FC = () => { return false ; } if(haveImageOrContent){ - toast.error("validation.one_of_image_and_content_should_be_enter") + toast.error(t("validation.one_of_image_and_content_should_be_enter")) return false } @@ -127,8 +127,9 @@ const AddPage: React.FC = () => { const haveAnswers = answers?.length > 0; const haveMoreThanOneAnswer = haveAnswers && answers?.length > 1; const haveOneAnswerRight = haveMoreThanOneAnswer && answers?.some((item: any) => item?.isCorrect === 1 || item.isCorrect === true); - const haveImageOrContent = haveOneAnswerRight && values?.answers?.some((item:any)=> !(item?.content) && !(item.content_image) ) - + const haveImageOrContent = haveOneAnswerRight && answers?.some((item:any)=> !(item?.content) && !(item.content_image) ) + console.log(haveImageOrContent,"haveImageOrContent"); + if (!haveAnswers) { toast.error(t("validation.it_should_have_more_than_one_answers")); return false; @@ -145,7 +146,7 @@ const AddPage: React.FC = () => { } if(haveImageOrContent){ - toast.error("validation.one_of_image_and_content_should_be_enter") + toast.error(t("validation.one_of_image_and_content_should_be_enter")) return false } diff --git a/src/Pages/Admin/question/EditPage.tsx b/src/Pages/Admin/question/EditPage.tsx index 7c6427c..10ecad9 100644 --- a/src/Pages/Admin/question/EditPage.tsx +++ b/src/Pages/Admin/question/EditPage.tsx @@ -58,8 +58,7 @@ const EditPage: React.FC = () => { const handleSubmit = (values: any) => { const DataToSend = structuredClone(values); setTagsSearch(null); - console.log(DataToSend); - + if (isBseQuestion) { const UpdateBseQuestion = { id: DataToSend?.id, @@ -89,6 +88,8 @@ const EditPage: React.FC = () => { if (item?.id) { const itemToSend = structuredClone(item); const keysToRemove = ["content_image"]; + console.log(itemToSend,"itemToSend"); + const updatedObject = removeStringKeys(itemToSend, keysToRemove); console.log(updatedObject, "updatedObject"); @@ -96,16 +97,6 @@ const EditPage: React.FC = () => { const oldAnswers = [] as any; const newAnswers = [] as any; - if (updatedObject?.answers?.length > 0) { - const isValidAnswers = updatedObject?.answers?.some( - (answer: any) => answer?.isCorrect === 1, - ); - - // if(!isValidAnswers){ - // toast.error(t("validation.at_least_one_answer_should_be_correct")); - // return; - // } - } updatedObject?.answers?.forEach((item: any) => { if (item?.id) { oldAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 }); @@ -118,7 +109,6 @@ const EditPage: React.FC = () => { new: newAnswers, }; console.log(answers); - mutate({ ...updatedObject, answers, @@ -127,7 +117,10 @@ const EditPage: React.FC = () => { } else { console.log(values?.id); - const tags = processTags(DataToSend); + const tags = processTags(item); + console.log(item,"DataToSend"); + + console.log(tags,"tags"); mutateAdd({ ...item, subject_id: subject_id, @@ -149,19 +142,17 @@ const EditPage: React.FC = () => { const oldAnswers = [] as any; const newAnswers = [] as any; - if (updatedObject?.answers?.length > 0) { - // const isValidAnswers = updatedObject?.answers?.some((answer:any) => answer?.isCorrect === 1 || answer?.isCorrect === true) - // const isValidAnswers2 = updatedObject?.answers?.filter((answer: any) => answer?.isCorrect === 1 || answer?.isCorrect === true ).length > 1; - // console.log(isValidAnswers2); - // console.log(isValidAnswers,"isValidAnswers"); - // if(!isValidAnswers || isValidAnswers2){ - // toast.error(t("validation.at_least_one_answer_should_be_correct")); - // return; - // } - } updatedObject?.answers?.forEach((item: any) => { if (item?.id) { - oldAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 }); + console.log(item,"item"); + const deletedImage = item?.content_image === null + if(deletedImage){ + oldAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0, content_image:"" }); + + }else{ + oldAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 }); + + } } else { newAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 }); } @@ -181,7 +172,6 @@ const EditPage: React.FC = () => { }; const location = useLocation(); - const navigate = useNavigate(); const handleCancel = () => { navigate(-1); @@ -191,6 +181,7 @@ const EditPage: React.FC = () => { const handleValidateSingleQuestion = (values:any)=>{ const haveMoreThanOneAnswer = values?.answers?.length > 1; const haveOneAnswerRight = haveMoreThanOneAnswer && values?.answers?.some((item:any)=> item?.isCorrect === 1 || item.isCorrect === true ) + const haveImageOrContent = haveOneAnswerRight && values?.answers?.some((item:any)=> !(item?.content) && !(item.content_image) ) if(!haveMoreThanOneAnswer){ toast.error(t("validation.it_should_have_more_than_one_answers")) ; @@ -200,6 +191,10 @@ const EditPage: React.FC = () => { toast.error(t("validation.it_should_have_more_than_one_correct_answers")) ; return false ; } + if(haveImageOrContent){ + toast.error(t("validation.one_of_image_and_content_should_be_enter")) + return false + } } @@ -210,6 +205,7 @@ const handleValidateBaseQuestion = (values: any) => { const haveMoreThanOneAnswer = haveAnswers && answers?.length > 1; const haveOneAnswerRight = haveMoreThanOneAnswer && answers?.some((item: any) => item?.isCorrect === 1 || item.isCorrect === true); + const haveImageOrContent = haveOneAnswerRight && answers?.some((item:any)=> !(item?.content) && !(item.content_image) ) if (!haveAnswers) { toast.error(t("validation.it_should_have_more_than_one_answers")); @@ -226,6 +222,12 @@ const handleValidateBaseQuestion = (values: any) => { return false; } + if(haveImageOrContent){ + toast.error(t("validation.one_of_image_and_content_should_be_enter")) + return false + } + + return true; }); diff --git a/src/Pages/Admin/question/Model/Field/ChoiceFields.tsx b/src/Pages/Admin/question/Model/Field/ChoiceFields.tsx index cc35eab..5698eac 100644 --- a/src/Pages/Admin/question/Model/Field/ChoiceFields.tsx +++ b/src/Pages/Admin/question/Model/Field/ChoiceFields.tsx @@ -9,11 +9,13 @@ import TextField from "./TextField"; import ImageBoxField from "../../../../../Components/CustomFields/ImageBoxField/ImageBoxField"; import { GoTrash } from "react-icons/go"; import { Popconfirm } from "antd"; +import { useObjectToEdit } from "../../../../../zustand/ObjectToEditState"; const ChoiceFields = ({ index, data }: { index: number; data: Choice }) => { const formik = useFormikContext(); const [t] = useTranslation(); + const { ShowHint } = useObjectToEdit(); const handleDeleteChoice = () => { console.log(index); @@ -26,6 +28,16 @@ const ChoiceFields = ({ index, data }: { index: number; data: Choice }) => { formik.setFieldValue("answers", updatedAnswers); }; + const values = formik?.values?.answers?.[index] ; + const handelCanDeleteAnswers = ()=>{ + const content = values?.content ; + const content_image = values?.content_image ; + if(!content && !content_image ){ + return true + } + return false + } + return ( <>
@@ -52,32 +64,45 @@ const ChoiceFields = ({ index, data }: { index: number; data: Choice }) => { name={index} type="Checkbox" /> + {handelCanDeleteAnswers() ? +

{handleDeleteChoice()}}> + {t("header.delete_choice")} + +

+ : {handleDeleteChoice()}} - defaultOpen={false} - - > -

- {t("header.delete_choice")} - -

+ title={t("header.this_will_un_do_all_your_changes")} + okText={t("practical.yes")} + cancelText={t("practical.no")} + onConfirm={()=>{handleDeleteChoice()}} + defaultOpen={false} - -
+ > +

+ {t("header.delete_choice")} + +

+ + + + } +
+ {ShowHint && { showCount={false} autoSize={{ minRows: 2, maxRows: 10 }} /> + + }
); diff --git a/src/Pages/Admin/question/Model/Field/Choices.tsx b/src/Pages/Admin/question/Model/Field/Choices.tsx index dfe7d95..c3d5148 100644 --- a/src/Pages/Admin/question/Model/Field/Choices.tsx +++ b/src/Pages/Admin/question/Model/Field/Choices.tsx @@ -40,6 +40,8 @@ const Choices = () => { {formik?.values?.answers?.map((item: Choice, index: number) => { return (
diff --git a/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx b/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx index 35940e2..584f803 100644 --- a/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx +++ b/src/Pages/Admin/question/Model/Malty/ChoiceField/ChoiceFields.tsx @@ -10,6 +10,7 @@ import { toast } from "react-toastify"; import ImageBoxField from "../../../../../../Components/CustomFields/ImageBoxField/ImageBoxField"; import { GoTrash } from "react-icons/go"; import { Popconfirm } from "antd"; +import { useObjectToEdit } from "../../../../../../zustand/ObjectToEditState"; const ChoiceFields = ({ index, @@ -23,7 +24,7 @@ const ChoiceFields = ({ const formik = useFormikContext(); const [t] = useTranslation(); - + const { ShowHint } = useObjectToEdit(); const handleDeleteChoice = () => { const arrayLength = formik.values.Questions?.[parent_index].answers?.length; @@ -42,6 +43,19 @@ const ChoiceFields = ({ formik.setFieldValue(`Questions[${parent_index}].answers`, updatedAnswers); }; + const values = formik.values.Questions?.[parent_index]?.answers?.[index] ; + console.log(values,"values"); + + const handelCanDeleteAnswers = ()=>{ + const content = values?.content ; + const content_image = values?.content_image ; + if(!content && !content_image ){ + return true + } + return false + } + + return ( <>
@@ -71,7 +85,19 @@ const ChoiceFields = ({ parent_index={parent_index} /> -{handleDeleteChoice()}} > + {t("header.delete_choice")} + +

+ : + + + + } + +
+ {ShowHint && + + }
); diff --git a/src/Pages/Admin/question/Model/Malty/ChoiceField/Choices.tsx b/src/Pages/Admin/question/Model/Malty/ChoiceField/Choices.tsx index af7cbf9..0e1fb95 100644 --- a/src/Pages/Admin/question/Model/Malty/ChoiceField/Choices.tsx +++ b/src/Pages/Admin/question/Model/Malty/ChoiceField/Choices.tsx @@ -52,7 +52,8 @@ const Choices = ({ parent_index }: { parent_index: number }) => { ).map((item: Choice, index: number) => { return (
{ const formik = useFormikContext(); - const { setSuccess, Success, setSavedQuestionData } = useObjectToEdit(); + const { setSuccess, Success, setSavedQuestionData ,ShowHint} = useObjectToEdit(); useEffect(() => { setSavedQuestionData(formik.values); }, [formik?.values]); - // console.log(formik?.errors); - const handleAddChoice = ( parent_index: number, fromKeyCombination: boolean = false, @@ -94,6 +92,11 @@ const Form = () => { } }, [Success]); + + + + + return (
@@ -113,7 +116,7 @@ const Form = () => { (item: Choice, parent_index: number) => { return (
-
+
{ )}
+ {ShowHint && { autoSize={{ minRows: 2, maxRows: 10 }} showCount={false} /> + + }
diff --git a/src/Pages/Admin/question/Model/Malty/QuestionFIeld/QuestionFIeld.tsx b/src/Pages/Admin/question/Model/Malty/QuestionFIeld/QuestionFIeld.tsx index 13b7aed..4b239f8 100644 --- a/src/Pages/Admin/question/Model/Malty/QuestionFIeld/QuestionFIeld.tsx +++ b/src/Pages/Admin/question/Model/Malty/QuestionFIeld/QuestionFIeld.tsx @@ -29,6 +29,21 @@ const QuestionFIeld = ({ index, data }: { index: number; data: Choice }) => { formik.setFieldValue(`Questions`, updatedAnswers); }; + + + const values = formik.values.Questions?.[index] ; + + const handelCanDeleteAnswers = ()=>{ + const content = values?.content ; + const content_image = values?.content_image ; + if(!content && !content_image ){ + return true + } + return false + } + + + return ( <>
@@ -48,7 +63,22 @@ const QuestionFIeld = ({ index, data }: { index: number; data: Choice }) => { -
+ {handelCanDeleteAnswers() ? +
+

{handleDeleteQuestion()}}> + {t("header.delete_question")} + +

+
+ + : + +
+ {
+ } + +
diff --git a/src/Pages/Admin/question/Model/Malty/Tags/MaltySelectTag.tsx b/src/Pages/Admin/question/Model/Malty/Tags/MaltySelectTag.tsx index e140d88..571050f 100644 --- a/src/Pages/Admin/question/Model/Malty/Tags/MaltySelectTag.tsx +++ b/src/Pages/Admin/question/Model/Malty/Tags/MaltySelectTag.tsx @@ -10,7 +10,16 @@ const MaltySelectTag = ({ parent_index }: { parent_index: number }) => { const [fieldValue, setFieldValue] = useState(""); const formik = useFormikContext(); const values = formik?.values?.Questions?.[parent_index]?.tags; - const handleChange = (value: string[]) => { + const [NewAdditionalData, setNewAdditionalData] = useState({}) + + const handleChange = (value: string[],option:any) => { + const newSelectedOption = option?.pop() + const newObject = { + id:newSelectedOption?.id, + name:newSelectedOption?.name + } + setNewAdditionalData(newObject) + formik.setFieldValue(`Questions.[${parent_index}].tags`, value); setSearchValue(""); setFieldValue(""); @@ -40,14 +49,29 @@ const MaltySelectTag = ({ parent_index }: { parent_index: number }) => { options.length < 1 && searchValue.length > 1 && !isLoading ? [{ id: searchValue, name: searchValue }] : []; - + const value = formik?.values?.Questions[parent_index]?.tags?.map( (item: any) => item?.id ?? item, ) ?? []; - const AllOptions = [...options, ...additionalData]; + const initialData = formik?.values?.Questions[parent_index]?.tags?.filter((item:any)=>{ + return item?.id + + }) ?? [] + + + const AllOptions = [...options, ...additionalData,NewAdditionalData , ...(initialData)]; + + const uniqueOptions = Array.from( + new Map( + AllOptions + .filter(item => Object.keys(item).length > 0) // Filter out empty objects + .map(item => [item.id, item]) // Create [id, item] pairs to ensure uniqueness + ).values() + ); + return (
@@ -58,7 +82,7 @@ const MaltySelectTag = ({ parent_index }: { parent_index: number }) => { placeholder="" fieldNames={{ label: "name", value: "id" }} onChange={handleChange} - options={AllOptions} + options={uniqueOptions} filterOption={false} loading={isLoading} notFoundContent={isLoading ? : t("practical.not_found")} diff --git a/src/Pages/Admin/question/Model/ModelForm.tsx b/src/Pages/Admin/question/Model/ModelForm.tsx index 6de101f..25d0668 100644 --- a/src/Pages/Admin/question/Model/ModelForm.tsx +++ b/src/Pages/Admin/question/Model/ModelForm.tsx @@ -16,7 +16,7 @@ import { toast } from "react-toastify"; const Form = () => { const [t] = useTranslation(); const formik = useFormikContext(); - const { setSuccess, Success } = useObjectToEdit(); + const { setSuccess, Success,ShowHint } = useObjectToEdit(); const handleAddChoice = (fromKeyCombination: boolean = false) => { formik.setFieldValue("answers", [ @@ -68,7 +68,9 @@ const Form = () => {

)} +
+ {ShowHint && { autoSize={{ minRows: 2, maxRows: 10 }} /> + + }
diff --git a/src/Pages/Admin/question/Page.tsx b/src/Pages/Admin/question/Page.tsx index 31537df..c4685ec 100644 --- a/src/Pages/Admin/question/Page.tsx +++ b/src/Pages/Admin/question/Page.tsx @@ -51,7 +51,6 @@ const TableHeader = () => { {name:LessonName, path:`lesson/${lesson_id }`} ]); - return (
}> diff --git a/src/Pages/Admin/question/formUtil.ts b/src/Pages/Admin/question/formUtil.ts index f8f43ed..da9f3ee 100644 --- a/src/Pages/Admin/question/formUtil.ts +++ b/src/Pages/Admin/question/formUtil.ts @@ -1,6 +1,5 @@ import * as Yup from "yup"; import { Question } from "../../../types/Item"; -import { toast } from "react-toastify"; export const getInitialValues = (objectToEdit: Question): any => { const tags = objectToEdit?.tags?.map((item: any, index: number) => { @@ -60,7 +59,6 @@ export const getInitialValuesBase = (objectToEdit: Question): any => { } }) - console.log(newAnswers,"newAnswers"); return { ...item, @@ -123,6 +121,7 @@ export const getValidationSchemaBase = () => { export function processTags(DataToSend: any) { console.log(DataToSend?.tags); + console.log(DataToSend); const oldTags = DataToSend?.tags ?.map((item: any, index: number) => { diff --git a/src/Pages/Admin/subject/Model/EditModel.tsx b/src/Pages/Admin/subject/Model/EditModel.tsx index 548d2e6..80bf254 100644 --- a/src/Pages/Admin/subject/Model/EditModel.tsx +++ b/src/Pages/Admin/subject/Model/EditModel.tsx @@ -7,14 +7,16 @@ import { handelImageState } from "../../../../utils/DataToSendImageState"; import LayoutModel from "../../../../Layout/Dashboard/LayoutModel"; import { QueryStatusEnum } from "../../../../enums/QueryStatus"; import ModelForm from "./ModelForm"; +import { useParams } from "react-router-dom"; +import { ParamsEnum } from "../../../../enums/params"; const ModalForm: React.FC = () => { const { objectToEdit } = useObjectToEdit((state) => state); const { mutate, status } = useUpdateSubject(); - + const {subject_id} = useParams() const handleSubmit = (values: any) => { - const Data_to_send = { ...values }; + const Data_to_send = { ...values,subject_id }; const handelImage = handelImageState(Data_to_send, "icon"); mutate(handelImage); }; diff --git a/src/Pages/Home/Dummy.tsx b/src/Pages/Home/Dummy.tsx index 6b178d0..2b2308f 100644 --- a/src/Pages/Home/Dummy.tsx +++ b/src/Pages/Home/Dummy.tsx @@ -1,6 +1,7 @@ import React from "react"; import { useTranslation } from "react-i18next"; import useFilter from "../../Components/FilterField/components/useFilter"; +import { Select } from "antd"; const Dummy = () => { const [t] = useTranslation(); @@ -8,12 +9,15 @@ const Dummy = () => { return (
- + {/* karim - - karim2 +