This commit is contained in:
karimaldeen 2024-09-16 15:29:53 +03:00
parent 1d39a4cd4f
commit 32f87910ea
14 changed files with 177 additions and 66 deletions

View File

@ -27,6 +27,7 @@ const ImageBoxField = ({ name }: any) => {
const handleFileChange = (event: any) => { const handleFileChange = (event: any) => {
const file = event.target.files[0]; const file = event.target.files[0];
if (file) { if (file) {
const maxSize = 2 * 1024 * 1024; const maxSize = 2 * 1024 * 1024;
@ -42,6 +43,8 @@ const ImageBoxField = ({ name }: any) => {
if (file) { if (file) {
generateImagePreview(file, setImagePreview); generateImagePreview(file, setImagePreview);
console.log(file,"file");
formik.setFieldValue(name, file); formik.setFieldValue(name, file);
} }
}; };
@ -55,7 +58,7 @@ const ImageBoxField = ({ name }: any) => {
const handleCancel = () => { const handleCancel = () => {
setImagePreview(""); setImagePreview("");
formik.setFieldValue(name, ""); formik.setFieldValue(name, null);
if (fileInputRef.current) { if (fileInputRef.current) {
fileInputRef.current.value = ""; fileInputRef.current.value = "";

View File

@ -9,20 +9,27 @@ const SelectTag: React.FC = () => {
const [searchValue, setSearchValue] = useState<string>(""); const [searchValue, setSearchValue] = useState<string>("");
const [fieldValue, setFieldValue] = useState<string>(""); const [fieldValue, setFieldValue] = useState<string>("");
const [NewAdditionalData, setNewAdditionalData] = useState({})
const formik = useFormikContext<any>(); const formik = useFormikContext<any>();
const handleChange = (value: string[]) => { const handleChange = (value: any,option:any) => {
console.log(value); const newSelectedOption = option?.pop()
const newObject = {
id:newSelectedOption?.id,
name:newSelectedOption?.name
}
setNewAdditionalData(newObject)
formik.setFieldValue("tags", value); formik.setFieldValue("tags", value);
setSearchValue(""); setSearchValue("");
setFieldValue(""); setFieldValue("");
}; };
const handleSearch = useDebounce((value: string) => { const handleSearch = useDebounce((value: string) => {
setSearchValue(value); setSearchValue(value);
}); });
const handleFieldChange = (value: string) => { const handleFieldChange = (value: string) => {
setFieldValue(value); setFieldValue(value);
}; };
@ -46,7 +53,7 @@ const SelectTag: React.FC = () => {
const value = const value =
formik?.values?.tags?.map((item: any) => item?.id ?? item) ?? []; formik?.values?.tags?.map((item: any) => item?.id ?? item) ?? [];
const AllOptions = [...options, ...additionalData]; const AllOptions = [...options, ...additionalData,NewAdditionalData];
return ( return (
<div className="SelectTag"> <div className="SelectTag">

View File

@ -13,6 +13,21 @@ const Header = () => {
const { values, setFieldValue, setValues } = useFormikContext<any>(); const { values, setFieldValue, setValues } = useFormikContext<any>();
const { isBseQuestion, setIsBseQuestion } = useObjectToEdit(); const { isBseQuestion, setIsBseQuestion } = useObjectToEdit();
const { setSavedQuestionData } = useObjectToEdit(); const { setSavedQuestionData } = useObjectToEdit();
console.log(values,"values");
const isEdited = ()=>{
if(isBseQuestion || values?.isBase === 1){
}else{
const content = !!values?.content ;
const content_image = !!values?.content_image ;
const hint = !values?.hint ;
const answers = !values?.answers ;
}
}
const handleChange = () => { const handleChange = () => {
setSavedQuestionData(null); setSavedQuestionData(null);

View File

@ -115,7 +115,7 @@ const AddPage: React.FC = () => {
return false ; return false ;
} }
if(haveImageOrContent){ 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 return false
} }
@ -127,7 +127,8 @@ const AddPage: React.FC = () => {
const haveAnswers = answers?.length > 0; const haveAnswers = answers?.length > 0;
const haveMoreThanOneAnswer = haveAnswers && answers?.length > 1; const haveMoreThanOneAnswer = haveAnswers && answers?.length > 1;
const haveOneAnswerRight = haveMoreThanOneAnswer && answers?.some((item: any) => item?.isCorrect === 1 || item.isCorrect === true); 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) { if (!haveAnswers) {
toast.error(t("validation.it_should_have_more_than_one_answers")); toast.error(t("validation.it_should_have_more_than_one_answers"));
@ -145,7 +146,7 @@ const AddPage: React.FC = () => {
} }
if(haveImageOrContent){ 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 return false
} }

View File

@ -89,6 +89,8 @@ const EditPage: React.FC = () => {
if (item?.id) { if (item?.id) {
const itemToSend = structuredClone(item); const itemToSend = structuredClone(item);
const keysToRemove = ["content_image"]; const keysToRemove = ["content_image"];
console.log(itemToSend,"itemToSend");
const updatedObject = removeStringKeys(itemToSend, keysToRemove); const updatedObject = removeStringKeys(itemToSend, keysToRemove);
console.log(updatedObject, "updatedObject"); console.log(updatedObject, "updatedObject");
@ -96,16 +98,6 @@ const EditPage: React.FC = () => {
const oldAnswers = [] as any; const oldAnswers = [] as any;
const newAnswers = [] 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) => { updatedObject?.answers?.forEach((item: any) => {
if (item?.id) { if (item?.id) {
oldAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 }); oldAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 });
@ -149,19 +141,17 @@ const EditPage: React.FC = () => {
const oldAnswers = [] as any; const oldAnswers = [] as any;
const newAnswers = [] 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) => { updatedObject?.answers?.forEach((item: any) => {
if (item?.id) { if (item?.id) {
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 }); oldAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 });
}
} else { } else {
newAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 }); newAnswers.push({ ...item, isCorrect: item?.isCorrect ? 1 : 0 });
} }
@ -181,7 +171,6 @@ const EditPage: React.FC = () => {
}; };
const location = useLocation(); const location = useLocation();
const navigate = useNavigate(); const navigate = useNavigate();
const handleCancel = () => { const handleCancel = () => {
navigate(-1); navigate(-1);
@ -191,6 +180,7 @@ const EditPage: React.FC = () => {
const handleValidateSingleQuestion = (values:any)=>{ const handleValidateSingleQuestion = (values:any)=>{
const haveMoreThanOneAnswer = values?.answers?.length > 1; const haveMoreThanOneAnswer = values?.answers?.length > 1;
const haveOneAnswerRight = haveMoreThanOneAnswer && values?.answers?.some((item:any)=> item?.isCorrect === 1 || item.isCorrect === true ) 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){ if(!haveMoreThanOneAnswer){
toast.error(t("validation.it_should_have_more_than_one_answers")) ; toast.error(t("validation.it_should_have_more_than_one_answers")) ;
@ -200,6 +190,10 @@ const EditPage: React.FC = () => {
toast.error(t("validation.it_should_have_more_than_one_correct_answers")) ; toast.error(t("validation.it_should_have_more_than_one_correct_answers")) ;
return false ; return false ;
} }
if(haveImageOrContent){
toast.error(t("validation.one_of_image_and_content_should_be_enter"))
return false
}
} }
@ -210,6 +204,7 @@ const handleValidateBaseQuestion = (values: any) => {
const haveMoreThanOneAnswer = haveAnswers && answers?.length > 1; const haveMoreThanOneAnswer = haveAnswers && answers?.length > 1;
const haveOneAnswerRight = const haveOneAnswerRight =
haveMoreThanOneAnswer && answers?.some((item: any) => item?.isCorrect === 1 || item.isCorrect === true); 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) { if (!haveAnswers) {
toast.error(t("validation.it_should_have_more_than_one_answers")); toast.error(t("validation.it_should_have_more_than_one_answers"));
@ -226,6 +221,12 @@ const handleValidateBaseQuestion = (values: any) => {
return false; return false;
} }
if(haveImageOrContent){
toast.error(t("validation.one_of_image_and_content_should_be_enter"))
return false
}
return true; return true;
}); });

View File

@ -26,6 +26,16 @@ const ChoiceFields = ({ index, data }: { index: number; data: Choice }) => {
formik.setFieldValue("answers", updatedAnswers); 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 ( return (
<> <>
<div className="ChoiceFields"> <div className="ChoiceFields">
@ -52,7 +62,17 @@ const ChoiceFields = ({ index, data }: { index: number; data: Choice }) => {
name={index} name={index}
type="Checkbox" type="Checkbox"
/> />
{handelCanDeleteAnswers() ?
<p className="delete_question_options" onClick={()=>{handleDeleteChoice()}}>
{t("header.delete_choice")}
<GoTrash
className="trash_icon"
size={17}
/>
</p>
:
<Popconfirm <Popconfirm
title={t("header.this_will_un_do_all_your_changes")} title={t("header.this_will_un_do_all_your_changes")}
okText={t("practical.yes")} okText={t("practical.yes")}
@ -72,6 +92,8 @@ const ChoiceFields = ({ index, data }: { index: number; data: Choice }) => {
</Popconfirm> </Popconfirm>
}
</div> </div>
</div> </div>

View File

@ -42,6 +42,19 @@ const ChoiceFields = ({
formik.setFieldValue(`Questions[${parent_index}].answers`, updatedAnswers); 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 ( return (
<> <>
<div className="ChoiceFields"> <div className="ChoiceFields">
@ -71,7 +84,19 @@ const ChoiceFields = ({
parent_index={parent_index} parent_index={parent_index}
/> />
<Popconfirm
{handelCanDeleteAnswers() ?
<p className="delete_question_options" onClick={()=>{handleDeleteChoice()}} >
{t("header.delete_choice")}
<GoTrash
className="trash_icon"
size={17}
/>
</p>
:
<Popconfirm
title={t("header.this_will_un_do_all_your_changes")} title={t("header.this_will_un_do_all_your_changes")}
okText={t("practical.yes")} okText={t("practical.yes")}
cancelText={t("practical.no")} cancelText={t("practical.no")}
@ -89,6 +114,10 @@ const ChoiceFields = ({
</p> </p>
</Popconfirm> </Popconfirm>
}
</div> </div>
</div> </div>

View File

@ -94,6 +94,11 @@ const Form = () => {
} }
}, [Success]); }, [Success]);
return ( return (
<Row className="w-100 exercise_form_container"> <Row className="w-100 exercise_form_container">
<div className="exercise_form"> <div className="exercise_form">

View File

@ -29,6 +29,22 @@ const QuestionFIeld = ({ index, data }: { index: number; data: Choice }) => {
formik.setFieldValue(`Questions`, updatedAnswers); formik.setFieldValue(`Questions`, updatedAnswers);
}; };
const values = formik.values.Questions?.[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 ( return (
<> <>
<div className="exercise_forms"> <div className="exercise_forms">
@ -48,7 +64,22 @@ const QuestionFIeld = ({ index, data }: { index: number; data: Choice }) => {
<ImageBoxField name={`Questions.${index}.content_image`} /> <ImageBoxField name={`Questions.${index}.content_image`} />
{handelCanDeleteAnswers() ?
<div className="answer_status" > <div className="answer_status" >
<p className="delete_question_options" onClick={()=>{handleDeleteQuestion()}}>
{t("header.delete_question")}
<GoTrash
className="trash_icon"
size={17}
/>
</p>
</div>
:
<div className="answer_status" >
<Popconfirm <Popconfirm
title={t("header.this_will_un_do_all_your_changes")} title={t("header.this_will_un_do_all_your_changes")}
okText={t("practical.yes")} okText={t("practical.yes")}
@ -68,6 +99,9 @@ const QuestionFIeld = ({ index, data }: { index: number; data: Choice }) => {
</Popconfirm> </Popconfirm>
</div> </div>
}
</div> </div>
</div> </div>

View File

@ -1,6 +1,7 @@
import React from "react"; import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import useFilter from "../../Components/FilterField/components/useFilter"; import useFilter from "../../Components/FilterField/components/useFilter";
import { Select } from "antd";
const Dummy = () => { const Dummy = () => {
const [t] = useTranslation(); const [t] = useTranslation();
@ -12,8 +13,11 @@ const Dummy = () => {
<FilterBody> <FilterBody>
karim karim
</FilterBody> </FilterBody>
<Select
style={{width:"200px"}}
showSearch
/>
karim2
</div> </div>
); );
}; };

View File

@ -96,15 +96,3 @@
.model_sub_children{ .model_sub_children{
padding-bottom: 30px; padding-bottom: 30px;
} }
.ant-select-selection-search{
color: #6A7287 !important;
display: none !important;
}
:where(.css-dev-only-do-not-override-oad6qy).ant-select-single.ant-select-lg .ant-select-selector .ant-select-selection-search{
input{
}
}
:where(.css-dev-only-do-not-override-oad6qy).ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{
}

View File

@ -3,6 +3,7 @@
@import "./Layout.scss"; @import "./Layout.scss";
@import "./SideBar.scss"; @import "./SideBar.scss";
@import "./DataTable.scss"; @import "./DataTable.scss";
@import "./DataState.scss"; @import "./DataState.scss";
@import "./PageHeader.scss"; @import "./PageHeader.scss";
@import "./FilterLayout.scss"; @import "./FilterLayout.scss";

View File

@ -49,7 +49,8 @@
"at_least_one_answer_should_be_correct": "يجب أن تكون إجابة واحدة صحيحة", "at_least_one_answer_should_be_correct": "يجب أن تكون إجابة واحدة صحيحة",
"it_should_have_more_than_one_answers": "يجب أن يحتوي على أكثر من إجابة", "it_should_have_more_than_one_answers": "يجب أن يحتوي على أكثر من إجابة",
"it_should_have_more_than_one_correct_answers": "يجب أن يحتوي على إجابة صحيحة", "it_should_have_more_than_one_correct_answers": "يجب أن يحتوي على إجابة صحيحة",
"File_size_exceeds_2_MB_limit.":"حجم الملف يتجاوز الحد الأقصى البالغ 2 ميجابايت" "File_size_exceeds_2_MB_limit.":"حجم الملف يتجاوز الحد الأقصى البالغ 2 ميجابايت",
"one_of_image_and_content_should_be_enter":"يجب إدخال صورة أو محتوى واحد على الأقل"
}, },
"header": { "header": {
"register_students": "تسجيل الطلاب", "register_students": "تسجيل الطلاب",

View File

@ -14,7 +14,7 @@ export function removeStringKeys(obj: any, keysToRemove: string[]): any {
// Check if the value is a string or "null" and the key is in keysToRemove // Check if the value is a string or "null" and the key is in keysToRemove
if ( if (
keysToRemove.includes(key) && keysToRemove.includes(key) &&
(typeof value === "string" || value === "null") (typeof value === "string")
) { ) {
delete obj[key]; delete obj[key];
} else { } else {