Compare commits

..

2 Commits

Author SHA1 Message Date
karimaldeen
e17629a9ba Merge branch 'dev' of https://git.point-dev.net/Karimaldeen/Quiz_dashboard into dev 2024-09-12 16:16:19 +03:00
karimaldeen
a55b2a4761 fix question 2024-09-12 16:15:59 +03:00
11 changed files with 48 additions and 20 deletions

View File

@ -8,6 +8,7 @@
border: max(1.5px, 0.1vw) dashed #a9c3f1; border: max(1.5px, 0.1vw) dashed #a9c3f1;
margin-block: 10px; margin-block: 10px;
border-radius: 5px; border-radius: 5px;
z-index: 9999999 !important;
.ImageBoxIcon { .ImageBoxIcon {
cursor: pointer; cursor: pointer;
} }

View File

@ -29,6 +29,7 @@ const FormikFormModel: React.FC<FormikFormProps> = ({
initialValues={initialValues} initialValues={initialValues}
validationSchema={validationSchema} validationSchema={validationSchema}
onSubmit={handleSubmit} onSubmit={handleSubmit}
> >
{(formik) => { {(formik) => {
useEffect(() => { useEffect(() => {

View File

@ -8,6 +8,7 @@
border: max(1.5px, 0.1vw) dashed #a9c3f1; border: max(1.5px, 0.1vw) dashed #a9c3f1;
margin-block: 10px; margin-block: 10px;
border-radius: 5px; border-radius: 5px;
z-index: 9999999 !important;
.ImageBoxIcon { .ImageBoxIcon {
cursor: pointer; cursor: pointer;
} }

View File

@ -91,11 +91,11 @@ const Row: React.FC<RowProps> = (props) => {
}; };
const DrapableTable: React.FC = () => { const DrapableTable: React.FC = () => {
const { subject_id } = useParams<ParamsEnum>(); const { unit_id } = useParams<ParamsEnum>();
const { filterState } = useFilterState(); const { filterState } = useFilterState();
const response = useGetAllLesson({ const response = useGetAllLesson({
subject_id: subject_id, unit_id: unit_id,
pagination: false, pagination: false,
...filterState, ...filterState,
}); });

View File

@ -19,7 +19,6 @@ import { Question } from "../../../types/Item";
import BaseForm from "./Model/Malty/Form"; import BaseForm from "./Model/Malty/Form";
import ModelForm from "./Model/ModelForm"; import ModelForm from "./Model/ModelForm";
import { toast } from "react-toastify"; import { toast } from "react-toastify";
import { useFormikContext } from "formik";
const AcceptModal = lazy(() => import("./Model/AcceptModal")); const AcceptModal = lazy(() => import("./Model/AcceptModal"));
const AddPage: React.FC = () => { const AddPage: React.FC = () => {
@ -40,14 +39,16 @@ const AddPage: React.FC = () => {
console.log(objectToEdit,"objectToEdit"); console.log(objectToEdit,"objectToEdit");
const handleSubmit = ( const handleSubmit = (
values: any, values: any,
{ resetForm }: { resetForm: () => void }, { resetForm }: { resetForm: () => void },
) => { ) => {
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,
@ -137,8 +138,12 @@ console.log(objectToEdit,"objectToEdit");
}; };
useEffect(() => { useEffect(() => {
console.log("all api success"); console.log("all api success");
if(isSuccess){ if(isSuccess){
@ -146,6 +151,8 @@ console.log(objectToEdit,"objectToEdit");
} }
}, [isSuccess]) }, [isSuccess])
if (isBseQuestion) { if (isBseQuestion) {
return ( return (
<div className="exercise_add"> <div className="exercise_add">

View File

@ -93,7 +93,7 @@ const EditPage: React.FC = () => {
console.log(item); console.log(item);
if (item?.id) { if (item?.id) {
const itemToSend = structuredClone(item); const itemToSend = structuredClone(item);
const keysToRemove = ["content_image"]; const keysToRemove = ["content_image","hint"];
const updatedObject = removeStringKeys(itemToSend, keysToRemove); const updatedObject = removeStringKeys(itemToSend, keysToRemove);
console.log(updatedObject, "updatedObject"); console.log(updatedObject, "updatedObject");
@ -143,7 +143,7 @@ const EditPage: React.FC = () => {
}); });
} else { } else {
const keysToRemove = ["content_image"]; const keysToRemove = ["content_image","hint"];
console.log(DataToSend); console.log(DataToSend);
const updatedObject = removeStringKeys(DataToSend, keysToRemove); const updatedObject = removeStringKeys(DataToSend, keysToRemove);
delete updatedObject["parent_id"]; delete updatedObject["parent_id"];
@ -156,9 +156,11 @@ const EditPage: React.FC = () => {
const newAnswers = [] as any; const newAnswers = [] as any;
if(updatedObject?.answers?.length > 0){ if(updatedObject?.answers?.length > 0){
const isValidAnswers = updatedObject?.answers?.some((answer:any) => answer?.isCorrect === 1) 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);
if(!isValidAnswers){ if(!isValidAnswers || isValidAnswers2){
toast.error(t("validation.at_least_one_answer_should_be_correct")); toast.error(t("validation.at_least_one_answer_should_be_correct"));
return; return;
} }

View File

@ -16,7 +16,7 @@ const CheckboxField = ({
const [t] = useTranslation(); const [t] = useTranslation();
const CheckboxhandleChange = (value: any, index: number) => { const CheckboxhandleChange = (value: any, index: number) => {
const allAreZero = formik?.values?.answers?.some( const allAreZero = formik?.values?.answers?.some(
(item: any) => item.isCorrect === 1, (item: any) => item.isCorrect === 1 || item.isCorrect === true,
); );
if (allAreZero) { if (allAreZero) {
@ -35,7 +35,7 @@ const CheckboxField = ({
<Checkbox <Checkbox
onChange={onChange || CheckboxhandleChange} onChange={onChange || CheckboxhandleChange}
disabled={isDisabled} disabled={isDisabled}
checked={formik.values?.answers?.[name]?.isCorrect === 1} checked={formik.values?.answers?.[name]?.isCorrect === 1 || formik.values?.answers?.[name]?.isCorrect === true}
className={className} className={className}
> >
{t(`input.${label ? label : name}`)} {t(`input.${label ? label : name}`)}

View File

@ -1,5 +1,6 @@
import * as Yup from "yup"; import * as Yup from "yup";
import { Question } from "../../../../types/Item"; import { Question } from "../../../../types/Item";
import { toast } from "react-toastify";
export const getInitialValues = (objectToEdit: Question): any => { export const getInitialValues = (objectToEdit: Question): any => {
@ -13,7 +14,7 @@ export const getInitialValues = (objectToEdit: Question): any => {
content_image: objectToEdit?.content_image ?? "", content_image: objectToEdit?.content_image ?? "",
subject_id: objectToEdit?.subject_id ?? "", subject_id: objectToEdit?.subject_id ?? "",
canAnswersBeShuffled: objectToEdit?.canAnswersBeShuffled ? 1 : 0, canAnswersBeShuffled: objectToEdit?.canAnswersBeShuffled ? 1 : 0,
hint: objectToEdit?.hint ?? "", hint: objectToEdit?.hint ?? null,
isBase: 0, isBase: 0,
parent_id: objectToEdit?.parent_id ?? "", parent_id: objectToEdit?.parent_id ?? "",
answers: objectToEdit?.answers ?? [], answers: objectToEdit?.answers ?? [],
@ -33,7 +34,13 @@ export const getValidationSchema = () => {
content_image: Yup.string().nullable(), content_image: Yup.string().nullable(),
isCorrect: Yup.boolean(), isCorrect: Yup.boolean(),
}), }),
) ).test(
'at-least-one-correct',
'At least one answer must be correct',
(answers:any) => {
return answers.some((answer:any) => answer.isCorrect === true);
}
),
}); });
}; };
@ -44,8 +51,8 @@ export const getInitialValuesBase = (objectToEdit: Question): any => {
id: tag?.id, id: tag?.id,
name: tag?.name, name: tag?.name,
})); }));
console.log(tags); console.log(item,"item");
return { return {
...item, ...item,
canAnswersBeShuffled: objectToEdit?.canAnswersBeShuffled ? 1 : 0, canAnswersBeShuffled: objectToEdit?.canAnswersBeShuffled ? 1 : 0,
@ -65,7 +72,7 @@ export const getInitialValuesBase = (objectToEdit: Question): any => {
isBase: 1, isBase: 1,
parent_id: objectToEdit?.parent_id ?? "", parent_id: objectToEdit?.parent_id ?? "",
canAnswersBeShuffled: objectToEdit?.canAnswersBeShuffled ? 1 : 0, canAnswersBeShuffled: objectToEdit?.canAnswersBeShuffled ? 1 : 0,
hint: objectToEdit?.hint ?? "", hint: objectToEdit?.hint ?? null,
Questions: questions, Questions: questions,
}; };
}; };
@ -87,7 +94,15 @@ export const getValidationSchemaBase = () => {
isCorrect: Yup.boolean(), isCorrect: Yup.boolean(),
}), }),
) )
.nullable("required"), .test(
'at-least-one-correct',
'At least one answer must be correct',
(answers:any) => {
console.log(answers,"answers");
return answers.some((answer:any) => answer.isCorrect === true);
}
),
}), }),
), ),
}); });

