analytica-frontend-lib 1.6.21 → 1.6.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AccessReportModal/index.js +1 -1
- package/dist/AccessReportModal/index.mjs +1 -1
- package/dist/AccessibilityWidget/index.js +1 -1
- package/dist/AccessibilityWidget/index.mjs +1 -1
- package/dist/Accordation/index.js +1 -1
- package/dist/Accordation/index.mjs +1 -1
- package/dist/ActivitiesHistory/index.js +19 -19
- package/dist/ActivitiesHistory/index.mjs +18 -18
- package/dist/ActivityCardQuestionBanks/index.js +19 -19
- package/dist/ActivityCardQuestionBanks/index.mjs +18 -18
- package/dist/ActivityCardQuestionPreview/index.js +19 -19
- package/dist/ActivityCardQuestionPreview/index.mjs +18 -18
- package/dist/ActivityCreate/ActivityCreate.utils/index.js +3 -3
- package/dist/ActivityCreate/ActivityCreate.utils/index.mjs +2 -2
- package/dist/ActivityCreate/ActivityCreateContent/index.js +19 -19
- package/dist/ActivityCreate/ActivityCreateContent/index.mjs +18 -18
- package/dist/ActivityCreate/index.js +19 -19
- package/dist/ActivityCreate/index.mjs +18 -18
- package/dist/ActivityDetails/index.js +19 -19
- package/dist/ActivityDetails/index.mjs +18 -18
- package/dist/ActivityFilters/index.js +19 -19
- package/dist/ActivityFilters/index.mjs +18 -18
- package/dist/ActivityPageLayout/index.js +19 -19
- package/dist/ActivityPageLayout/index.mjs +18 -18
- package/dist/ActivityPreview/index.js +19 -19
- package/dist/ActivityPreview/index.mjs +18 -18
- package/dist/Alert/index.js +1 -1
- package/dist/Alert/index.mjs +1 -1
- package/dist/AlertDialog/index.js +1 -1
- package/dist/AlertDialog/index.mjs +1 -1
- package/dist/AlertManager/index.js +19 -19
- package/dist/AlertManager/index.mjs +18 -18
- package/dist/AlertManagerView/index.js +1 -1
- package/dist/AlertManagerView/index.mjs +1 -1
- package/dist/Alternative/index.js +1 -1
- package/dist/Alternative/index.mjs +1 -1
- package/dist/AnnouncementModal/index.js +1 -1
- package/dist/AnnouncementModal/index.mjs +1 -1
- package/dist/AnnouncementsGate/index.js +1 -1
- package/dist/AnnouncementsGate/index.mjs +1 -1
- package/dist/AnswerKeyModal/index.js +1 -1
- package/dist/AnswerKeyModal/index.mjs +1 -1
- package/dist/AppHeader/index.js +1 -1
- package/dist/AppHeader/index.mjs +1 -1
- package/dist/AppLayout/index.js +1 -1
- package/dist/AppLayout/index.mjs +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/Avatar/index.mjs +1 -1
- package/dist/Badge/index.js +1 -1
- package/dist/Badge/index.mjs +1 -1
- package/dist/BreadcrumbMenu/index.js +1 -1
- package/dist/BreadcrumbMenu/index.mjs +1 -1
- package/dist/Button/index.js +1 -1
- package/dist/Button/index.mjs +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/Calendar/index.mjs +1 -1
- package/dist/CalendarCard/index.js +1 -1
- package/dist/CalendarCard/index.mjs +1 -1
- package/dist/Card/index.js +1 -1
- package/dist/Card/index.mjs +1 -1
- package/dist/ChartComponents/index.js +1 -1
- package/dist/ChartComponents/index.mjs +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/index.mjs +1 -1
- package/dist/Chatbot/index.js +1 -1
- package/dist/Chatbot/index.mjs +1 -1
- package/dist/CheckBox/index.js +1 -1
- package/dist/CheckBox/index.mjs +1 -1
- package/dist/CheckBoxGroup/index.js +19 -19
- package/dist/CheckBoxGroup/index.mjs +18 -18
- package/dist/Chips/index.js +1 -1
- package/dist/Chips/index.mjs +1 -1
- package/dist/ChoroplethMap/index.js +1 -1
- package/dist/ChoroplethMap/index.mjs +1 -1
- package/dist/ColorPicker/index.js +1 -1
- package/dist/ColorPicker/index.mjs +1 -1
- package/dist/ComparatorChart/ComparatorView/index.js +1 -1
- package/dist/ComparatorChart/ComparatorView/index.mjs +1 -1
- package/dist/CorrectActivityModal/index.js +6 -6
- package/dist/CorrectActivityModal/index.mjs +5 -5
- package/dist/Divider/index.js +1 -1
- package/dist/Divider/index.mjs +1 -1
- package/dist/DownloadButton/index.js +1 -1
- package/dist/DownloadButton/index.mjs +1 -1
- package/dist/DownloadModal/index.js +1 -1
- package/dist/DownloadModal/index.mjs +1 -1
- package/dist/DragHandleButton/index.js +1 -1
- package/dist/DragHandleButton/index.mjs +1 -1
- package/dist/DropdownMenu/index.js +1 -1
- package/dist/DropdownMenu/index.mjs +1 -1
- package/dist/EmptyState/index.js +1 -1
- package/dist/EmptyState/index.mjs +1 -1
- package/dist/EnemClassroomStartModal/index.d.ts +0 -2
- package/dist/EnemClassroomStartModal/index.d.ts.map +1 -1
- package/dist/EnemClassroomStartModal/index.js +4 -6
- package/dist/EnemClassroomStartModal/index.js.map +1 -1
- package/dist/EnemClassroomStartModal/index.mjs +3 -5
- package/dist/EssayThemePicker/index.js +1 -1
- package/dist/EssayThemePicker/index.mjs +1 -1
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +19 -19
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +18 -18
- package/dist/ExamPageLayout/examsTableConfig/index.js +1 -1
- package/dist/ExamPageLayout/examsTableConfig/index.mjs +1 -1
- package/dist/ExamPageLayout/index.js +19 -19
- package/dist/ExamPageLayout/index.mjs +18 -18
- package/dist/FileAttachment/index.js +1 -1
- package/dist/FileAttachment/index.mjs +1 -1
- package/dist/FileDropzone/index.js +1 -1
- package/dist/FileDropzone/index.mjs +1 -1
- package/dist/Forum/index.js +4 -4
- package/dist/Forum/index.mjs +3 -3
- package/dist/HtmlMathRenderer/index.js +1 -1
- package/dist/HtmlMathRenderer/index.mjs +1 -1
- package/dist/IconButton/index.js +1 -1
- package/dist/IconButton/index.mjs +1 -1
- package/dist/IconRoundedButton/index.js +1 -1
- package/dist/IconRoundedButton/index.mjs +1 -1
- package/dist/ImagePreviewCard/index.js +1 -1
- package/dist/ImagePreviewCard/index.mjs +1 -1
- package/dist/ImageUpload/index.js +1 -1
- package/dist/ImageUpload/index.mjs +1 -1
- package/dist/LatexRenderer/index.js +1 -1
- package/dist/LatexRenderer/index.mjs +1 -1
- package/dist/LevelBar/index.js +1 -1
- package/dist/LevelBar/index.mjs +1 -1
- package/dist/Menu/index.js +1 -1
- package/dist/Menu/index.mjs +1 -1
- package/dist/MetricBox/index.js +1 -1
- package/dist/MetricBox/index.mjs +1 -1
- package/dist/Modal/index.js +1 -1
- package/dist/Modal/index.mjs +1 -1
- package/dist/ModalComponents/index.js +1 -1
- package/dist/ModalComponents/index.mjs +1 -1
- package/dist/MultiSearchSelect/index.js +1 -1
- package/dist/MultiSearchSelect/index.mjs +1 -1
- package/dist/MultipleChoice/index.js +1 -1
- package/dist/MultipleChoice/index.mjs +1 -1
- package/dist/NavButton/index.js +1 -1
- package/dist/NavButton/index.mjs +1 -1
- package/dist/NoSearchResult/index.js +1 -1
- package/dist/NoSearchResult/index.mjs +1 -1
- package/dist/NotFound/index.js +1 -1
- package/dist/NotFound/index.mjs +1 -1
- package/dist/NotificationCard/index.js +1 -1
- package/dist/NotificationCard/index.mjs +1 -1
- package/dist/PerformanceDistributionChart/index.js +1 -1
- package/dist/PerformanceDistributionChart/index.mjs +1 -1
- package/dist/PerformanceQuestionsData/index.js +1 -1
- package/dist/PerformanceQuestionsData/index.mjs +1 -1
- package/dist/PerformanceRanking/index.js +1 -1
- package/dist/PerformanceRanking/index.mjs +1 -1
- package/dist/PerformanceReport/index.js +1 -1
- package/dist/PerformanceReport/index.mjs +1 -1
- package/dist/PerformanceReportModal/index.js +1 -1
- package/dist/PerformanceReportModal/index.mjs +1 -1
- package/dist/PeriodSelector/index.js +1 -1
- package/dist/PeriodSelector/index.mjs +1 -1
- package/dist/PrintableUsersTable/index.js +19 -19
- package/dist/PrintableUsersTable/index.mjs +18 -18
- package/dist/ProficiencyChart/index.js +1 -1
- package/dist/ProficiencyChart/index.mjs +1 -1
- package/dist/ProgressBar/index.js +1 -1
- package/dist/ProgressBar/index.mjs +1 -1
- package/dist/ProgressCircle/index.js +1 -1
- package/dist/ProgressCircle/index.mjs +1 -1
- package/dist/ProgressModal/index.js +1 -1
- package/dist/ProgressModal/index.mjs +1 -1
- package/dist/QuestionsData/index.js +1 -1
- package/dist/QuestionsData/index.mjs +1 -1
- package/dist/QuestionsPerformanceCard/index.js +19 -19
- package/dist/QuestionsPerformanceCard/index.mjs +18 -18
- package/dist/Quiz/QuizResult/index.d.ts.map +1 -1
- package/dist/Quiz/QuizResult/index.js +4 -4
- package/dist/Quiz/QuizResult/index.mjs +3 -3
- package/dist/Quiz/TeacherFeedbackSection/index.js +3 -3
- package/dist/Quiz/TeacherFeedbackSection/index.mjs +2 -2
- package/dist/Quiz/TeacherQuestionComment/index.js +3 -3
- package/dist/Quiz/TeacherQuestionComment/index.mjs +2 -2
- package/dist/Quiz/index.d.ts.map +1 -1
- package/dist/Quiz/index.js +6 -6
- package/dist/Quiz/index.mjs +5 -5
- package/dist/Quiz/useQuizStore/index.d.ts +6 -0
- package/dist/Quiz/useQuizStore/index.d.ts.map +1 -1
- package/dist/Quiz/useQuizStore/index.js +2 -2
- package/dist/Quiz/useQuizStore/index.mjs +1 -1
- package/dist/QuizTimer/index.js +3 -3
- package/dist/QuizTimer/index.mjs +2 -2
- package/dist/Radio/index.js +1 -1
- package/dist/Radio/index.mjs +1 -1
- package/dist/RangeGauge/index.js +1 -1
- package/dist/RangeGauge/index.mjs +1 -1
- package/dist/RecommendedLessonCreate/index.js +19 -19
- package/dist/RecommendedLessonCreate/index.mjs +18 -18
- package/dist/RecommendedLessonDetails/index.js +1 -1
- package/dist/RecommendedLessonDetails/index.mjs +1 -1
- package/dist/RecommendedLessonsHistory/index.js +19 -19
- package/dist/RecommendedLessonsHistory/index.mjs +18 -18
- package/dist/ReportDetailModal/index.js +1 -1
- package/dist/ReportDetailModal/index.mjs +1 -1
- package/dist/RestrictedAccess/index.js +1 -1
- package/dist/RestrictedAccess/index.mjs +1 -1
- package/dist/RichEditor/index.js +3 -3
- package/dist/RichEditor/index.mjs +2 -2
- package/dist/{RichEditorCore-F5QPQLEK.js → RichEditorCore-NEIZKFKE.js} +2 -2
- package/dist/{RichEditorCore-F5QPQLEK.js.map → RichEditorCore-NEIZKFKE.js.map} +1 -1
- package/dist/{RichEditorCore-QZYPHNRY.mjs → RichEditorCore-TLAFZ5XG.mjs} +2 -2
- package/dist/ScoreCircle/index.js +1 -1
- package/dist/ScoreCircle/index.mjs +1 -1
- package/dist/Search/index.js +1 -1
- package/dist/Search/index.mjs +1 -1
- package/dist/SearchSelect/index.js +1 -1
- package/dist/SearchSelect/index.mjs +1 -1
- package/dist/Select/index.js +1 -1
- package/dist/Select/index.mjs +1 -1
- package/dist/SelectionButton/index.js +1 -1
- package/dist/SelectionButton/index.mjs +1 -1
- package/dist/SendActivityModal/SendActivityModal.js +19 -19
- package/dist/SendActivityModal/SendActivityModal.mjs +18 -18
- package/dist/SendActivityModal/index.js +19 -19
- package/dist/SendActivityModal/index.mjs +18 -18
- package/dist/SendLessonModal/index.js +19 -19
- package/dist/SendLessonModal/index.mjs +18 -18
- package/dist/SimpleBarChart/index.js +1 -1
- package/dist/SimpleBarChart/index.mjs +1 -1
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +19 -19
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +18 -18
- package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +1 -1
- package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +1 -1
- package/dist/SimulatedStudentSimulationsModal/index.js +19 -19
- package/dist/SimulatedStudentSimulationsModal/index.mjs +5 -5
- package/dist/SimulationsPage/index.js +19 -19
- package/dist/SimulationsPage/index.mjs +18 -18
- package/dist/Skeleton/index.js +1 -1
- package/dist/Skeleton/index.mjs +1 -1
- package/dist/StatisticsCard/index.js +1 -1
- package/dist/StatisticsCard/index.mjs +1 -1
- package/dist/Stepper/index.js +1 -1
- package/dist/Stepper/index.mjs +1 -1
- package/dist/StudentLessonProgressModal/index.js +1 -1
- package/dist/StudentLessonProgressModal/index.mjs +1 -1
- package/dist/StudentPerformanceDetailsModal/index.js +1 -1
- package/dist/StudentPerformanceDetailsModal/index.mjs +1 -1
- package/dist/StudentRanking/index.js +1 -1
- package/dist/StudentRanking/index.mjs +1 -1
- package/dist/SubjectIcons/index.js +1 -1
- package/dist/SubjectIcons/index.mjs +1 -1
- package/dist/SubjectMenuOverflow/index.js +1 -1
- package/dist/SubjectMenuOverflow/index.mjs +1 -1
- package/dist/Support/TicketModal/index.js +1 -1
- package/dist/Support/TicketModal/index.mjs +1 -1
- package/dist/Support/index.js +1 -1
- package/dist/Support/index.mjs +1 -1
- package/dist/Table/TablePagination/index.js +1 -1
- package/dist/Table/TablePagination/index.mjs +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/index.mjs +1 -1
- package/dist/TableProvider/index.js +19 -19
- package/dist/TableProvider/index.mjs +18 -18
- package/dist/Text/index.js +1 -1
- package/dist/Text/index.mjs +1 -1
- package/dist/TextArea/index.js +1 -1
- package/dist/TextArea/index.mjs +1 -1
- package/dist/ThemeToggle/index.js +1 -1
- package/dist/ThemeToggle/index.mjs +1 -1
- package/dist/TimeChart/index.js +1 -1
- package/dist/TimeChart/index.mjs +1 -1
- package/dist/TimeReport/index.js +1 -1
- package/dist/TimeReport/index.mjs +1 -1
- package/dist/Toast/Toaster/index.js +1 -1
- package/dist/Toast/Toaster/index.mjs +1 -1
- package/dist/Toast/index.js +1 -1
- package/dist/Toast/index.mjs +1 -1
- package/dist/ToggleSwitch/index.js +1 -1
- package/dist/ToggleSwitch/index.mjs +1 -1
- package/dist/TokenValidation/index.js +1 -1
- package/dist/TokenValidation/index.mjs +1 -1
- package/dist/Tooltip/index.js +1 -1
- package/dist/Tooltip/index.mjs +1 -1
- package/dist/TruncatedText/index.js +1 -1
- package/dist/TruncatedText/index.mjs +1 -1
- package/dist/TypeSelector/index.js +1 -1
- package/dist/TypeSelector/index.mjs +1 -1
- package/dist/UnifiedDraftModelPage/index.js +19 -19
- package/dist/UnifiedDraftModelPage/index.mjs +18 -18
- package/dist/UnifiedHistoryPage/index.js +19 -19
- package/dist/UnifiedHistoryPage/index.mjs +18 -18
- package/dist/VerticalBarChart/index.js +1 -1
- package/dist/VerticalBarChart/index.mjs +1 -1
- package/dist/VideoPlayer/index.js +1 -1
- package/dist/VideoPlayer/index.mjs +1 -1
- package/dist/Whiteboard/index.js +1 -1
- package/dist/Whiteboard/index.mjs +1 -1
- package/dist/{chunk-JBAGQ7L5.js → chunk-3VG5MEMY.js} +14 -13
- package/dist/chunk-3VG5MEMY.js.map +1 -0
- package/dist/{chunk-ED23HOE6.mjs → chunk-5NIU4XJY.mjs} +7 -6
- package/dist/chunk-5NIU4XJY.mjs.map +1 -0
- package/dist/{chunk-DDZDNGBU.mjs → chunk-64WGFT5E.mjs} +3 -1
- package/dist/chunk-64WGFT5E.mjs.map +1 -0
- package/dist/{chunk-QN32O3J3.js → chunk-6MK23BTK.js} +62 -62
- package/dist/{chunk-QN32O3J3.js.map → chunk-6MK23BTK.js.map} +1 -1
- package/dist/{chunk-XX4WE4TL.js → chunk-726PIA5M.js} +1 -1
- package/dist/chunk-726PIA5M.js.map +1 -0
- package/dist/{chunk-VZJKHIHN.mjs → chunk-7KALNPIG.mjs} +4 -4
- package/dist/{chunk-NQNEG4KR.mjs → chunk-7VKFZHWP.mjs} +11 -10
- package/dist/chunk-7VKFZHWP.mjs.map +1 -0
- package/dist/{chunk-GYQUB3VW.js → chunk-BBFV3NDF.js} +8 -6
- package/dist/chunk-BBFV3NDF.js.map +1 -0
- package/dist/{chunk-I3Z2BHGN.js → chunk-BJHYT75K.js} +3 -3
- package/dist/{chunk-I3Z2BHGN.js.map → chunk-BJHYT75K.js.map} +1 -1
- package/dist/{chunk-CFTQ24UT.mjs → chunk-CMYBNZ74.mjs} +2 -2
- package/dist/{chunk-R7NS5KFE.mjs → chunk-CWUNF7U6.mjs} +3 -3
- package/dist/{chunk-NAOHJW6H.mjs → chunk-DLHV7CZN.mjs} +6 -6
- package/dist/{chunk-7EXSCXPK.mjs → chunk-DMYETMZG.mjs} +2 -2
- package/dist/{chunk-RQPSA4QV.js → chunk-GQUTHDV2.js} +3 -3
- package/dist/{chunk-RQPSA4QV.js.map → chunk-GQUTHDV2.js.map} +1 -1
- package/dist/{chunk-OZWPOXVU.mjs → chunk-GVGDUCVF.mjs} +2 -2
- package/dist/{chunk-QFWY46XU.js → chunk-IMDS5NQL.js} +16 -16
- package/dist/{chunk-QFWY46XU.js.map → chunk-IMDS5NQL.js.map} +1 -1
- package/dist/{chunk-KYGFYAU7.js → chunk-JHN35HPH.js} +3 -3
- package/dist/{chunk-KYGFYAU7.js.map → chunk-JHN35HPH.js.map} +1 -1
- package/dist/{chunk-DMZTDCUF.js → chunk-JPQI2RIV.js} +3 -3
- package/dist/{chunk-DMZTDCUF.js.map → chunk-JPQI2RIV.js.map} +1 -1
- package/dist/{chunk-VVRRAF6H.js → chunk-KWH2WMV6.js} +97 -64
- package/dist/chunk-KWH2WMV6.js.map +1 -0
- package/dist/{chunk-LXX5KU3O.mjs → chunk-LMDAF6LA.mjs} +2 -2
- package/dist/{chunk-FL4W4S6J.mjs → chunk-MOSP7FR5.mjs} +1 -1
- package/dist/chunk-MOSP7FR5.mjs.map +1 -0
- package/dist/{chunk-HZXXADG4.js → chunk-NLPBW3SW.js} +44 -43
- package/dist/chunk-NLPBW3SW.js.map +1 -0
- package/dist/{chunk-TAABXGZL.mjs → chunk-O3JP6ZMQ.mjs} +2 -2
- package/dist/{chunk-MFO4S7T5.js → chunk-PJOBOBNJ.js} +3 -3
- package/dist/{chunk-MFO4S7T5.js.map → chunk-PJOBOBNJ.js.map} +1 -1
- package/dist/{chunk-CWGYVJTQ.mjs → chunk-PORNR2NU.mjs} +3 -3
- package/dist/chunk-QF3UKRIJ.js +33 -0
- package/dist/chunk-QF3UKRIJ.js.map +1 -0
- package/dist/chunk-RAHXO5YU.mjs +33 -0
- package/dist/chunk-RAHXO5YU.mjs.map +1 -0
- package/dist/{chunk-BTZANNVO.js → chunk-RQ65U5G2.js} +3 -3
- package/dist/{chunk-BTZANNVO.js.map → chunk-RQ65U5G2.js.map} +1 -1
- package/dist/{chunk-Q56I63FO.mjs → chunk-RVGLLMWG.mjs} +2 -2
- package/dist/{chunk-4MPXVPBQ.mjs → chunk-STYYUG3Q.mjs} +91 -58
- package/dist/chunk-STYYUG3Q.mjs.map +1 -0
- package/dist/{chunk-INIH23HU.js → chunk-VF6QXUX3.js} +2 -2
- package/dist/{chunk-INIH23HU.js.map → chunk-VF6QXUX3.js.map} +1 -1
- package/dist/{chunk-QWC5GC2Q.mjs → chunk-WY7V5UJN.mjs} +2 -2
- package/dist/{chunk-OCKO7T7L.js → chunk-XQAYZBLL.js} +3 -3
- package/dist/{chunk-OCKO7T7L.js.map → chunk-XQAYZBLL.js.map} +1 -1
- package/dist/{chunk-ATGLKKXI.js → chunk-Y7ZBWTD7.js} +17 -17
- package/dist/{chunk-ATGLKKXI.js.map → chunk-Y7ZBWTD7.js.map} +1 -1
- package/dist/{chunk-7XWWI5EY.js → chunk-YFIB3YNQ.js} +11 -11
- package/dist/{chunk-7XWWI5EY.js.map → chunk-YFIB3YNQ.js.map} +1 -1
- package/dist/{chunk-UCWTF336.mjs → chunk-YWGJAB63.mjs} +2 -2
- package/dist/components/Quiz/Quiz.utils.d.ts +8 -0
- package/dist/components/Quiz/Quiz.utils.d.ts.map +1 -1
- package/dist/hooks/useAppContent/index.js +19 -19
- package/dist/hooks/useAppContent/index.mjs +18 -18
- package/dist/hooks/useComparator/index.js +1 -1
- package/dist/hooks/useComparator/index.mjs +1 -1
- package/dist/hooks/useDraftAutoSave/index.js +3 -3
- package/dist/hooks/useDraftAutoSave/index.mjs +2 -2
- package/dist/index.js +19 -19
- package/dist/index.mjs +18 -18
- package/dist/types/enemClassroom/index.d.ts +29 -2
- package/dist/types/enemClassroom/index.d.ts.map +1 -1
- package/dist/types/enemClassroom/index.js +4 -2
- package/dist/types/enemClassroom/index.js.map +1 -1
- package/dist/types/enemClassroom/index.mjs +3 -1
- package/dist/types/enemClassroom.d.ts +29 -2
- package/dist/types/enemClassroom.d.ts.map +1 -1
- package/dist/types/questionTypes/index.js +1 -1
- package/dist/types/questionTypes/index.mjs +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/renderSubjectCell/index.js +1 -1
- package/dist/utils/renderSubjectCell/index.mjs +1 -1
- package/dist/utils/renderTextCell/index.js +1 -1
- package/dist/utils/renderTextCell/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-4MPXVPBQ.mjs.map +0 -1
- package/dist/chunk-DDZDNGBU.mjs.map +0 -1
- package/dist/chunk-ED23HOE6.mjs.map +0 -1
- package/dist/chunk-FL4W4S6J.mjs.map +0 -1
- package/dist/chunk-GYQUB3VW.js.map +0 -1
- package/dist/chunk-HZXXADG4.js.map +0 -1
- package/dist/chunk-JBAGQ7L5.js.map +0 -1
- package/dist/chunk-ND5M3DZA.mjs +0 -21
- package/dist/chunk-ND5M3DZA.mjs.map +0 -1
- package/dist/chunk-NQNEG4KR.mjs.map +0 -1
- package/dist/chunk-NYKBCQUO.js +0 -21
- package/dist/chunk-NYKBCQUO.js.map +0 -1
- package/dist/chunk-VVRRAF6H.js.map +0 -1
- package/dist/chunk-XX4WE4TL.js.map +0 -1
- /package/dist/{RichEditorCore-QZYPHNRY.mjs.map → RichEditorCore-TLAFZ5XG.mjs.map} +0 -0
- /package/dist/{chunk-VZJKHIHN.mjs.map → chunk-7KALNPIG.mjs.map} +0 -0
- /package/dist/{chunk-CFTQ24UT.mjs.map → chunk-CMYBNZ74.mjs.map} +0 -0
- /package/dist/{chunk-R7NS5KFE.mjs.map → chunk-CWUNF7U6.mjs.map} +0 -0
- /package/dist/{chunk-NAOHJW6H.mjs.map → chunk-DLHV7CZN.mjs.map} +0 -0
- /package/dist/{chunk-7EXSCXPK.mjs.map → chunk-DMYETMZG.mjs.map} +0 -0
- /package/dist/{chunk-OZWPOXVU.mjs.map → chunk-GVGDUCVF.mjs.map} +0 -0
- /package/dist/{chunk-LXX5KU3O.mjs.map → chunk-LMDAF6LA.mjs.map} +0 -0
- /package/dist/{chunk-TAABXGZL.mjs.map → chunk-O3JP6ZMQ.mjs.map} +0 -0
- /package/dist/{chunk-CWGYVJTQ.mjs.map → chunk-PORNR2NU.mjs.map} +0 -0
- /package/dist/{chunk-Q56I63FO.mjs.map → chunk-RVGLLMWG.mjs.map} +0 -0
- /package/dist/{chunk-QWC5GC2Q.mjs.map → chunk-WY7V5UJN.mjs.map} +0 -0
- /package/dist/{chunk-UCWTF336.mjs.map → chunk-YWGJAB63.mjs.map} +0 -0
|
@@ -9,7 +9,7 @@ var _chunkTN3AYOMVjs = require('./chunk-TN3AYOMV.js');
|
|
|
9
9
|
var _chunkFPOKJGC6js = require('./chunk-FPOKJGC6.js');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunk726PIA5Mjs = require('./chunk-726PIA5M.js');
|
|
13
13
|
|
|
14
14
|
// src/components/QuizTimer/QuizTimer.tsx
|
|
15
15
|
var _Clock = require('@phosphor-icons/react/dist/csr/Clock');
|
|
@@ -17,7 +17,7 @@ var _react = require('react');
|
|
|
17
17
|
var _jsxruntime = require('react/jsx-runtime');
|
|
18
18
|
var QuizTimer = _react.forwardRef.call(void 0,
|
|
19
19
|
({ className, ...props }, ref) => {
|
|
20
|
-
const { timeElapsed, isTimeExceeded } =
|
|
20
|
+
const { timeElapsed, isTimeExceeded } = _chunk726PIA5Mjs.useQuizStore.call(void 0, );
|
|
21
21
|
const exceeded = isTimeExceeded();
|
|
22
22
|
const formatted = _chunkFPOKJGC6js.formatTimeSpent.call(void 0, timeElapsed);
|
|
23
23
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
@@ -48,4 +48,4 @@ var QuizTimer_default = QuizTimer;
|
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
exports.QuizTimer_default = QuizTimer_default;
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
51
|
+
//# sourceMappingURL=chunk-PJOBOBNJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-PJOBOBNJ.js","../src/components/QuizTimer/QuizTimer.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACbA,6DAA0B;AAC1B,8BAA2B;AAyBrB,+CAAA;AAPN,IAAM,UAAA,EAAY,+BAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,GAAQ;AAChC,IAAA,MAAM,EAAE,WAAA,EAAa,eAAe,EAAA,EAAI,2CAAA,CAAa;AACrD,IAAA,MAAM,SAAA,EAAW,cAAA,CAAe,CAAA;AAChC,IAAA,MAAM,UAAA,EAAY,8CAAA,WAA2B,CAAA;AAE7C,IAAA,uBACE,8BAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACL,WAAA,EAAU,KAAA;AAAA,QACV,YAAA,EAAY,CAAA,gBAAA,EAAmB,SAAS,CAAA,EAAA;AAC7B,QAAA;AACT,UAAA;AACA,UAAA;AAEI,UAAA;AAEJ,UAAA;AACF,QAAA;AACI,QAAA;AAEJ,QAAA;AAAiB,0BAAA;AACR,0BAAA;AAET,QAAA;AAAA,MAAA;AACF,IAAA;AAEJ,EAAA;AACF;AAEwB;AAET;ADNoC;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-PJOBOBNJ.js","sourcesContent":[null,"import { ClockIcon } from '@phosphor-icons/react/dist/csr/Clock';\nimport { forwardRef } from 'react';\nimport { useQuizStore } from '../Quiz/useQuizStore';\nimport { formatTimeSpent } from '../../utils/activityDetailsUtils';\nimport { cn } from '../../utils/utils';\nimport Text from '../Text/Text';\n\nexport interface QuizTimerProps {\n className?: string;\n}\n\n/**\n * Progressive exam stopwatch, driven entirely by the quiz store.\n *\n * Presentational only: the counting, the pausing and the resume seed all live\n * in `useQuizStore`. Once the configured warning threshold is passed the\n * display turns red and keeps going — going over time is reported, never\n * enforced.\n */\nconst QuizTimer = forwardRef<HTMLDivElement, QuizTimerProps>(\n ({ className, ...props }, ref) => {\n const { timeElapsed, isTimeExceeded } = useQuizStore();\n const exceeded = isTimeExceeded();\n const formatted = formatTimeSpent(timeElapsed);\n\n return (\n <div\n ref={ref}\n role=\"timer\"\n aria-live=\"off\"\n aria-label={`Tempo de prova: ${formatted}${exceeded ? ' — tempo excedido' : ''}`}\n className={cn(\n 'inline-flex flex-row items-center gap-1 tabular-nums',\n 'rounded-md border px-2 py-1',\n exceeded\n ? 'bg-error-background border-error-300 text-error-700'\n : 'bg-info border-info-300 text-info-800',\n className\n )}\n {...props}\n >\n <ClockIcon size={16} weight={exceeded ? 'fill' : 'regular'} />\n <Text as=\"span\" size=\"sm\" weight=\"medium\" color=\"\">\n {formatted}\n </Text>\n </div>\n );\n }\n);\n\nQuizTimer.displayName = 'QuizTimer';\n\nexport default QuizTimer;\n"]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
QUESTION_STATUS,
|
|
6
6
|
TrueFalseStatementList,
|
|
7
7
|
getQuestionStatusBadgeConfig
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-DMYETMZG.mjs";
|
|
9
9
|
import {
|
|
10
10
|
QuestionCommentField
|
|
11
11
|
} from "./chunk-22FRIL3I.mjs";
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
import {
|
|
16
16
|
DEFAULT_IMAGE_TOLERANCE,
|
|
17
17
|
ImageAnswerView
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-CWUNF7U6.mjs";
|
|
19
19
|
import {
|
|
20
20
|
AlternativesList
|
|
21
21
|
} from "./chunk-ET3BKMTB.mjs";
|
|
@@ -1083,4 +1083,4 @@ export {
|
|
|
1083
1083
|
SimulationAnswers,
|
|
1084
1084
|
SimulationsDetailModal
|
|
1085
1085
|
};
|
|
1086
|
-
//# sourceMappingURL=chunk-
|
|
1086
|
+
//# sourceMappingURL=chunk-PORNR2NU.mjs.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/types/enemClassroom.ts
|
|
2
|
+
var ENEM_CLASSROOM_LANGUAGE = {
|
|
3
|
+
INGLES: "INGLES",
|
|
4
|
+
ESPANHOL: "ESPANHOL"
|
|
5
|
+
};
|
|
6
|
+
var ENEM_CLASSROOM_LANGUAGE_LABELS = {
|
|
7
|
+
INGLES: "Ingl\xEAs",
|
|
8
|
+
ESPANHOL: "Espanhol"
|
|
9
|
+
};
|
|
10
|
+
var ENEM_CLASSROOM_PARTICIPATION_STATUS = {
|
|
11
|
+
NOT_STARTED: "NOT_STARTED",
|
|
12
|
+
IN_PROGRESS: "IN_PROGRESS",
|
|
13
|
+
FINISHED: "FINISHED"
|
|
14
|
+
};
|
|
15
|
+
var ENEM_CLASSROOM_DEFAULT_STUDENT_TEXTS = {
|
|
16
|
+
bannerTitle: "Simula\xE7\xE3o do ENEM em sala de aula!",
|
|
17
|
+
bannerSubtitle: "",
|
|
18
|
+
bannerText: "Sua prova est\xE1 liberada.",
|
|
19
|
+
bannerItems: [],
|
|
20
|
+
bannerCta: "Toque para come\xE7ar.",
|
|
21
|
+
introVideoText: "Assista \xE0s orienta\xE7\xF5es.",
|
|
22
|
+
introHeading: "Ei, l\xEA isso antes de come\xE7ar!",
|
|
23
|
+
introWarningTitle: "S\xF3 vale em sala de aula",
|
|
24
|
+
introWarningText: "Essa simula\xE7\xE3o precisa ser feita com seu professor presente. N\xE3o vale fazer em casa!"
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
exports.ENEM_CLASSROOM_LANGUAGE = ENEM_CLASSROOM_LANGUAGE; exports.ENEM_CLASSROOM_LANGUAGE_LABELS = ENEM_CLASSROOM_LANGUAGE_LABELS; exports.ENEM_CLASSROOM_PARTICIPATION_STATUS = ENEM_CLASSROOM_PARTICIPATION_STATUS; exports.ENEM_CLASSROOM_DEFAULT_STUDENT_TEXTS = ENEM_CLASSROOM_DEFAULT_STUDENT_TEXTS;
|
|
33
|
+
//# sourceMappingURL=chunk-QF3UKRIJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-QF3UKRIJ.js","../src/types/enemClassroom.ts"],"names":[],"mappings":"AAAA;ACWO,IAAM,wBAAA,EAA0B;AAAA,EACrC,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAMO,IAAM,+BAAA,EAGT;AAAA,EACF,MAAA,EAAQ,WAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAGO,IAAM,oCAAA,EAAsC;AAAA,EACjD,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,QAAA,EAAU;AACZ,CAAA;AAsEO,IAAM,qCAAA,EAAkE;AAAA,EAC7E,WAAA,EAAa,0CAAA;AAAA,EACb,cAAA,EAAgB,EAAA;AAAA,EAChB,UAAA,EAAY,6BAAA;AAAA,EACZ,WAAA,EAAa,CAAC,CAAA;AAAA,EACd,SAAA,EAAW,wBAAA;AAAA,EACX,cAAA,EAAgB,kCAAA;AAAA,EAChB,YAAA,EAAc,qCAAA;AAAA,EACd,iBAAA,EAAmB,4BAAA;AAAA,EACnB,gBAAA,EACE;AACJ,CAAA;ADzFA;AACA;AACE;AACA;AACA;AACA;AACF,2SAAC","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-QF3UKRIJ.js","sourcesContent":[null,"/**\n * In-classroom ENEM simulation (\"Simulação do ENEM em sala de aula\").\n *\n * Shapes of the student-facing API (`/enem-classroom/*`), shared by the\n * student web app and the backoffice so both read the same vocabulary.\n */\n\n/**\n * Foreign language the student sits the exam in. Picks which of the two\n * language blocks of the exam the student receives.\n */\nexport const ENEM_CLASSROOM_LANGUAGE = {\n INGLES: 'INGLES',\n ESPANHOL: 'ESPANHOL',\n} as const;\n\nexport type EnemClassroomLanguage =\n (typeof ENEM_CLASSROOM_LANGUAGE)[keyof typeof ENEM_CLASSROOM_LANGUAGE];\n\n/** Human labels for each language, in the order the student sees them. */\nexport const ENEM_CLASSROOM_LANGUAGE_LABELS: Record<\n EnemClassroomLanguage,\n string\n> = {\n INGLES: 'Inglês',\n ESPANHOL: 'Espanhol',\n};\n\n/** Where the student stands in the exam. FINISHED is final. */\nexport const ENEM_CLASSROOM_PARTICIPATION_STATUS = {\n NOT_STARTED: 'NOT_STARTED',\n IN_PROGRESS: 'IN_PROGRESS',\n FINISHED: 'FINISHED',\n} as const;\n\nexport type EnemClassroomParticipationStatus =\n (typeof ENEM_CLASSROOM_PARTICIPATION_STATUS)[keyof typeof ENEM_CLASSROOM_PARTICIPATION_STATUS];\n\n/**\n * One socio-economic question asked before the exam starts. Free text with a\n * \"skip\" option — every field is written by the backoffice.\n */\nexport interface EnemClassroomSurveyQuestion {\n id: string;\n position: number;\n /** Short name of the step in the stepper (\"Curso\"). */\n stepLabel: string;\n /** The question itself (\"Você já tem o curso que quer fazer em mente?\"). */\n prompt: string;\n /** Label of the option that opens the text field (\"Se sim, escreva o seu curso\"). */\n inputLabel: string;\n /** Placeholder of the text field (\"Escreva o curso\"). */\n inputPlaceholder: string;\n /** Label of the option that skips the question (\"Não, ainda estou pensando\"). */\n skipLabel: string;\n}\n\n/** The exam as the student sees it before starting. */\nexport interface EnemClassroomExam {\n id: string;\n title: string;\n /** Introduction video shown on the first step; null when there is none. */\n videoUrl: string | null;\n /** How long the student has once they start. */\n durationMinutes: number;\n /**\n * Whether the student picks English or Spanish before starting (ENEM's\n * day 1). Off, the exam has no foreign-language block and the choice step\n * is not shown (day 2).\n */\n languageChoice: boolean;\n /** The texts of the panel card and of the start modal, as the backoffice wrote them. */\n studentTexts: EnemClassroomStudentTexts;\n surveyQuestions: EnemClassroomSurveyQuestion[];\n}\n\n/**\n * Every text the student sees around the exam — the panel card and the\n * introduction step of the start modal. The backoffice rewrites them per\n * exam; the API always sends the full set.\n */\nexport interface EnemClassroomStudentTexts {\n /** The card's first line. */\n bannerTitle: string;\n /** The card's second line; empty hides it. */\n bannerSubtitle: string;\n /** The card's body line. */\n bannerText: string;\n /** Bullet list under the body; empty hides it. */\n bannerItems: string[];\n /** The call to action on the card's right. */\n bannerCta: string;\n /** Above the introduction video; only shown when the exam has one. */\n introVideoText: string;\n /** The heading over the warnings of the introduction step. */\n introHeading: string;\n /** The first warning's title (the other two are fixed). */\n introWarningTitle: string;\n /** The first warning's description. */\n introWarningText: string;\n}\n\n/** The texts the API sends unless the backoffice wrote others; stories and tests start from here. */\nexport const ENEM_CLASSROOM_DEFAULT_STUDENT_TEXTS: EnemClassroomStudentTexts = {\n bannerTitle: 'Simulação do ENEM em sala de aula!',\n bannerSubtitle: '',\n bannerText: 'Sua prova está liberada.',\n bannerItems: [],\n bannerCta: 'Toque para começar.',\n introVideoText: 'Assista às orientações.',\n introHeading: 'Ei, lê isso antes de começar!',\n introWarningTitle: 'Só vale em sala de aula',\n introWarningText:\n 'Essa simulação precisa ser feita com seu professor presente. Não vale fazer em casa!',\n};\n\n/** A survey answer; `null` means the student skipped the question. */\nexport interface EnemClassroomSurveyAnswer {\n questionId: string;\n answer: string | null;\n}\n\n/** The student's own record of the exam. */\nexport interface EnemClassroomParticipation {\n status: EnemClassroomParticipationStatus;\n language: EnemClassroomLanguage | null;\n /** ISO 8601 */\n startedAt: string | null;\n /** ISO 8601. `startedAt + durationMinutes`; the exam is submitted at this point. */\n deadlineAt: string | null;\n /** The shared activity behind the exam — what drafts and answers address. */\n activityId: string;\n surveyAnswers: EnemClassroomSurveyAnswer[];\n}\n\n/** `GET /enem-classroom/current` */\nexport interface EnemClassroomCurrentResponse {\n message: string;\n data: {\n /** Null when the institution has no active exam. */\n exam: EnemClassroomExam | null;\n /** Null until the student starts. */\n participation: EnemClassroomParticipation | null;\n };\n}\n\n/** `POST /enem-classroom/exams/:id/start` body */\nexport interface EnemClassroomStartPayload {\n /** Null when the exam offers no language choice. */\n language: EnemClassroomLanguage | null;\n surveyAnswers: EnemClassroomSurveyAnswer[];\n}\n\n/** `POST /enem-classroom/exams/:id/start` response */\nexport interface EnemClassroomStartResponse {\n message: string;\n data: {\n activityId: string;\n startedAt: string;\n deadlineAt: string;\n };\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// src/types/enemClassroom.ts
|
|
2
|
+
var ENEM_CLASSROOM_LANGUAGE = {
|
|
3
|
+
INGLES: "INGLES",
|
|
4
|
+
ESPANHOL: "ESPANHOL"
|
|
5
|
+
};
|
|
6
|
+
var ENEM_CLASSROOM_LANGUAGE_LABELS = {
|
|
7
|
+
INGLES: "Ingl\xEAs",
|
|
8
|
+
ESPANHOL: "Espanhol"
|
|
9
|
+
};
|
|
10
|
+
var ENEM_CLASSROOM_PARTICIPATION_STATUS = {
|
|
11
|
+
NOT_STARTED: "NOT_STARTED",
|
|
12
|
+
IN_PROGRESS: "IN_PROGRESS",
|
|
13
|
+
FINISHED: "FINISHED"
|
|
14
|
+
};
|
|
15
|
+
var ENEM_CLASSROOM_DEFAULT_STUDENT_TEXTS = {
|
|
16
|
+
bannerTitle: "Simula\xE7\xE3o do ENEM em sala de aula!",
|
|
17
|
+
bannerSubtitle: "",
|
|
18
|
+
bannerText: "Sua prova est\xE1 liberada.",
|
|
19
|
+
bannerItems: [],
|
|
20
|
+
bannerCta: "Toque para come\xE7ar.",
|
|
21
|
+
introVideoText: "Assista \xE0s orienta\xE7\xF5es.",
|
|
22
|
+
introHeading: "Ei, l\xEA isso antes de come\xE7ar!",
|
|
23
|
+
introWarningTitle: "S\xF3 vale em sala de aula",
|
|
24
|
+
introWarningText: "Essa simula\xE7\xE3o precisa ser feita com seu professor presente. N\xE3o vale fazer em casa!"
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
ENEM_CLASSROOM_LANGUAGE,
|
|
29
|
+
ENEM_CLASSROOM_LANGUAGE_LABELS,
|
|
30
|
+
ENEM_CLASSROOM_PARTICIPATION_STATUS,
|
|
31
|
+
ENEM_CLASSROOM_DEFAULT_STUDENT_TEXTS
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=chunk-RAHXO5YU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/enemClassroom.ts"],"sourcesContent":["/**\n * In-classroom ENEM simulation (\"Simulação do ENEM em sala de aula\").\n *\n * Shapes of the student-facing API (`/enem-classroom/*`), shared by the\n * student web app and the backoffice so both read the same vocabulary.\n */\n\n/**\n * Foreign language the student sits the exam in. Picks which of the two\n * language blocks of the exam the student receives.\n */\nexport const ENEM_CLASSROOM_LANGUAGE = {\n INGLES: 'INGLES',\n ESPANHOL: 'ESPANHOL',\n} as const;\n\nexport type EnemClassroomLanguage =\n (typeof ENEM_CLASSROOM_LANGUAGE)[keyof typeof ENEM_CLASSROOM_LANGUAGE];\n\n/** Human labels for each language, in the order the student sees them. */\nexport const ENEM_CLASSROOM_LANGUAGE_LABELS: Record<\n EnemClassroomLanguage,\n string\n> = {\n INGLES: 'Inglês',\n ESPANHOL: 'Espanhol',\n};\n\n/** Where the student stands in the exam. FINISHED is final. */\nexport const ENEM_CLASSROOM_PARTICIPATION_STATUS = {\n NOT_STARTED: 'NOT_STARTED',\n IN_PROGRESS: 'IN_PROGRESS',\n FINISHED: 'FINISHED',\n} as const;\n\nexport type EnemClassroomParticipationStatus =\n (typeof ENEM_CLASSROOM_PARTICIPATION_STATUS)[keyof typeof ENEM_CLASSROOM_PARTICIPATION_STATUS];\n\n/**\n * One socio-economic question asked before the exam starts. Free text with a\n * \"skip\" option — every field is written by the backoffice.\n */\nexport interface EnemClassroomSurveyQuestion {\n id: string;\n position: number;\n /** Short name of the step in the stepper (\"Curso\"). */\n stepLabel: string;\n /** The question itself (\"Você já tem o curso que quer fazer em mente?\"). */\n prompt: string;\n /** Label of the option that opens the text field (\"Se sim, escreva o seu curso\"). */\n inputLabel: string;\n /** Placeholder of the text field (\"Escreva o curso\"). */\n inputPlaceholder: string;\n /** Label of the option that skips the question (\"Não, ainda estou pensando\"). */\n skipLabel: string;\n}\n\n/** The exam as the student sees it before starting. */\nexport interface EnemClassroomExam {\n id: string;\n title: string;\n /** Introduction video shown on the first step; null when there is none. */\n videoUrl: string | null;\n /** How long the student has once they start. */\n durationMinutes: number;\n /**\n * Whether the student picks English or Spanish before starting (ENEM's\n * day 1). Off, the exam has no foreign-language block and the choice step\n * is not shown (day 2).\n */\n languageChoice: boolean;\n /** The texts of the panel card and of the start modal, as the backoffice wrote them. */\n studentTexts: EnemClassroomStudentTexts;\n surveyQuestions: EnemClassroomSurveyQuestion[];\n}\n\n/**\n * Every text the student sees around the exam — the panel card and the\n * introduction step of the start modal. The backoffice rewrites them per\n * exam; the API always sends the full set.\n */\nexport interface EnemClassroomStudentTexts {\n /** The card's first line. */\n bannerTitle: string;\n /** The card's second line; empty hides it. */\n bannerSubtitle: string;\n /** The card's body line. */\n bannerText: string;\n /** Bullet list under the body; empty hides it. */\n bannerItems: string[];\n /** The call to action on the card's right. */\n bannerCta: string;\n /** Above the introduction video; only shown when the exam has one. */\n introVideoText: string;\n /** The heading over the warnings of the introduction step. */\n introHeading: string;\n /** The first warning's title (the other two are fixed). */\n introWarningTitle: string;\n /** The first warning's description. */\n introWarningText: string;\n}\n\n/** The texts the API sends unless the backoffice wrote others; stories and tests start from here. */\nexport const ENEM_CLASSROOM_DEFAULT_STUDENT_TEXTS: EnemClassroomStudentTexts = {\n bannerTitle: 'Simulação do ENEM em sala de aula!',\n bannerSubtitle: '',\n bannerText: 'Sua prova está liberada.',\n bannerItems: [],\n bannerCta: 'Toque para começar.',\n introVideoText: 'Assista às orientações.',\n introHeading: 'Ei, lê isso antes de começar!',\n introWarningTitle: 'Só vale em sala de aula',\n introWarningText:\n 'Essa simulação precisa ser feita com seu professor presente. Não vale fazer em casa!',\n};\n\n/** A survey answer; `null` means the student skipped the question. */\nexport interface EnemClassroomSurveyAnswer {\n questionId: string;\n answer: string | null;\n}\n\n/** The student's own record of the exam. */\nexport interface EnemClassroomParticipation {\n status: EnemClassroomParticipationStatus;\n language: EnemClassroomLanguage | null;\n /** ISO 8601 */\n startedAt: string | null;\n /** ISO 8601. `startedAt + durationMinutes`; the exam is submitted at this point. */\n deadlineAt: string | null;\n /** The shared activity behind the exam — what drafts and answers address. */\n activityId: string;\n surveyAnswers: EnemClassroomSurveyAnswer[];\n}\n\n/** `GET /enem-classroom/current` */\nexport interface EnemClassroomCurrentResponse {\n message: string;\n data: {\n /** Null when the institution has no active exam. */\n exam: EnemClassroomExam | null;\n /** Null until the student starts. */\n participation: EnemClassroomParticipation | null;\n };\n}\n\n/** `POST /enem-classroom/exams/:id/start` body */\nexport interface EnemClassroomStartPayload {\n /** Null when the exam offers no language choice. */\n language: EnemClassroomLanguage | null;\n surveyAnswers: EnemClassroomSurveyAnswer[];\n}\n\n/** `POST /enem-classroom/exams/:id/start` response */\nexport interface EnemClassroomStartResponse {\n message: string;\n data: {\n activityId: string;\n startedAt: string;\n deadlineAt: string;\n };\n}\n"],"mappings":";AAWO,IAAM,0BAA0B;AAAA,EACrC,QAAQ;AAAA,EACR,UAAU;AACZ;AAMO,IAAM,iCAGT;AAAA,EACF,QAAQ;AAAA,EACR,UAAU;AACZ;AAGO,IAAM,sCAAsC;AAAA,EACjD,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AACZ;AAsEO,IAAM,uCAAkE;AAAA,EAC7E,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa,CAAC;AAAA,EACd,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBACE;AACJ;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkIMDS5NQLjs = require('./chunk-IMDS5NQL.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
var _chunkCOMNJBRHjs = require('./chunk-COMNJBRH.js');
|
|
@@ -385,7 +385,7 @@ var TrueFalseStatementList = ({
|
|
|
385
385
|
{
|
|
386
386
|
className: _chunkTN3AYOMVjs.cn.call(void 0,
|
|
387
387
|
"flex flex-row justify-between items-center gap-2 p-2 rounded-md border",
|
|
388
|
-
canShowCorrectness && hasAnswered ?
|
|
388
|
+
canShowCorrectness && hasAnswered ? _chunkIMDS5NQLjs.getStatusStyles.call(void 0, variantCorrect) : ""
|
|
389
389
|
),
|
|
390
390
|
children: [
|
|
391
391
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkANT66KVKjs.Text_default, { as: "span", size: "sm", weight: "normal", color: "text-text-900", children: [
|
|
@@ -425,4 +425,4 @@ var TrueFalseStatementList = ({
|
|
|
425
425
|
|
|
426
426
|
|
|
427
427
|
exports.QUESTION_STATUS = QUESTION_STATUS; exports.getQuestionStatusBadgeConfig = getQuestionStatusBadgeConfig; exports.getQuestionStatusFromData = getQuestionStatusFromData; exports.convertApiResponseToCorrectionData = convertApiResponseToCorrectionData; exports.getStatusBadge = getStatusBadge; exports.FillQuestionContent = FillQuestionContent; exports.TrueFalseStatementList = TrueFalseStatementList;
|
|
428
|
-
//# sourceMappingURL=chunk-
|
|
428
|
+
//# sourceMappingURL=chunk-RQ65U5G2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-BTZANNVO.js","../src/utils/studentActivityCorrection/constants.ts","../src/utils/studentActivityCorrection/utils.ts","../src/utils/studentActivityCorrection/converter.ts","../src/utils/questionRenderer/components/index.tsx","../src/components/shared/TrueFalseStatementList.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-BTZANNVO.js","sourcesContent":[null,"/**\n * Question status enum for student activity correction\n * Maps from ANSWER_STATUS to a simpler status for UI display\n */\nexport const QUESTION_STATUS = {\n CORRETA: 'CORRETA',\n INCORRETA: 'INCORRETA',\n EM_BRANCO: 'EM_BRANCO',\n /** Reserved for future use - pending teacher evaluation for essay questions */\n PENDENTE: 'PENDENTE',\n} as const;\n\nexport type QuestionStatus =\n (typeof QUESTION_STATUS)[keyof typeof QUESTION_STATUS];\n","import { StatusBadgeConfig } from '@/types/activityDetails';\nimport {\n ANSWER_STATUS,\n QUESTION_TYPE,\n} from '../../components/Quiz/useQuizStore';\nimport { QUESTION_STATUS, type QuestionStatus } from './constants';\nimport type { CorrectionQuestionData } from './types';\n\n/**\n * Returns whether the answer is correct, incorrect, or null based on the answer status.\n * @param answerStatus - Answer status from ANSWER_STATUS enum\n * @returns Returns true for correct, false for incorrect, or null if undefined.\n */\nexport const getIsCorrect = (answerStatus: ANSWER_STATUS): boolean | null => {\n if (answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) return true;\n if (answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA) return false;\n return null;\n};\n\n/**\n * Map ANSWER_STATUS from Quiz to QUESTION_STATUS for correction modal\n * @param answerStatus - Answer status from QuestionResult\n * @returns QuestionStatus for UI display\n */\nexport const mapAnswerStatusToQuestionStatus = (\n answerStatus: ANSWER_STATUS\n): QuestionStatus => {\n switch (answerStatus) {\n case ANSWER_STATUS.RESPOSTA_CORRETA:\n return QUESTION_STATUS.CORRETA;\n case ANSWER_STATUS.RESPOSTA_INCORRETA:\n return QUESTION_STATUS.INCORRETA;\n case ANSWER_STATUS.NAO_RESPONDIDO:\n return QUESTION_STATUS.EM_BRANCO;\n case ANSWER_STATUS.PENDENTE_AVALIACAO:\n return QUESTION_STATUS.PENDENTE;\n default:\n return QUESTION_STATUS.EM_BRANCO;\n }\n};\n\n/**\n * Get question status badge configuration\n * @param status - Question status\n * @returns Badge configuration with label and colors\n */\nexport const getQuestionStatusBadgeConfig = (status: QuestionStatus) => {\n const configs: Partial<Record<QuestionStatus, StatusBadgeConfig>> = {\n [QUESTION_STATUS.CORRETA]: {\n label: 'Correta',\n bgColor: 'bg-success-background',\n textColor: 'text-success-800',\n },\n [QUESTION_STATUS.INCORRETA]: {\n label: 'Incorreta',\n bgColor: 'bg-error-background',\n textColor: 'text-error-800',\n },\n [QUESTION_STATUS.EM_BRANCO]: {\n label: 'Em branco',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n },\n [QUESTION_STATUS.PENDENTE]: {\n label: 'Pendente',\n bgColor: 'bg-warning-background',\n textColor: 'text-warning-800',\n },\n };\n\n const defaultConfig = {\n label: 'Sem categoria',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n };\n\n return configs[status] ?? defaultConfig;\n};\n\n/**\n * Check if question can be auto-validated based on options\n * All question types can be auto-validated except DISSERTATIVA (essay questions)\n * @param questionData - Correction question data\n * @returns true if can auto-validate, false otherwise\n */\nexport const canAutoValidate = (\n questionData: CorrectionQuestionData\n): boolean => {\n const { result } = questionData;\n\n // Only dissertative questions require manual evaluation\n if (result.questionType === QUESTION_TYPE.DISSERTATIVA) {\n return false;\n }\n\n return true;\n};\n\ntype Option = {\n id: string;\n option: string;\n isCorrect: boolean;\n};\n\n/**\n * Type predicate to check if an option has isCorrect defined\n */\nconst hasIsCorrect = (op: {\n id: string;\n option: string;\n isCorrect?: boolean | null;\n}): op is Option => {\n return op.isCorrect != null;\n};\n\n/**\n * Validate alternativa (single choice) question\n * Must select exactly one correct option\n */\nconst validateAlternativa = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n if (selected.size !== 1) return ANSWER_STATUS.RESPOSTA_INCORRETA;\n\n const [selectedId] = selected;\n return options.find((o) => o.id === selectedId)?.isCorrect\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate multipla escolha (multiple choice) question\n * Each option must match its correct state: selected if correct, not selected if incorrect\n */\nconst validateMultiplaEscolha = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n const allMatch = options.every((op) => selected.has(op.id) === op.isCorrect);\n\n return allMatch\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate verdadeiro/falso (true/false) question\n * Each statement is evaluated individually: if statement is true, must be selected;\n * if statement is false, must not be selected\n */\nconst validateVerdadeiroFalso = validateMultiplaEscolha;\n\nconst validators: Partial<\n Record<QUESTION_TYPE, (s: Set<string>, o: Option[]) => ANSWER_STATUS>\n> = {\n [QUESTION_TYPE.ALTERNATIVA]: validateAlternativa,\n [QUESTION_TYPE.MULTIPLA_ESCOLHA]: validateMultiplaEscolha,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: validateVerdadeiroFalso,\n};\n\n/**\n * Auto-validate question based on selected options vs correct options\n * @param questionData - Correction question data\n * @returns ANSWER_STATUS if can determine, null otherwise\n */\nexport const autoValidateQuestion = (\n questionData: CorrectionQuestionData\n): ANSWER_STATUS | null => {\n const { result } = questionData;\n\n if (!canAutoValidate(questionData) || !result.options) return null;\n\n // Filter options to only include those with isCorrect defined\n const validOptions = result.options.filter(hasIsCorrect);\n if (validOptions.length === 0) return null;\n\n const selected = new Set(\n result.selectedOptions?.map((o) => o.optionId) ?? []\n );\n\n if (selected.size === 0) return ANSWER_STATUS.NAO_RESPONDIDO;\n\n const validator = validators[result.questionType];\n if (!validator) return null;\n\n return validator(selected, validOptions);\n};\n\n/**\n * Get question status from CorrectionQuestionData\n * Maps the result's answerStatus to QuestionStatus\n * If status is PENDENTE_AVALIACAO but can auto-validate, calculates status automatically\n * @param questionData - Correction question data\n * @returns QuestionStatus for UI display\n */\nexport const getQuestionStatusFromData = (\n questionData: CorrectionQuestionData\n): QuestionStatus => {\n const { result } = questionData;\n\n // If pending evaluation, try to auto-validate\n if (\n result.answerStatus === ANSWER_STATUS.PENDENTE_AVALIACAO &&\n canAutoValidate(questionData)\n ) {\n const autoValidatedStatus = autoValidateQuestion(questionData);\n if (autoValidatedStatus !== null) {\n return mapAnswerStatusToQuestionStatus(autoValidatedStatus);\n }\n }\n\n return mapAnswerStatusToQuestionStatus(result.answerStatus);\n};\n","import type { Question } from '../../components/Quiz/useQuizStore';\nimport { QUESTION_TYPE } from '../../components/Quiz/useQuizStore';\nimport type {\n QuestionsAnswersByStudentResponse,\n StudentActivityCorrectionData,\n CorrectionQuestionData,\n QuestionCorrection,\n} from './types';\nimport { getIsCorrect } from './utils';\n\n/**\n * Build Question object from answer data\n * @param answer - Answer data from QuestionResult\n * @returns Question object in Quiz format\n */\nconst buildQuestionFromAnswer = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): Question => {\n return {\n id: answer.questionId,\n statement: answer.statement,\n questionType: answer.questionType,\n difficultyLevel: answer.difficultyLevel,\n description: '',\n examBoard: null,\n examYear: null,\n solutionExplanation: answer.solutionExplanation || null,\n additionalContent: answer.additionalContent || null,\n answer: null,\n answerStatus: answer.answerStatus,\n options: answer.options || [],\n knowledgeMatrix: answer.knowledgeMatrix.map((matrix) => ({\n areaKnowledge: matrix.areaKnowledge || {\n id: '',\n name: '',\n },\n subject: matrix.subject || {\n id: '',\n name: '',\n color: '',\n icon: '',\n },\n topic: matrix.topic || {\n id: '',\n name: '',\n },\n subtopic: matrix.subtopic || {\n id: '',\n name: '',\n },\n content: matrix.content || {\n id: '',\n name: '',\n },\n })),\n correctOptionIds:\n answer.options?.filter((opt) => opt.isCorrect).map((opt) => opt.id) || [],\n };\n};\n\n/**\n * Build correction data for a question\n *\n * Built for every question type, not just DISSERTATIVA: a teacher can comment on\n * any question. `isCorrect` stays null outside DISSERTATIVA because objective\n * questions are graded automatically and must not be re-graded by hand.\n *\n * The AI fields are carried through untouched rather than folded into\n * `teacherFeedback`. The modal needs both to do its job: the AI's text to\n * prefill the field the teacher edits, and the source to decide which tag to\n * show and whether saving turns an `IA` correction into an `IA + PROFESSOR` one.\n *\n * @param answer - Answer data from QuestionResult\n * @returns QuestionCorrection with the teacher's grade and/or comment\n */\nconst buildQuestionCorrection = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): QuestionCorrection => ({\n isCorrect:\n answer.questionType === QUESTION_TYPE.DISSERTATIVA\n ? getIsCorrect(answer.answerStatus)\n : null,\n teacherFeedback: answer.teacherFeedback || '',\n aiFeedback: answer.aiFeedback ?? null,\n aiIsCorrect: answer.aiIsCorrect ?? null,\n aiCorrectionStatus: answer.aiCorrectionStatus ?? null,\n correctionSource: answer.correctionSource ?? null,\n});\n\n/**\n * Convert a single answer to CorrectionQuestionData format\n * @param answer - Answer data from QuestionResult\n * @param index - Index of the answer (0-based)\n * @returns CorrectionQuestionData formatted for the modal\n */\nconst convertAnswerToQuestionData = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number],\n index: number\n): CorrectionQuestionData => {\n const question = buildQuestionFromAnswer(answer);\n const correction = buildQuestionCorrection(answer);\n\n return {\n question,\n result: answer,\n questionNumber: index + 1,\n correction,\n };\n};\n\n/**\n * Convert QuestionResult from API to StudentActivityCorrectionData\n * This function transforms the API response into the format expected by CorrectActivityModal\n *\n * `statistics.score` from the answers endpoint is a 0-100 percentage recomputed\n * from the per-question rows, while the students table shows the stored 0-10\n * grade. Callers that already hold the stored grade pass it as `score` so the\n * modal and the table never disagree; `null` is an explicit \"no grade yet\".\n *\n * @param apiResponse - API response with answers and statistics\n * @param studentId - Student ID\n * @param studentName - Student name\n * @param observation - Optional teacher observation\n * @param attachment - Optional attachment URL\n * @param score - Optional stored grade (0-10) that takes precedence over\n * `statistics.score`; `null` means the student has no grade yet\n * @returns StudentActivityCorrectionData formatted for the modal\n */\nexport const convertApiResponseToCorrectionData = (\n apiResponse: QuestionsAnswersByStudentResponse,\n studentId: string,\n studentName: string,\n observation?: string,\n attachment?: string,\n score?: number | null\n): StudentActivityCorrectionData => {\n const { answers, statistics } = apiResponse.data;\n\n // Calculate counts from statistics\n const correctCount = statistics.correctAnswers;\n const incorrectCount = statistics.incorrectAnswers;\n const blankCount = statistics.totalAnswered - correctCount - incorrectCount;\n\n // Convert answers to CorrectionQuestionData format\n const questions: CorrectionQuestionData[] = answers.map((answer, index) =>\n convertAnswerToQuestionData(answer, index)\n );\n\n return {\n studentId,\n studentName,\n score: score === undefined ? (statistics.score ?? null) : score,\n correctCount,\n incorrectCount,\n blankCount,\n questions,\n observation,\n attachment,\n };\n};\n","import { Fragment, useId, type ReactNode } from 'react';\nimport Badge from '../../../components/Badge/Badge';\nimport { CheckCircleIcon } from '@phosphor-icons/react/dist/csr/CheckCircle';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { cn } from '../../utils';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\nimport { stripHtmlTags } from '../../stringUtils';\nimport { OptionStatus } from '../../../enums/Options';\n\n/**\n * Get status badge component\n */\nexport const getStatusBadge = (status?: OptionStatus): ReactNode => {\n switch (status) {\n case OptionStatus.CORRECT:\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircleIcon />}>\n Resposta correta\n </Badge>\n );\n case OptionStatus.INCORRECT:\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircleIcon />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n};\n\n/**\n * Container component for question content\n */\nexport const QuestionContainer = ({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) => {\n return (\n <div\n className={cn(\n 'bg-background rounded-t-xl px-4 pt-4 pb-[80px] h-auto flex flex-col gap-4 mb-auto',\n className\n )}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Subtitle component for question sections\n */\nexport const QuestionSubTitle = ({ subTitle }: { subTitle: string }) => {\n return (\n <div className=\"px-4 pb-2 pt-6\">\n <Text size=\"md\" weight=\"bold\" color=\"text-text-950\">\n {subTitle}\n </Text>\n </div>\n );\n};\n\n/**\n * Internal component for fill in the blanks question\n * Uses useId hook to generate unique IDs\n *\n * Data structure:\n * - additionalContent: HTML text with {placeholderId} placeholders\n * - fillAnswers: Record<placeholderId, selectedOptionId> (what student chose)\n * - options: Array<{ id, option }> where id is placeholderId AND correct optionId\n * - Correctness: selectedOptionId === placeholderId means correct\n */\nexport const FillQuestionContent = ({\n question,\n result,\n}: QuestionRendererProps) => {\n const baseId = useId();\n\n // Get additionalContent (contains HTML with {placeholderId} placeholders)\n // Falls back to question.statement for older questions that may not have additionalContent\n const additionalContent =\n result?.additionalContent ||\n question.additionalContent ||\n question.statement ||\n '';\n\n // Strip HTML tags for clean text rendering\n const cleanText = stripHtmlTags(additionalContent);\n\n // Get options array (id is placeholderId, option is the text)\n const options =\n (\n result as {\n options?: Array<{ id: string; option: string; isCorrect: boolean }>;\n }\n )?.options ||\n question.options ||\n [];\n\n // Build a map of optionId -> option text for quick lookup\n const optionTextMap: Record<string, string> = {};\n options.forEach((opt) => {\n optionTextMap[opt.id] = opt.option;\n });\n\n // Get fillAnswers: Record<placeholderId, selectedOptionId>\n const fillAnswers: Record<string, string> = {};\n try {\n const resultWithFill = result as {\n fillAnswers?: Record<string, string> | null;\n };\n if (resultWithFill?.fillAnswers) {\n Object.assign(fillAnswers, resultWithFill.fillAnswers);\n } else if (result?.answer) {\n const parsed =\n typeof result.answer === 'string'\n ? JSON.parse(result.answer)\n : result.answer;\n if (typeof parsed === 'object') {\n Object.assign(fillAnswers, parsed);\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n // Helper to get option text by ID - returns null if not found\n const getOptionTextById = (optionId: string): string | null => {\n if (!optionId) return null;\n return optionTextMap[optionId] ?? null;\n };\n\n // Check if answer is correct (selectedOptionId === placeholderId)\n const isAnswerCorrect = (placeholderId: string): boolean => {\n const selectedOptionId = fillAnswers[placeholderId];\n return selectedOptionId === placeholderId;\n };\n\n // Render student answer badge\n const renderStudentBadge = (placeholderId: string) => {\n const selectedOptionId = fillAnswers[placeholderId];\n const selectedOptionText = getOptionTextById(selectedOptionId);\n const isCorrect = isAnswerCorrect(placeholderId);\n\n if (!selectedOptionId) {\n return (\n <span className=\"inline-block align-middle mx-1 my-1\">\n <Badge\n variant=\"solid\"\n action=\"error\"\n iconRight={<XCircleIcon />}\n size=\"large\"\n className=\"py-1 px-2\"\n >\n Não respondido\n </Badge>\n </span>\n );\n }\n\n // Handle case where option ID exists but text is not found\n const displayText = selectedOptionText ?? 'Opção não encontrada';\n\n return (\n <span className=\"inline-block align-middle mx-1 my-1\">\n <Badge\n variant=\"solid\"\n action={isCorrect ? 'success' : 'error'}\n iconRight={isCorrect ? <CheckCircleIcon /> : <XCircleIcon />}\n size=\"large\"\n className=\"py-1 px-2\"\n >\n {displayText}\n </Badge>\n </span>\n );\n };\n\n // Render correct answer\n const renderCorrectAnswer = (placeholderId: string) => {\n // The placeholderId IS the correct option ID\n const correctOptionText = getOptionTextById(placeholderId);\n const displayText = correctOptionText ?? '[Resposta não disponível]';\n return (\n <span className=\"inline mx-1 text-success-600 font-semibold border-b-2 border-success-600\">\n {displayText}\n </span>\n );\n };\n\n // Parse text and render with elements\n const renderTextWithElements = (text: string, isCorrectAnswer: boolean) => {\n const elements: Array<{ element: string | ReactNode; id: string }> = [];\n let lastIndex = 0;\n const nextId = () => elements.length;\n\n const regex = /\\{([a-zA-Z0-9-]+)\\}/g;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n const [fullMatch, placeholderId] = match;\n const startIndex = match.index;\n\n // Add text before placeholder\n if (startIndex > lastIndex) {\n elements.push({\n element: text.slice(lastIndex, startIndex),\n id: `${baseId}-text-${nextId()}`,\n });\n }\n\n // Add the appropriate element\n if (isCorrectAnswer) {\n elements.push({\n element: renderCorrectAnswer(placeholderId),\n id: `${baseId}-answer-sheet-${nextId()}`,\n });\n } else {\n elements.push({\n element: renderStudentBadge(placeholderId),\n id: `${baseId}-student-${nextId()}`,\n });\n }\n\n lastIndex = match.index + fullMatch.length;\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n elements.push({\n element: text.slice(lastIndex),\n id: `${baseId}-text-${nextId()}`,\n });\n }\n\n return elements;\n };\n\n if (!additionalContent) {\n return (\n <div className=\"pt-2\">\n <Text size=\"md\" color=\"text-text-600\" weight=\"normal\">\n Nenhum conteúdo disponível para esta questão.\n </Text>\n </div>\n );\n }\n\n return (\n <div className=\"pt-2 space-y-4\">\n <div className=\"space-y-2\">\n <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n Resposta do aluno:\n </Text>\n <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n <Text\n as=\"div\"\n size=\"md\"\n color=\"text-text-900\"\n weight=\"normal\"\n className=\"leading-[2.5] *:inline\"\n >\n {renderTextWithElements(cleanText, false).map((element) => (\n <Fragment key={element.id}>{element.element}</Fragment>\n ))}\n </Text>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n Gabarito:\n </Text>\n <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n <Text\n as=\"div\"\n size=\"md\"\n color=\"text-text-900\"\n weight=\"normal\"\n className=\"leading-[2.5] *:inline\"\n >\n {renderTextWithElements(cleanText, true).map((element) => (\n <Fragment key={element.id}>{element.element}</Fragment>\n ))}\n </Text>\n </div>\n </div>\n </div>\n );\n};\n","import { getStatusStyles } from '../Quiz/QuizContent';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport { getStatusBadge } from '../../utils/questionRenderer/components';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\nimport { TrueFalseEnum } from '../../enums/Quiz';\nimport { OptionStatus } from '../../enums/Options';\n\n/** One statement of a true/false question, already normalized for rendering. */\nexport interface TrueFalseStatement {\n id: string;\n /** Statement text; may contain HTML and LaTeX */\n statement: string;\n /** What the student marked. Null when the statement was left blank. */\n studentMark: TrueFalseEnum | null;\n /** Answer key: whether the statement is true. Null when unknown. */\n isTrue: boolean | null;\n}\n\nexport interface TrueFalseStatementListProps {\n readonly statements: readonly TrueFalseStatement[];\n /**\n * Whether the answer key may be revealed. False while the answer is still\n * pending evaluation or was never submitted.\n */\n readonly showCorrectness?: boolean;\n}\n\n/**\n * Read-only list of true/false statements with the student's mark and the\n * answer key.\n *\n * Shared by the activity correction modal and the simulation detail modal so\n * both read the same way. The two callers reach this from different payload\n * shapes — `QuestionResult.selectedOptions` in one, an option's `selectedValue`\n * in the other — and normalize into {@link TrueFalseStatement} before calling.\n *\n * @param props - Component props\n * @returns JSX element\n *\n * @example\n * ```tsx\n * <TrueFalseStatementList\n * statements={[{ id: '1', statement: 'A água ferve a 100°C', studentMark: TrueFalseEnum.VERDADEIRO, isTrue: true }]}\n * showCorrectness\n * />\n * ```\n */\nexport const TrueFalseStatementList = ({\n statements,\n showCorrectness = true,\n}: TrueFalseStatementListProps) => {\n // 97 = 'a' in ASCII\n const getLetterByIndex = (index: number) => String.fromCodePoint(97 + index);\n\n return (\n <div className=\"pt-2\">\n <div className=\"flex flex-col gap-3.5\">\n {statements.map((item, index) => {\n const hasAnswerKey = item.isTrue !== null;\n const hasAnswered = item.studentMark !== null;\n const studentMarkedTrue =\n item.studentMark === TrueFalseEnum.VERDADEIRO;\n\n const isStudentCorrect =\n hasAnswerKey && hasAnswered && studentMarkedTrue === item.isTrue;\n\n // Correctness is only shown once the answer key is known AND the\n // answer is no longer pending.\n const canShowCorrectness = showCorrectness && hasAnswerKey;\n const variantCorrect = isStudentCorrect\n ? OptionStatus.CORRECT\n : OptionStatus.INCORRECT;\n const correctAnswer = item.isTrue\n ? TrueFalseEnum.VERDADEIRO\n : TrueFalseEnum.FALSO;\n\n return (\n <section\n key={item.id || `statement-${index}`}\n className=\"flex flex-col gap-2\"\n >\n <div\n className={cn(\n 'flex flex-row justify-between items-center gap-2 p-2 rounded-md border',\n canShowCorrectness && hasAnswered\n ? getStatusStyles(variantCorrect)\n : ''\n )}\n >\n <Text as=\"span\" size=\"sm\" weight=\"normal\" color=\"text-text-900\">\n {getLetterByIndex(index).concat(') ')}\n <HtmlMathRenderer content={item.statement} inline />\n </Text>\n\n {canShowCorrectness && hasAnswered && (\n <div className=\"flex-shrink-0\">\n {getStatusBadge(variantCorrect)}\n </div>\n )}\n </div>\n\n {canShowCorrectness && (\n <span className=\"flex flex-row gap-2 items-center flex-wrap\">\n {hasAnswered ? (\n <>\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n Resposta selecionada: {item.studentMark}\n </Text>\n {!isStudentCorrect && (\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n | Resposta correta: {correctAnswer}\n </Text>\n )}\n </>\n ) : (\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n Não respondida | Resposta correta: {correctAnswer}\n </Text>\n )}\n </span>\n )}\n </section>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default TrueFalseStatementList;\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-RQ65U5G2.js","../src/utils/studentActivityCorrection/constants.ts","../src/utils/studentActivityCorrection/utils.ts","../src/utils/studentActivityCorrection/converter.ts","../src/utils/questionRenderer/components/index.tsx","../src/components/shared/TrueFalseStatementList.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-RQ65U5G2.js","sourcesContent":[null,"/**\n * Question status enum for student activity correction\n * Maps from ANSWER_STATUS to a simpler status for UI display\n */\nexport const QUESTION_STATUS = {\n CORRETA: 'CORRETA',\n INCORRETA: 'INCORRETA',\n EM_BRANCO: 'EM_BRANCO',\n /** Reserved for future use - pending teacher evaluation for essay questions */\n PENDENTE: 'PENDENTE',\n} as const;\n\nexport type QuestionStatus =\n (typeof QUESTION_STATUS)[keyof typeof QUESTION_STATUS];\n","import { StatusBadgeConfig } from '@/types/activityDetails';\nimport {\n ANSWER_STATUS,\n QUESTION_TYPE,\n} from '../../components/Quiz/useQuizStore';\nimport { QUESTION_STATUS, type QuestionStatus } from './constants';\nimport type { CorrectionQuestionData } from './types';\n\n/**\n * Returns whether the answer is correct, incorrect, or null based on the answer status.\n * @param answerStatus - Answer status from ANSWER_STATUS enum\n * @returns Returns true for correct, false for incorrect, or null if undefined.\n */\nexport const getIsCorrect = (answerStatus: ANSWER_STATUS): boolean | null => {\n if (answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) return true;\n if (answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA) return false;\n return null;\n};\n\n/**\n * Map ANSWER_STATUS from Quiz to QUESTION_STATUS for correction modal\n * @param answerStatus - Answer status from QuestionResult\n * @returns QuestionStatus for UI display\n */\nexport const mapAnswerStatusToQuestionStatus = (\n answerStatus: ANSWER_STATUS\n): QuestionStatus => {\n switch (answerStatus) {\n case ANSWER_STATUS.RESPOSTA_CORRETA:\n return QUESTION_STATUS.CORRETA;\n case ANSWER_STATUS.RESPOSTA_INCORRETA:\n return QUESTION_STATUS.INCORRETA;\n case ANSWER_STATUS.NAO_RESPONDIDO:\n return QUESTION_STATUS.EM_BRANCO;\n case ANSWER_STATUS.PENDENTE_AVALIACAO:\n return QUESTION_STATUS.PENDENTE;\n default:\n return QUESTION_STATUS.EM_BRANCO;\n }\n};\n\n/**\n * Get question status badge configuration\n * @param status - Question status\n * @returns Badge configuration with label and colors\n */\nexport const getQuestionStatusBadgeConfig = (status: QuestionStatus) => {\n const configs: Partial<Record<QuestionStatus, StatusBadgeConfig>> = {\n [QUESTION_STATUS.CORRETA]: {\n label: 'Correta',\n bgColor: 'bg-success-background',\n textColor: 'text-success-800',\n },\n [QUESTION_STATUS.INCORRETA]: {\n label: 'Incorreta',\n bgColor: 'bg-error-background',\n textColor: 'text-error-800',\n },\n [QUESTION_STATUS.EM_BRANCO]: {\n label: 'Em branco',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n },\n [QUESTION_STATUS.PENDENTE]: {\n label: 'Pendente',\n bgColor: 'bg-warning-background',\n textColor: 'text-warning-800',\n },\n };\n\n const defaultConfig = {\n label: 'Sem categoria',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n };\n\n return configs[status] ?? defaultConfig;\n};\n\n/**\n * Check if question can be auto-validated based on options\n * All question types can be auto-validated except DISSERTATIVA (essay questions)\n * @param questionData - Correction question data\n * @returns true if can auto-validate, false otherwise\n */\nexport const canAutoValidate = (\n questionData: CorrectionQuestionData\n): boolean => {\n const { result } = questionData;\n\n // Only dissertative questions require manual evaluation\n if (result.questionType === QUESTION_TYPE.DISSERTATIVA) {\n return false;\n }\n\n return true;\n};\n\ntype Option = {\n id: string;\n option: string;\n isCorrect: boolean;\n};\n\n/**\n * Type predicate to check if an option has isCorrect defined\n */\nconst hasIsCorrect = (op: {\n id: string;\n option: string;\n isCorrect?: boolean | null;\n}): op is Option => {\n return op.isCorrect != null;\n};\n\n/**\n * Validate alternativa (single choice) question\n * Must select exactly one correct option\n */\nconst validateAlternativa = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n if (selected.size !== 1) return ANSWER_STATUS.RESPOSTA_INCORRETA;\n\n const [selectedId] = selected;\n return options.find((o) => o.id === selectedId)?.isCorrect\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate multipla escolha (multiple choice) question\n * Each option must match its correct state: selected if correct, not selected if incorrect\n */\nconst validateMultiplaEscolha = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n const allMatch = options.every((op) => selected.has(op.id) === op.isCorrect);\n\n return allMatch\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate verdadeiro/falso (true/false) question\n * Each statement is evaluated individually: if statement is true, must be selected;\n * if statement is false, must not be selected\n */\nconst validateVerdadeiroFalso = validateMultiplaEscolha;\n\nconst validators: Partial<\n Record<QUESTION_TYPE, (s: Set<string>, o: Option[]) => ANSWER_STATUS>\n> = {\n [QUESTION_TYPE.ALTERNATIVA]: validateAlternativa,\n [QUESTION_TYPE.MULTIPLA_ESCOLHA]: validateMultiplaEscolha,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: validateVerdadeiroFalso,\n};\n\n/**\n * Auto-validate question based on selected options vs correct options\n * @param questionData - Correction question data\n * @returns ANSWER_STATUS if can determine, null otherwise\n */\nexport const autoValidateQuestion = (\n questionData: CorrectionQuestionData\n): ANSWER_STATUS | null => {\n const { result } = questionData;\n\n if (!canAutoValidate(questionData) || !result.options) return null;\n\n // Filter options to only include those with isCorrect defined\n const validOptions = result.options.filter(hasIsCorrect);\n if (validOptions.length === 0) return null;\n\n const selected = new Set(\n result.selectedOptions?.map((o) => o.optionId) ?? []\n );\n\n if (selected.size === 0) return ANSWER_STATUS.NAO_RESPONDIDO;\n\n const validator = validators[result.questionType];\n if (!validator) return null;\n\n return validator(selected, validOptions);\n};\n\n/**\n * Get question status from CorrectionQuestionData\n * Maps the result's answerStatus to QuestionStatus\n * If status is PENDENTE_AVALIACAO but can auto-validate, calculates status automatically\n * @param questionData - Correction question data\n * @returns QuestionStatus for UI display\n */\nexport const getQuestionStatusFromData = (\n questionData: CorrectionQuestionData\n): QuestionStatus => {\n const { result } = questionData;\n\n // If pending evaluation, try to auto-validate\n if (\n result.answerStatus === ANSWER_STATUS.PENDENTE_AVALIACAO &&\n canAutoValidate(questionData)\n ) {\n const autoValidatedStatus = autoValidateQuestion(questionData);\n if (autoValidatedStatus !== null) {\n return mapAnswerStatusToQuestionStatus(autoValidatedStatus);\n }\n }\n\n return mapAnswerStatusToQuestionStatus(result.answerStatus);\n};\n","import type { Question } from '../../components/Quiz/useQuizStore';\nimport { QUESTION_TYPE } from '../../components/Quiz/useQuizStore';\nimport type {\n QuestionsAnswersByStudentResponse,\n StudentActivityCorrectionData,\n CorrectionQuestionData,\n QuestionCorrection,\n} from './types';\nimport { getIsCorrect } from './utils';\n\n/**\n * Build Question object from answer data\n * @param answer - Answer data from QuestionResult\n * @returns Question object in Quiz format\n */\nconst buildQuestionFromAnswer = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): Question => {\n return {\n id: answer.questionId,\n statement: answer.statement,\n questionType: answer.questionType,\n difficultyLevel: answer.difficultyLevel,\n description: '',\n examBoard: null,\n examYear: null,\n solutionExplanation: answer.solutionExplanation || null,\n additionalContent: answer.additionalContent || null,\n answer: null,\n answerStatus: answer.answerStatus,\n options: answer.options || [],\n knowledgeMatrix: answer.knowledgeMatrix.map((matrix) => ({\n areaKnowledge: matrix.areaKnowledge || {\n id: '',\n name: '',\n },\n subject: matrix.subject || {\n id: '',\n name: '',\n color: '',\n icon: '',\n },\n topic: matrix.topic || {\n id: '',\n name: '',\n },\n subtopic: matrix.subtopic || {\n id: '',\n name: '',\n },\n content: matrix.content || {\n id: '',\n name: '',\n },\n })),\n correctOptionIds:\n answer.options?.filter((opt) => opt.isCorrect).map((opt) => opt.id) || [],\n };\n};\n\n/**\n * Build correction data for a question\n *\n * Built for every question type, not just DISSERTATIVA: a teacher can comment on\n * any question. `isCorrect` stays null outside DISSERTATIVA because objective\n * questions are graded automatically and must not be re-graded by hand.\n *\n * The AI fields are carried through untouched rather than folded into\n * `teacherFeedback`. The modal needs both to do its job: the AI's text to\n * prefill the field the teacher edits, and the source to decide which tag to\n * show and whether saving turns an `IA` correction into an `IA + PROFESSOR` one.\n *\n * @param answer - Answer data from QuestionResult\n * @returns QuestionCorrection with the teacher's grade and/or comment\n */\nconst buildQuestionCorrection = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): QuestionCorrection => ({\n isCorrect:\n answer.questionType === QUESTION_TYPE.DISSERTATIVA\n ? getIsCorrect(answer.answerStatus)\n : null,\n teacherFeedback: answer.teacherFeedback || '',\n aiFeedback: answer.aiFeedback ?? null,\n aiIsCorrect: answer.aiIsCorrect ?? null,\n aiCorrectionStatus: answer.aiCorrectionStatus ?? null,\n correctionSource: answer.correctionSource ?? null,\n});\n\n/**\n * Convert a single answer to CorrectionQuestionData format\n * @param answer - Answer data from QuestionResult\n * @param index - Index of the answer (0-based)\n * @returns CorrectionQuestionData formatted for the modal\n */\nconst convertAnswerToQuestionData = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number],\n index: number\n): CorrectionQuestionData => {\n const question = buildQuestionFromAnswer(answer);\n const correction = buildQuestionCorrection(answer);\n\n return {\n question,\n result: answer,\n questionNumber: index + 1,\n correction,\n };\n};\n\n/**\n * Convert QuestionResult from API to StudentActivityCorrectionData\n * This function transforms the API response into the format expected by CorrectActivityModal\n *\n * `statistics.score` from the answers endpoint is a 0-100 percentage recomputed\n * from the per-question rows, while the students table shows the stored 0-10\n * grade. Callers that already hold the stored grade pass it as `score` so the\n * modal and the table never disagree; `null` is an explicit \"no grade yet\".\n *\n * @param apiResponse - API response with answers and statistics\n * @param studentId - Student ID\n * @param studentName - Student name\n * @param observation - Optional teacher observation\n * @param attachment - Optional attachment URL\n * @param score - Optional stored grade (0-10) that takes precedence over\n * `statistics.score`; `null` means the student has no grade yet\n * @returns StudentActivityCorrectionData formatted for the modal\n */\nexport const convertApiResponseToCorrectionData = (\n apiResponse: QuestionsAnswersByStudentResponse,\n studentId: string,\n studentName: string,\n observation?: string,\n attachment?: string,\n score?: number | null\n): StudentActivityCorrectionData => {\n const { answers, statistics } = apiResponse.data;\n\n // Calculate counts from statistics\n const correctCount = statistics.correctAnswers;\n const incorrectCount = statistics.incorrectAnswers;\n const blankCount = statistics.totalAnswered - correctCount - incorrectCount;\n\n // Convert answers to CorrectionQuestionData format\n const questions: CorrectionQuestionData[] = answers.map((answer, index) =>\n convertAnswerToQuestionData(answer, index)\n );\n\n return {\n studentId,\n studentName,\n score: score === undefined ? (statistics.score ?? null) : score,\n correctCount,\n incorrectCount,\n blankCount,\n questions,\n observation,\n attachment,\n };\n};\n","import { Fragment, useId, type ReactNode } from 'react';\nimport Badge from '../../../components/Badge/Badge';\nimport { CheckCircleIcon } from '@phosphor-icons/react/dist/csr/CheckCircle';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { cn } from '../../utils';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\nimport { stripHtmlTags } from '../../stringUtils';\nimport { OptionStatus } from '../../../enums/Options';\n\n/**\n * Get status badge component\n */\nexport const getStatusBadge = (status?: OptionStatus): ReactNode => {\n switch (status) {\n case OptionStatus.CORRECT:\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircleIcon />}>\n Resposta correta\n </Badge>\n );\n case OptionStatus.INCORRECT:\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircleIcon />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n};\n\n/**\n * Container component for question content\n */\nexport const QuestionContainer = ({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) => {\n return (\n <div\n className={cn(\n 'bg-background rounded-t-xl px-4 pt-4 pb-[80px] h-auto flex flex-col gap-4 mb-auto',\n className\n )}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Subtitle component for question sections\n */\nexport const QuestionSubTitle = ({ subTitle }: { subTitle: string }) => {\n return (\n <div className=\"px-4 pb-2 pt-6\">\n <Text size=\"md\" weight=\"bold\" color=\"text-text-950\">\n {subTitle}\n </Text>\n </div>\n );\n};\n\n/**\n * Internal component for fill in the blanks question\n * Uses useId hook to generate unique IDs\n *\n * Data structure:\n * - additionalContent: HTML text with {placeholderId} placeholders\n * - fillAnswers: Record<placeholderId, selectedOptionId> (what student chose)\n * - options: Array<{ id, option }> where id is placeholderId AND correct optionId\n * - Correctness: selectedOptionId === placeholderId means correct\n */\nexport const FillQuestionContent = ({\n question,\n result,\n}: QuestionRendererProps) => {\n const baseId = useId();\n\n // Get additionalContent (contains HTML with {placeholderId} placeholders)\n // Falls back to question.statement for older questions that may not have additionalContent\n const additionalContent =\n result?.additionalContent ||\n question.additionalContent ||\n question.statement ||\n '';\n\n // Strip HTML tags for clean text rendering\n const cleanText = stripHtmlTags(additionalContent);\n\n // Get options array (id is placeholderId, option is the text)\n const options =\n (\n result as {\n options?: Array<{ id: string; option: string; isCorrect: boolean }>;\n }\n )?.options ||\n question.options ||\n [];\n\n // Build a map of optionId -> option text for quick lookup\n const optionTextMap: Record<string, string> = {};\n options.forEach((opt) => {\n optionTextMap[opt.id] = opt.option;\n });\n\n // Get fillAnswers: Record<placeholderId, selectedOptionId>\n const fillAnswers: Record<string, string> = {};\n try {\n const resultWithFill = result as {\n fillAnswers?: Record<string, string> | null;\n };\n if (resultWithFill?.fillAnswers) {\n Object.assign(fillAnswers, resultWithFill.fillAnswers);\n } else if (result?.answer) {\n const parsed =\n typeof result.answer === 'string'\n ? JSON.parse(result.answer)\n : result.answer;\n if (typeof parsed === 'object') {\n Object.assign(fillAnswers, parsed);\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n // Helper to get option text by ID - returns null if not found\n const getOptionTextById = (optionId: string): string | null => {\n if (!optionId) return null;\n return optionTextMap[optionId] ?? null;\n };\n\n // Check if answer is correct (selectedOptionId === placeholderId)\n const isAnswerCorrect = (placeholderId: string): boolean => {\n const selectedOptionId = fillAnswers[placeholderId];\n return selectedOptionId === placeholderId;\n };\n\n // Render student answer badge\n const renderStudentBadge = (placeholderId: string) => {\n const selectedOptionId = fillAnswers[placeholderId];\n const selectedOptionText = getOptionTextById(selectedOptionId);\n const isCorrect = isAnswerCorrect(placeholderId);\n\n if (!selectedOptionId) {\n return (\n <span className=\"inline-block align-middle mx-1 my-1\">\n <Badge\n variant=\"solid\"\n action=\"error\"\n iconRight={<XCircleIcon />}\n size=\"large\"\n className=\"py-1 px-2\"\n >\n Não respondido\n </Badge>\n </span>\n );\n }\n\n // Handle case where option ID exists but text is not found\n const displayText = selectedOptionText ?? 'Opção não encontrada';\n\n return (\n <span className=\"inline-block align-middle mx-1 my-1\">\n <Badge\n variant=\"solid\"\n action={isCorrect ? 'success' : 'error'}\n iconRight={isCorrect ? <CheckCircleIcon /> : <XCircleIcon />}\n size=\"large\"\n className=\"py-1 px-2\"\n >\n {displayText}\n </Badge>\n </span>\n );\n };\n\n // Render correct answer\n const renderCorrectAnswer = (placeholderId: string) => {\n // The placeholderId IS the correct option ID\n const correctOptionText = getOptionTextById(placeholderId);\n const displayText = correctOptionText ?? '[Resposta não disponível]';\n return (\n <span className=\"inline mx-1 text-success-600 font-semibold border-b-2 border-success-600\">\n {displayText}\n </span>\n );\n };\n\n // Parse text and render with elements\n const renderTextWithElements = (text: string, isCorrectAnswer: boolean) => {\n const elements: Array<{ element: string | ReactNode; id: string }> = [];\n let lastIndex = 0;\n const nextId = () => elements.length;\n\n const regex = /\\{([a-zA-Z0-9-]+)\\}/g;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n const [fullMatch, placeholderId] = match;\n const startIndex = match.index;\n\n // Add text before placeholder\n if (startIndex > lastIndex) {\n elements.push({\n element: text.slice(lastIndex, startIndex),\n id: `${baseId}-text-${nextId()}`,\n });\n }\n\n // Add the appropriate element\n if (isCorrectAnswer) {\n elements.push({\n element: renderCorrectAnswer(placeholderId),\n id: `${baseId}-answer-sheet-${nextId()}`,\n });\n } else {\n elements.push({\n element: renderStudentBadge(placeholderId),\n id: `${baseId}-student-${nextId()}`,\n });\n }\n\n lastIndex = match.index + fullMatch.length;\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n elements.push({\n element: text.slice(lastIndex),\n id: `${baseId}-text-${nextId()}`,\n });\n }\n\n return elements;\n };\n\n if (!additionalContent) {\n return (\n <div className=\"pt-2\">\n <Text size=\"md\" color=\"text-text-600\" weight=\"normal\">\n Nenhum conteúdo disponível para esta questão.\n </Text>\n </div>\n );\n }\n\n return (\n <div className=\"pt-2 space-y-4\">\n <div className=\"space-y-2\">\n <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n Resposta do aluno:\n </Text>\n <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n <Text\n as=\"div\"\n size=\"md\"\n color=\"text-text-900\"\n weight=\"normal\"\n className=\"leading-[2.5] *:inline\"\n >\n {renderTextWithElements(cleanText, false).map((element) => (\n <Fragment key={element.id}>{element.element}</Fragment>\n ))}\n </Text>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n Gabarito:\n </Text>\n <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n <Text\n as=\"div\"\n size=\"md\"\n color=\"text-text-900\"\n weight=\"normal\"\n className=\"leading-[2.5] *:inline\"\n >\n {renderTextWithElements(cleanText, true).map((element) => (\n <Fragment key={element.id}>{element.element}</Fragment>\n ))}\n </Text>\n </div>\n </div>\n </div>\n );\n};\n","import { getStatusStyles } from '../Quiz/QuizContent';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport { getStatusBadge } from '../../utils/questionRenderer/components';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\nimport { TrueFalseEnum } from '../../enums/Quiz';\nimport { OptionStatus } from '../../enums/Options';\n\n/** One statement of a true/false question, already normalized for rendering. */\nexport interface TrueFalseStatement {\n id: string;\n /** Statement text; may contain HTML and LaTeX */\n statement: string;\n /** What the student marked. Null when the statement was left blank. */\n studentMark: TrueFalseEnum | null;\n /** Answer key: whether the statement is true. Null when unknown. */\n isTrue: boolean | null;\n}\n\nexport interface TrueFalseStatementListProps {\n readonly statements: readonly TrueFalseStatement[];\n /**\n * Whether the answer key may be revealed. False while the answer is still\n * pending evaluation or was never submitted.\n */\n readonly showCorrectness?: boolean;\n}\n\n/**\n * Read-only list of true/false statements with the student's mark and the\n * answer key.\n *\n * Shared by the activity correction modal and the simulation detail modal so\n * both read the same way. The two callers reach this from different payload\n * shapes — `QuestionResult.selectedOptions` in one, an option's `selectedValue`\n * in the other — and normalize into {@link TrueFalseStatement} before calling.\n *\n * @param props - Component props\n * @returns JSX element\n *\n * @example\n * ```tsx\n * <TrueFalseStatementList\n * statements={[{ id: '1', statement: 'A água ferve a 100°C', studentMark: TrueFalseEnum.VERDADEIRO, isTrue: true }]}\n * showCorrectness\n * />\n * ```\n */\nexport const TrueFalseStatementList = ({\n statements,\n showCorrectness = true,\n}: TrueFalseStatementListProps) => {\n // 97 = 'a' in ASCII\n const getLetterByIndex = (index: number) => String.fromCodePoint(97 + index);\n\n return (\n <div className=\"pt-2\">\n <div className=\"flex flex-col gap-3.5\">\n {statements.map((item, index) => {\n const hasAnswerKey = item.isTrue !== null;\n const hasAnswered = item.studentMark !== null;\n const studentMarkedTrue =\n item.studentMark === TrueFalseEnum.VERDADEIRO;\n\n const isStudentCorrect =\n hasAnswerKey && hasAnswered && studentMarkedTrue === item.isTrue;\n\n // Correctness is only shown once the answer key is known AND the\n // answer is no longer pending.\n const canShowCorrectness = showCorrectness && hasAnswerKey;\n const variantCorrect = isStudentCorrect\n ? OptionStatus.CORRECT\n : OptionStatus.INCORRECT;\n const correctAnswer = item.isTrue\n ? TrueFalseEnum.VERDADEIRO\n : TrueFalseEnum.FALSO;\n\n return (\n <section\n key={item.id || `statement-${index}`}\n className=\"flex flex-col gap-2\"\n >\n <div\n className={cn(\n 'flex flex-row justify-between items-center gap-2 p-2 rounded-md border',\n canShowCorrectness && hasAnswered\n ? getStatusStyles(variantCorrect)\n : ''\n )}\n >\n <Text as=\"span\" size=\"sm\" weight=\"normal\" color=\"text-text-900\">\n {getLetterByIndex(index).concat(') ')}\n <HtmlMathRenderer content={item.statement} inline />\n </Text>\n\n {canShowCorrectness && hasAnswered && (\n <div className=\"flex-shrink-0\">\n {getStatusBadge(variantCorrect)}\n </div>\n )}\n </div>\n\n {canShowCorrectness && (\n <span className=\"flex flex-row gap-2 items-center flex-wrap\">\n {hasAnswered ? (\n <>\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n Resposta selecionada: {item.studentMark}\n </Text>\n {!isStudentCorrect && (\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n | Resposta correta: {correctAnswer}\n </Text>\n )}\n </>\n ) : (\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n Não respondida | Resposta correta: {correctAnswer}\n </Text>\n )}\n </span>\n )}\n </section>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default TrueFalseStatementList;\n"]}
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
} from "./chunk-53ICLDGS.mjs";
|
|
13
13
|
import {
|
|
14
14
|
useQuizStore
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-MOSP7FR5.mjs";
|
|
16
16
|
|
|
17
17
|
// src/components/Quiz/TeacherQuestionComment.tsx
|
|
18
18
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -79,4 +79,4 @@ export {
|
|
|
79
79
|
TeacherQuestionComment,
|
|
80
80
|
TeacherQuestionComment_default
|
|
81
81
|
};
|
|
82
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-RVGLLMWG.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ENEM_CLASSROOM_LANGUAGE,
|
|
3
3
|
ENEM_CLASSROOM_LANGUAGE_LABELS
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-RAHXO5YU.mjs";
|
|
5
5
|
import {
|
|
6
6
|
VideoPlayer_default
|
|
7
7
|
} from "./chunk-JEHWNNJI.mjs";
|
|
@@ -56,12 +56,11 @@ var survey_university_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA
|
|
|
56
56
|
|
|
57
57
|
// src/components/EnemClassroomStartModal/EnemClassroomStartModal.tsx
|
|
58
58
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
59
|
-
var
|
|
60
|
-
var INTRO_WARNINGS = [
|
|
59
|
+
var buildIntroWarnings = (texts) => [
|
|
61
60
|
{
|
|
62
61
|
icon: warning_classroom_default,
|
|
63
|
-
title:
|
|
64
|
-
description:
|
|
62
|
+
title: texts.introWarningTitle,
|
|
63
|
+
description: texts.introWarningText
|
|
65
64
|
},
|
|
66
65
|
{
|
|
67
66
|
icon: warning_timer_default,
|
|
@@ -83,7 +82,7 @@ var SURVEY_ILLUSTRATIONS = [
|
|
|
83
82
|
survey_university_default
|
|
84
83
|
];
|
|
85
84
|
var CARD_CLASSES = "rounded-xl border border-border-50 bg-background shadow-soft-shadow-1";
|
|
86
|
-
var GRADIENT_CTA_CLASSES = "bg-[linear-gradient(270deg,#B21FF6_0%,#F95493_100%)] hover:opacity-90 transition-opacity";
|
|
85
|
+
var GRADIENT_CTA_CLASSES = "bg-[linear-gradient(270deg,#B21FF6_0%,#F95493_100%)] border-0 hover:opacity-90 transition-opacity";
|
|
87
86
|
var OptionCard = ({
|
|
88
87
|
name,
|
|
89
88
|
value,
|
|
@@ -188,6 +187,7 @@ var EnemClassroomStartModal = ({
|
|
|
188
187
|
[steps]
|
|
189
188
|
);
|
|
190
189
|
const currentStep = steps[step] ?? steps[INTRO_STEP];
|
|
190
|
+
const hasPinnedVideo = currentStep.kind === "intro" && Boolean(exam.videoUrl);
|
|
191
191
|
const currentQuestion = currentStep.kind === "survey" ? currentStep.question : null;
|
|
192
192
|
const canGoNext = currentStep.kind === "language" ? language !== null : currentQuestion !== null && isSurveyAnswerComplete(answers[currentQuestion.id]);
|
|
193
193
|
const updateAnswer = useCallback(
|
|
@@ -210,55 +210,86 @@ var EnemClassroomStartModal = ({
|
|
|
210
210
|
})
|
|
211
211
|
});
|
|
212
212
|
}, [exam.languageChoice, language, surveyQuestions, answers, onStart]);
|
|
213
|
-
const renderIntroStep = () => /* @__PURE__ */ jsxs(
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
213
|
+
const renderIntroStep = () => /* @__PURE__ */ jsxs(
|
|
214
|
+
"div",
|
|
215
|
+
{
|
|
216
|
+
className: "flex flex-col gap-6 min-h-0",
|
|
217
|
+
"data-testid": "enem-classroom-intro",
|
|
218
|
+
children: [
|
|
219
|
+
exam.videoUrl && /* @__PURE__ */ jsx(
|
|
220
|
+
Text_default,
|
|
221
|
+
{
|
|
222
|
+
size: "md",
|
|
223
|
+
weight: "semibold",
|
|
224
|
+
className: "text-text-950",
|
|
225
|
+
"data-testid": "enem-classroom-intro-video-text",
|
|
226
|
+
children: exam.studentTexts.introVideoText
|
|
227
|
+
}
|
|
228
|
+
),
|
|
229
|
+
exam.videoUrl && /* @__PURE__ */ jsx(
|
|
230
|
+
VideoPlayer_default,
|
|
231
|
+
{
|
|
232
|
+
src: exam.videoUrl,
|
|
233
|
+
title: exam.title,
|
|
234
|
+
hideHeader: true,
|
|
235
|
+
className: "w-full rounded-xl overflow-hidden flex-none",
|
|
236
|
+
autoSave: false
|
|
237
|
+
}
|
|
238
|
+
),
|
|
239
|
+
/* @__PURE__ */ jsxs(
|
|
240
|
+
"div",
|
|
241
|
+
{
|
|
242
|
+
className: cn(
|
|
243
|
+
"flex flex-col gap-4",
|
|
244
|
+
hasPinnedVideo && "flex-1 min-h-0 overflow-y-auto"
|
|
239
245
|
),
|
|
240
|
-
|
|
241
|
-
/* @__PURE__ */ jsx(Text_default, { size: "
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
246
|
+
children: [
|
|
247
|
+
/* @__PURE__ */ jsx(Text_default, { size: "lg", weight: "bold", className: "text-text-950", children: exam.studentTexts.introHeading }),
|
|
248
|
+
buildIntroWarnings(exam.studentTexts).map(
|
|
249
|
+
({ icon, title, description }) => /* @__PURE__ */ jsxs(
|
|
250
|
+
"div",
|
|
251
|
+
{
|
|
252
|
+
className: cn(
|
|
253
|
+
CARD_CLASSES,
|
|
254
|
+
"flex flex-row gap-4 items-start p-4"
|
|
255
|
+
),
|
|
256
|
+
children: [
|
|
257
|
+
/* @__PURE__ */ jsx(
|
|
258
|
+
"img",
|
|
259
|
+
{
|
|
260
|
+
src: icon,
|
|
261
|
+
alt: "",
|
|
262
|
+
"aria-hidden": true,
|
|
263
|
+
className: "flex-shrink-0 w-10 h-10"
|
|
264
|
+
}
|
|
265
|
+
),
|
|
266
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
267
|
+
/* @__PURE__ */ jsx(Text_default, { size: "md", weight: "bold", className: "text-text-950", children: title }),
|
|
268
|
+
/* @__PURE__ */ jsx(Text_default, { size: "sm", className: "text-text-600", children: description })
|
|
269
|
+
] })
|
|
270
|
+
]
|
|
271
|
+
},
|
|
272
|
+
title
|
|
273
|
+
)
|
|
274
|
+
)
|
|
275
|
+
]
|
|
276
|
+
}
|
|
277
|
+
),
|
|
278
|
+
/* @__PURE__ */ jsx(
|
|
279
|
+
Button_default,
|
|
280
|
+
{
|
|
281
|
+
size: "large",
|
|
282
|
+
variant: "solid",
|
|
283
|
+
action: "primary",
|
|
284
|
+
className: cn("w-full flex-none", GRADIENT_CTA_CLASSES),
|
|
285
|
+
onClick: () => setStep(FIRST_CHOICE_STEP),
|
|
286
|
+
"data-testid": "enem-classroom-intro-continue",
|
|
287
|
+
children: "Estou em sala. Quero come\xE7ar!"
|
|
288
|
+
}
|
|
289
|
+
)
|
|
290
|
+
]
|
|
291
|
+
}
|
|
292
|
+
);
|
|
262
293
|
const renderLanguageStep = () => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", "data-testid": "enem-classroom-language", children: [
|
|
263
294
|
/* @__PURE__ */ jsx(
|
|
264
295
|
Text_default,
|
|
@@ -469,10 +500,13 @@ var EnemClassroomStartModal = ({
|
|
|
469
500
|
{
|
|
470
501
|
isOpen,
|
|
471
502
|
onClose,
|
|
472
|
-
title: showStepper ?
|
|
503
|
+
title: showStepper ? exam.title : /* @__PURE__ */ jsx("span", { className: "sr-only", children: exam.title }),
|
|
473
504
|
size: "lg",
|
|
474
505
|
footer,
|
|
475
|
-
contentClassName:
|
|
506
|
+
contentClassName: cn(
|
|
507
|
+
"flex flex-col gap-6",
|
|
508
|
+
hasPinnedVideo && "overflow-hidden"
|
|
509
|
+
),
|
|
476
510
|
children: [
|
|
477
511
|
showStepper && /* @__PURE__ */ jsx(Stepper_default, { steps: stepperSteps, currentStep: step, size: "small" }),
|
|
478
512
|
renderStepContent()
|
|
@@ -483,7 +517,6 @@ var EnemClassroomStartModal = ({
|
|
|
483
517
|
var EnemClassroomStartModal_default = EnemClassroomStartModal;
|
|
484
518
|
|
|
485
519
|
export {
|
|
486
|
-
ENEM_CLASSROOM_MODAL_TITLE,
|
|
487
520
|
EnemClassroomStartModal_default
|
|
488
521
|
};
|
|
489
|
-
//# sourceMappingURL=chunk-
|
|
522
|
+
//# sourceMappingURL=chunk-STYYUG3Q.mjs.map
|