KushKapadia

Untitled

Aug 29th, 2025
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { useCallback, useEffect, useState } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { ChevronLeft, ChevronRight } from 'lucide-react';
  4. import { useNavigate, useParams } from 'react-router-dom';
  5. import {
  6.   useGetQuestionPaperQuery,
  7.   useGetQuestionsByIdsQuery,
  8.   useEditQuestionPaperMutation,
  9.   useDeleteQuestionPaperMutation,
  10.   useEditQuestionPaperStatusMutation,
  11.   useGetUsersByRoleNamesQuery,
  12.   useCreateQuestionPaperMutation,
  13.   useSearchQuestionsByFieldsQuery,
  14. } from '../../store/api/assessmentApi';
  15. import { useUserRoles } from '../../service/auth/role';
  16. import { useActivityTracker } from '../../hooks/useActivityTracker';
  17. import { useDirection } from '../../contexts/DirectionContext';
  18. import { Button } from '@/components/ui/button';
  19. import { Card } from '@/components/ui/card';
  20. import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
  21. import { Input } from '@/components/ui/input';
  22. import { Label } from '@/components/ui/label';
  23. import { Checkbox } from '@/components/ui/checkbox';
  24. import Title from '@/components/shared/title';
  25. import SpinnerWithText from '@/components/shared/SpinnerWithText';
  26. import { Badge } from '@/components/ui/badge';
  27. import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
  28.  
  29. import { DIFFICULTY_OPTIONS } from '@/lib/constants';
  30.  
  31. import Questions from './components/questions';
  32. import CollapsibleCheckboxList from '@/components/shared/CollapsibleCheckboxList';
  33. import FeedbackDialog from '@/components/shared/feedback-dialog';
  34. import { debounce } from 'lodash';
  35. import { getUsersByRole } from '@/lib/utils';
  36.  
  37. const difficultyOptions = DIFFICULTY_OPTIONS.map((difficulty) => ({
  38.   key: difficulty.value,
  39.   value: difficulty.label,
  40. }));
  41.  
  42. export type PaperData = {
  43.   sectionId: string;
  44.   questions: {
  45.     type: string;
  46.     id: string;
  47.     status: string;
  48.     feedback: [];
  49.   }[];
  50.   actualQuestionDetails: {
  51.     type: string;
  52.     questionDetailId: string;
  53.     totalEasy: number;
  54.     totalMedium: number;
  55.     totalHard: number;
  56.     totalQuestions: number;
  57.     marksPerQuestion: number;
  58.   }[];
  59. };
  60.  
  61. function CreateQuestionPaper() {
  62.   const { t } = useTranslation();
  63.   const { id } = useParams();
  64.   const navigate = useNavigate();
  65.  
  66.   // Debug logging
  67.   console.log('CreateQuestionPaper component - id:', id);
  68.   const { trackActivity } = useActivityTracker();
  69.   const { direction } = useDirection();
  70.   const { hasPermission } = useUserRoles();
  71.   const [editQuestionPaperMutation] = useEditQuestionPaperMutation();
  72.   const [editQuestionPaperStatusMutation] = useEditQuestionPaperStatusMutation();
  73.   const [deleteQuestionPaperMutation] = useDeleteQuestionPaperMutation();
  74.   const [createQuestionPaperMutation] = useCreateQuestionPaperMutation();
  75.  
  76.   // Handle "new" case - show assessment schema selection
  77.   if (id === 'new') {
  78.     return (
  79.       <div className="space-y-4">
  80.         <Title title="Create Question Paper" />
  81.         <Card className="p-6">
  82.           <div className="text-center">
  83.             <h2 className="text-xl font-semibold mb-4">Select Assessment Schema</h2>
  84.             <p className="text-gray-600 mb-6">
  85.               To create a question paper, you need to select an assessment schema first.
  86.             </p>
  87.             <div className="space-y-4">
  88.               <Button
  89.                 onClick={() => navigate('/assessment-schema')}
  90.                 className="bg-blue-600 hover:bg-blue-700"
  91.               >
  92.                 View Assessment Schemas
  93.               </Button>
  94.               <Button
  95.                 onClick={() => navigate('/assessments')}
  96.                 variant="outline"
  97.               >
  98.                 Back to Question Papers
  99.               </Button>
  100.             </div>
  101.           </div>
  102.         </Card>
  103.       </div>
  104.     );
  105.   }
  106.  
  107.   // Queries
  108.   const {
  109.     data: usersData,
  110.     isLoading: usersLoading,
  111.     error: usersError,
  112.   } = useGetUsersByRoleNamesQuery({
  113.     roleNames: ['Content Creator', 'Reviewer'],
  114.   }, {
  115.     skip: true // Skip this query for now since it's not available on the server
  116.   });
  117.  
  118.   const {
  119.     data,
  120.     isLoading,
  121.     error: paperError,
  122.     refetch: paperRefetch,
  123.   } = useGetQuestionPaperQuery({ id: id || '' }, {
  124.     skip: !id // Only fetch if we have an ID (existing question paper)
  125.   });
  126.  
  127.   // Auto-create question paper if it doesn't exist (matching certify-combo behavior)
  128.   useEffect(() => {
  129.     if (id && !isLoading && !data && !paperError) {
  130.       console.log('[CreateQuestionPaper] Question paper not found, creating automatically...');
  131.       const createQuestionPaper = async () => {
  132.         try {
  133.           const response = await createQuestionPaperMutation({ assessmentId: id }).unwrap();
  134.           console.log('[CreateQuestionPaper] Question paper created:', response);
  135.           // Refetch to get the newly created question paper
  136.           paperRefetch();
  137.         } catch (error) {
  138.           console.error('[CreateQuestionPaper] Error creating question paper:', error);
  139.         }
  140.       };
  141.       createQuestionPaper();
  142.     }
  143.   }, [id, isLoading, data, paperError, createQuestionPaperMutation, paperRefetch]);
  144.  
  145.  
  146.   // Build filters from searchQuery state
  147.   const buildFilters = () => {
  148.     const filters: any[] = [];
  149.    
  150.     // Add subject filter
  151.     if (selectedSubject) {
  152.       filters.push({
  153.         field: 'metadata.subject',
  154.         operator: 'in',
  155.         value: [selectedSubject]
  156.       });
  157.     }
  158.    
  159.     // Add chapter filter
  160.     if (selectedChapter) {
  161.       filters.push({
  162.         field: 'metadata.chapter',
  163.         operator: 'in',
  164.         value: [selectedChapter]
  165.       });
  166.     }
  167.    
  168.     // Add difficulty filter
  169.     if (searchQuery['metadata.difficulty'] && searchQuery['metadata.difficulty'].length > 0) {
  170.       filters.push({
  171.         field: 'metadata.difficulty',
  172.         operator: 'in',
  173.         value: searchQuery['metadata.difficulty']
  174.       });
  175.     }
  176.    
  177.     // Add type filter
  178.     if (searchQuery['type'] && searchQuery['type'].length > 0) {
  179.       filters.push({
  180.         field: 'type',
  181.         operator: 'in',
  182.         value: searchQuery['type']
  183.       });
  184.     }
  185.    
  186.     // Add topic filter
  187.     if (searchQuery['metadata.topic'] && searchQuery['metadata.topic'].length > 0) {
  188.       filters.push({
  189.         field: 'metadata.topic',
  190.         operator: 'in',
  191.         value: searchQuery['metadata.topic']
  192.       });
  193.     }
  194.    
  195.     // Add subtopic filter
  196.     if (searchQuery['metadata.subTopic'] && searchQuery['metadata.subTopic'].length > 0) {
  197.       filters.push({
  198.         field: 'metadata.subTopic',
  199.         operator: 'in',
  200.         value: searchQuery['metadata.subTopic']
  201.       });
  202.     }
  203.    
  204.     console.log('[CreateQuestionPaper] Built filters:', filters);
  205.     console.log('[CreateQuestionPaper] searchQuery state:', searchQuery);
  206.     console.log('[CreateQuestionPaper] selectedSubject:', selectedSubject);
  207.     console.log('[CreateQuestionPaper] selectedChapter:', selectedChapter);
  208.    
  209.     return filters;
  210.   };
  211.  
  212.   const { data: difficultyLevelFilter, refetch } = useSearchQuestionsByFieldsQuery({
  213.     filters: buildFilters(),
  214.   });
  215.  
  216.   console.log('[CreateQuestionPaper] difficultyLevelFilter:', difficultyLevelFilter);
  217.   console.log('[CreateQuestionPaper] Questions count:', difficultyLevelFilter?.searchQuestionsByFields?.questions?.length || 0);
  218.  
  219.   // States
  220.   const [selectedSection, setSelectedSection] = useState('');
  221.   const [selectedSubject, setSelectedSubject] = useState('');
  222.   const [selectedChapter, setSelectedChapter] = useState('');
  223.   const [searchQuery, setSearchQuery] = useState<Record<string, string[] | null>>({});
  224.   const [resetFilter, setResetFilter] = useState(false);
  225.   const [checkedSubTopics, setCheckedSubTopics] = useState<Record<string, string[]>>({});
  226.   const [currentIndex, setCurrentIndex] = useState(0);
  227.   const [paperData, setPaperData] = useState<PaperData | null>(null);
  228.   const [next, setNext] = useState(false);
  229.   const [replace, setReplace] = useState(false);
  230.   const [showFeedback, setShowFeedback] = useState<string | null>(null);
  231.   const [underReview, setUnderReview] = useState(false);
  232.   const [revisionRequest, setRevisionRequest] = useState(false);
  233.   const [reviewComplete, setReviewComplete] = useState(false);
  234.   const [currSelectedQuestions, setCurrSelectedQuestions] = useState<Set<string>>(new Set());
  235.  
  236.   const visibleCards = 3;
  237.  
  238.   const questionIds = revisionRequest
  239.     ? paperData?.questions
  240.       ?.filter(
  241.         (e) => e.status !== 'approved' || (e.status === 'pending' && e.type === 'replaced'),
  242.       )
  243.       ?.map((e: { id: string }) => e.id) ?? []
  244.     : paperData?.questions?.map((e: { id: string }) => e.id) ?? [];
  245.  
  246.   const { data: finalQuestions } = useGetQuestionsByIdsQuery(questionIds, {
  247.     skip: !questionIds.length
  248.   });
  249.  
  250.   const handlePrev = () => {
  251.     if (currentIndex > 0) setCurrentIndex((prev) => prev - visibleCards);
  252.   };
  253.  
  254.   const handleNext = () => {
  255.     if (
  256.       currentIndex + visibleCards <
  257.       (data?.sections?.find(
  258.         (e: { sectionId: string }) => e.sectionId === selectedSection,
  259.       )?.actualQuestionDetails.length || 0)
  260.     )
  261.       setCurrentIndex((prev) => prev + visibleCards);
  262.   };
  263.  
  264.   const onDifficultyUpdate = (checkedOptions: string[]) => {
  265.     setSearchQuery((prev) => ({
  266.       ...prev,
  267.       'metadata.difficulty': checkedOptions,
  268.     }));
  269.   };
  270.  
  271.   const onTopicUpdate = (topicName: string, checkedOptions: string[]) => {
  272.     setCheckedSubTopics((prev) => ({
  273.       ...prev,
  274.       [topicName]: checkedOptions,
  275.     }));
  276.   };
  277.  
  278.   const onTypeUpdate = (checkedOptions: string[]) => {
  279.     setSearchQuery((prev) => ({
  280.       ...prev,
  281.       type: checkedOptions,
  282.     }));
  283.   };
  284.  
  285.   const handleSelectQuestion = (id: string, difficulty: string, type: string) => {
  286.     setPaperData((prev) => {
  287.       if (!prev) return prev;
  288.       let isSelected;
  289.       let questionDetailId;
  290.       const updatedActualQuestionDetails = prev.actualQuestionDetails.map((q) => {
  291.         if (q.type === type) {
  292.           questionDetailId = q.questionDetailId;
  293.           const updatedCounts = { ...q };
  294.           isSelected = prev.questions.some((e: { id: string }) => e.id === id);
  295.           updatedCounts.totalQuestions += isSelected ? -1 : 1;
  296.           if (difficulty === 'Easy') updatedCounts.totalEasy += isSelected ? -1 : 1;
  297.           else if (difficulty === 'Medium') updatedCounts.totalMedium += isSelected ? -1 : 1;
  298.           else if (difficulty === 'Hard') updatedCounts.totalHard += isSelected ? -1 : 1;
  299.  
  300.           return updatedCounts;
  301.         }
  302.         return q;
  303.       });
  304.       const questions = prev.questions.some((e: { id: string }) => e.id === id)
  305.         ? prev.questions.filter((q: { id: string }) => q.id !== id)
  306.         : [...prev.questions, { id, type: replace ? 'replaced' : 'original' }];
  307.  
  308.       if (!isSelected)
  309.         debouncedSave({
  310.           ...prev,
  311.           questions: questions,
  312.           actualQuestionDetails: updatedActualQuestionDetails,
  313.         });
  314.       else
  315.         debouncedDelete({
  316.           sectionId: selectedSection,
  317.           questionId: id,
  318.           type: difficulty,
  319.           questionDetailId,
  320.         });
  321.       if (replace && !isSelected) setShowFeedback('replace');
  322.       return { ...prev, questions, actualQuestionDetails: updatedActualQuestionDetails };
  323.     });
  324.   };
  325.  
  326.   const debouncedSave = useCallback(
  327.     debounce((input) => {
  328.       editQuestionPaperMutation({
  329.         id: id || '',
  330.         input: {
  331.           section: {
  332.             ...input,
  333.             actualQuestionDetails: input?.actualQuestionDetails?.map(
  334.               ({ marksPerQuestion, __typename, ...rest }) => rest,
  335.             ),
  336.           },
  337.         },
  338.       });
  339.     }, 300),
  340.     [],
  341.   );
  342.  
  343.   const debouncedDelete = useCallback(
  344.     debounce((input) => {
  345.       deleteQuestionPaperMutation({
  346.         id: id || '',
  347.         input: { ...input },
  348.       });
  349.     }, 300),
  350.     [],
  351.   );
  352.  
  353.   useEffect(() => {
  354.     if (data?.status === 'Approved') {
  355.       setNext(true);
  356.       setUnderReview(true);
  357.     } else if (data?.status === 'Review Completed') {
  358.       setNext(true);
  359.       setReviewComplete(true);
  360.     } else if (data?.status === 'Revision Requested') {
  361.       setRevisionRequest(true);
  362.       !replace && setNext(true);
  363.     }
  364.   }, [data, replace]);
  365.  
  366.   useEffect(() => {
  367.     if (data?.sections && data.sections.length > 0 && !selectedSection) {
  368.       setSelectedSection(data.sections[0].sectionId);
  369.     }
  370.   }, [data, selectedSection]);
  371.  
  372.   useEffect(() => {
  373.     if (data) {
  374.       setPaperData({
  375.         sectionId: selectedSection,
  376.         questions: data.sections?.find((e: { sectionId: string }) => e.sectionId === selectedSection)?.questions || [],
  377.         actualQuestionDetails: data.sections?.find((e: { sectionId: string }) => e.sectionId === selectedSection)?.actualQuestionDetails || [],
  378.       });
  379.     }
  380.   }, [data, selectedSection]);
  381.  
  382.   const handleSubmit = () => {
  383.     editQuestionPaperStatusMutation({
  384.       id: id || '',
  385.       input: {
  386.         status: 'Approved', // Skip review process - auto-approve
  387.       },
  388.     });
  389.   };
  390.  
  391.   if (isLoading) return <SpinnerWithText message={t('question_paper.messages.loading')} />;
  392.   if (paperError) return <SpinnerWithText message={t('question_paper.messages.error')} />;
  393.  
  394.   // Handle case where question paper exists but is empty or invalid
  395.   if (data && (!data.sections || data.sections.length === 0)) {
  396.     return (
  397.       <div className="text-center p-8">
  398.         <h2 className="text-xl font-semibold text-orange-600 mb-4">Question Paper Setup Required</h2>
  399.         <p className="text-gray-600 mb-4">
  400.           This question paper exists but doesn't have any sections configured.
  401.          Please contact an administrator to set up the question paper structure.
  402.        </p>
  403.        <div className="space-y-2">
  404.          <Button onClick={() => navigate('/assessments')} variant="blue">
  405.            Back to Question Papers
  406.          </Button>
  407.          <Button
  408.            onClick={() => window.location.reload()}
  409.            variant="outline"
  410.            className="ml-2"
  411.          >
  412.            Refresh Page
  413.          </Button>
  414.        </div>
  415.      </div>
  416.    );
  417.  }
  418.  
  419.  if (!data && !isLoading && id) {
  420.    return (
  421.      <div className="text-center p-8">
  422.        <h2 className="text-xl font-semibold text-red-600 mb-4">Question Paper Not Found</h2>
  423.        <p className="text-gray-600 mb-4">The question paper you're looking for doesn't exist or has been deleted.</p>
  424.        <Button onClick={() => navigate('/assessments')} variant="blue">
  425.          Back to Question Papers
  426.        </Button>
  427.      </div>
  428.    );
  429.  }
  430.  
  431.  return (
  432.    <div className="space-y-4">
  433.      <div className="flex justify-between items-center">
  434.        <Title title={t('assessments.select_questions')} />
  435.  
  436.        <div className="flex space-x-4">
  437.          {!next && (
  438.            <Button
  439.              className="px-4 py-2 bg-orange-100 text-orange-800 rounded-md hover:bg-orange-50 transition-colors"
  440.              disabled={replace}
  441.              onClick={() => navigate('/assessments')}
  442.            >
  443.              {t('back-2')}
  444.            </Button>
  445.          )}
  446.          <Button
  447.            className={`px-4 py-2 ${!next ? 'bg-[#006CCE]' : 'bg-[#176F4D]'
  448.              } text-white rounded-md ${!next ? 'hover:bg-blue-700' : 'hover:bg-green-700'
  449.              } transition-colors`}
  450.            onClick={() => {
  451.              if (!next) {
  452.                paperRefetch();
  453.                setNext(true);
  454.              } else handleSubmit();
  455.            }}
  456.            disabled={
  457.              (next &&
  458.                data?.sections
  459.                  ?.flatMap((e) => e.actualQuestionDetails.map((ele) => ele.totalQuestions))
  460.                  .reduce((acc, curr) => acc + curr, 0) !==
  461.                data?.sections
  462.                  ?.flatMap((e) =>
  463.                    e.section.questionDetails.map((ele) => ele.totalQuestionsNeeded),
  464.                  )
  465.                  .reduce((acc, curr) => acc + curr, 0)) ||
  466.              (next &&
  467.                revisionRequest &&
  468.                data?.sections.some((e) =>
  469.                  e.questions
  470.                    .filter((e) => e.status === 'rejected')
  471.                    .some((el) => el.feedback[el.feedback.length - 1]?.role !== 'Creator'),
  472.                ) &&
  473.                data?.sections.some((e) =>
  474.                  e.questions
  475.                    .filter((e) => e.status === 'rejected')
  476.                    .some((el) => el?.feedback.length),
  477.                )) ||
  478.              underReview ||
  479.              replace ||
  480.              reviewComplete
  481.            }
  482.          >
  483.            {next ? t('submit') : t('next')}
  484.          </Button>
  485.        </div>
  486.      </div>
  487.      {underReview && (
  488.        <p className="text-green-500 font-semibold">Question paper approved successfully!</p>
  489.      )}
  490.      {reviewComplete && (
  491.        <p className="text-green-700 font-semibold">
  492.          {t('question_paper.messages.review_success')}
  493.        </p>
  494.      )}
  495.      <div className="border p-4 rounded grid grid-cols-[1fr,2fr]">
  496.        <div className="space-y-8 mt-5">
  497.          <div>
  498.            <label className="font-semibold">{t('question_paper.labels.section_name')}</label>
  499.            <Select
  500.              value={selectedSection}
  501.              disabled={replace}
  502.              onValueChange={(e) => {
  503.                setSelectedSection(e);
  504.                setSearchQuery({});
  505.                setSelectedSubject('');
  506.                setSelectedChapter('');
  507.                setCurrSelectedQuestions(new Set());
  508.                !resetFilter && setResetFilter(true);
  509.                paperRefetch();
  510.              }}
  511.            >
  512.              <SelectTrigger className="w-60">
  513.                <SelectValue placeholder={t('question_paper.labels.choose_section')} />
  514.              </SelectTrigger>
  515.              <SelectContent>
  516.                {data?.sections?.map(
  517.                  (e: { sectionId: string; section: { sectionName: string } }, i: any) => (
  518.                    <SelectItem key={i} value={e.sectionId}>
  519.                      {e.section.sectionName}
  520.                    </SelectItem>
  521.                  ),
  522.                )}
  523.              </SelectContent>
  524.            </Select>
  525.          </div>
  526.  
  527.          <div>
  528.            <label className="font-semibold">{t('question_paper.labels.subject')}</label>
  529.            <Select
  530.              value={selectedSubject}
  531.              disabled={replace}
  532.              onValueChange={(e) => {
  533.                setSelectedSubject(e);
  534.                setSearchQuery((prev) => ({
  535.                  ...prev,
  536.                  'metadata.subject': [e],
  537.                }));
  538.                setSelectedChapter('');
  539.                setCurrSelectedQuestions(new Set());
  540.                !resetFilter && setResetFilter(true);
  541.                paperRefetch();
  542.              }}
  543.            >
  544.              <SelectTrigger className="w-60">
  545.                <SelectValue placeholder={t('question_paper.labels.choose_subject')} />
  546.              </SelectTrigger>
  547.              <SelectContent>
  548.                {data?.sections
  549.                  ?.find((e: { sectionId: string }) => e.sectionId === selectedSection)
  550.                  ?.section.subjects?.map((subject: string, i: any) => (
  551.                    <SelectItem key={i} value={subject}>
  552.                      {subject}
  553.                    </SelectItem>
  554.                  ))}
  555.              </SelectContent>
  556.            </Select>
  557.          </div>
  558.  
  559.          <div>
  560.            <label className="font-semibold">{t('question_paper.labels.chapter')}</label>
  561.            <Select
  562.              value={selectedChapter}
  563.              disabled={replace}
  564.              onValueChange={(e) => {
  565.                setSelectedChapter(e);
  566.                setSearchQuery((prev) => ({
  567.                  ...prev,
  568.                  'metadata.chapter': [e],
  569.                }));
  570.                setCurrSelectedQuestions(new Set());
  571.                !resetFilter && setResetFilter(true);
  572.                paperRefetch();
  573.              }}
  574.            >
  575.              <SelectTrigger className="w-60">
  576.                <SelectValue placeholder={t('question_paper.labels.choose_chapter')} />
  577.              </SelectTrigger>
  578.              <SelectContent>
  579.                {data?.sections
  580.                  ?.find((e: { sectionId: string }) => e.sectionId === selectedSection)
  581.                  ?.section.chapters?.map((chapter: string, i: any) => (
  582.                    <SelectItem key={i} value={chapter}>
  583.                      {chapter}
  584.                    </SelectItem>
  585.                  ))}
  586.              </SelectContent>
  587.            </Select>
  588.          </div>
  589.  
  590.          {/* <div>
  591.            <label className="font-semibold">{t('question_paper.labels.taxonomy')}</label>
  592.            <Select
  593.              value={selectedTaxonomy}
  594.              disabled={replace}
  595.              onValueChange={(e) => {
  596.                setSelectedTaxonomy(e);
  597.                setSearchQuery((prev) => ({
  598.                  ...prev,
  599.                  'advancedMetadata.taxonomy': [
  600.                    taxonomies?.taxonomies.find((tax) => tax.id === e)?.name || '',
  601.                  ],
  602.                }));
  603.                setCurrSelectedQuestions(new Set());
  604.                !resetFilter && setResetFilter(true);
  605.                paperRefetch();
  606.              }}
  607.            >
  608.              <SelectTrigger className="w-60">
  609.                <SelectValue placeholder={t('question_paper.labels.choose_taxonomy')} />
  610.              </SelectTrigger>
  611.              <SelectContent>
  612.                {taxonomies?.taxonomies?.map((taxonomy: any) => (
  613.                  <SelectItem key={taxonomy.id} value={taxonomy.id}>
  614.                    {taxonomy.name}
  615.                  </SelectItem>
  616.                ))}
  617.              </SelectContent>
  618.            </Select>
  619.          </div> */}
  620.  
  621.          <div>
  622.            <label className="font-semibold">{t('question_paper.labels.difficulty')}</label>
  623.            <CollapsibleCheckboxList
  624.              options={difficultyOptions}
  625.              onSelectionChange={onDifficultyUpdate}
  626.              disabled={replace}
  627.            />
  628.          </div>
  629.  
  630.          {/* <div>
  631.            <label className="font-semibold">{t('question_paper.labels.cognitive_level')}</label>
  632.            <CollapsibleCheckboxList
  633.              options={skills?.skills?.map((skill: any) => ({
  634.                key: skill.id,
  635.                value: skill.name,
  636.              })) || []}
  637.              onSelectionChange={onLevelUpdate}
  638.              disabled={replace}
  639.            />
  640.          </div> */}
  641.  
  642.          <div>
  643.            <label className="font-semibold">{t('question_paper.labels.question_type')}</label>
  644.            <CollapsibleCheckboxList
  645.              options={[
  646.                { key: 'multiple_choice', value: 'Multiple Choice' },
  647.                { key: 'descriptive_answer', value: 'Descriptive Answer' },
  648.              ]}
  649.              onSelectionChange={onTypeUpdate}
  650.              disabled={replace}
  651.            />
  652.          </div>
  653.  
  654.          <div>
  655.            <label className="font-semibold">{t('question_paper.labels.topics')}</label>
  656.            {data?.sections
  657.              ?.find((e: { sectionId: string }) => e.sectionId === selectedSection)
  658.              ?.section.topics?.map((topic: any) => (
  659.                <CollapsibleCheckboxList
  660.                  key={topic.name}
  661.                  title={topic.name}
  662.                  options={topic.subTopics?.map((subTopic: any) => ({
  663.                    key: subTopic.id,
  664.                    value: subTopic.name,
  665.                  })) || []}
  666.                  onSelectionChange={(checkedOptions) => onTopicUpdate(topic.name, checkedOptions)}
  667.                  disabled={replace}
  668.                />
  669.              ))}
  670.          </div>
  671.        </div>
  672.  
  673.        <div className="space-y-4">
  674.          <div className="flex flex-row justify-center">
  675.            <Questions
  676.              paperData={paperData as PaperData}
  677.              next={next}
  678.              setNext={setNext}
  679.              setReplace={setReplace}
  680.              underReview={underReview}
  681.              reviewComplete={reviewComplete}
  682.              revisionRequest={revisionRequest}
  683.              selectedSection={
  684.                data?.sections?.find(
  685.                  (e: { sectionId: string }) => e.sectionId === selectedSection,
  686.                ) || {}
  687.              }
  688.              currSelectedQuestions={currSelectedQuestions}
  689.              setCurrSelectedQuestions={setCurrSelectedQuestions}
  690.              onSelectQuestion={handleSelectQuestion}
  691.              data={difficultyLevelFilter?.searchQuestionsByFields}
  692.              questionPaper={data}
  693.              refetch={paperRefetch}
  694.            />
  695.          </div>
  696.        </div>
  697.      </div>
  698.      <FeedbackDialog
  699.        open={!!showFeedback}
  700.        onClose={() => setShowFeedback(null)}
  701.        feedback=""
  702.        onSubmit={(feedback) => {
  703.          // Handle feedback submission
  704.          setShowFeedback(null);
  705.        }}
  706.      />
  707.    </div>
  708.  );
  709. }
  710.  
  711. export default CreateQuestionPaper;
Advertisement
Add Comment
Please, Sign In to add comment