View File

@ -6,11 +6,11 @@ import { ParamsEnum } from "../../../../enums/params";
import { useFilterState } from "../../../../Components/Utils/Filter/FilterState"; import { useFilterState } from "../../../../Components/Utils/Filter/FilterState";
const TablePage: React.FC = () => { const TablePage: React.FC = () => {
const { course_id } = useParams<ParamsEnum>(); const { grade_id } = useParams<ParamsEnum>();
const { filterState } = useFilterState(); const { filterState } = useFilterState();
const response = useGetAllSubject({ const response = useGetAllSubject({
course_id: course_id, grade_id: grade_id,
pagination: true, pagination: true,
...filterState, ...filterState,
}); });

View File

@ -212,5 +212,6 @@
.HolderQuestion{ .HolderQuestion{
transform: translateY(25px); transform: translateY(55px);
z-index: -1;
} }

View File

@ -46,7 +46,7 @@
"grade_to_pass_must_be_less_than_max_grade": "يجب أن تكون درجة النجاح أقل من الحد الأقصى للدرجة", "grade_to_pass_must_be_less_than_max_grade": "يجب أن تكون درجة النجاح أقل من الحد الأقصى للدرجة",
"max_mark_must_be_greater_than_min_mark_to_pass": "يجب ان تكون اكبر من علامة النجاح", "max_mark_must_be_greater_than_min_mark_to_pass": "يجب ان تكون اكبر من علامة النجاح",
"Sorry, the question must have at least one option": "عذرًا، يجب أن يحتوي السؤال على خيار واحد على الأقل", "Sorry, the question must have at least one option": "عذرًا، يجب أن يحتوي السؤال على خيار واحد على الأقل",
"at_least_one_answer_should_be_correct":"يجب أن تكون إجابة واحدة على الأقل صحيحة" "at_least_one_answer_should_be_correct":"يجب أن تكون إجابة واحدة صحيحة"
}, },
"header": { "header": {
"register_students": "تسجيل الطلاب", "register_students": "تسجيل الطلاب",