UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

1 lines 18.5 kB
{"version":3,"sources":["../src/components/StudentPerformanceDetailsModal/StudentPerformanceDetailsModal.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from 'react';\nimport { UserIcon, TrophyIcon, XCircleIcon } from '@phosphor-icons/react';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Badge from '../Badge/Badge';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport { CardAccordation } from '../Accordation/Accordation';\nimport type {\n StudentPerformanceDetailsModalProps,\n StudentPerformanceDetailsData,\n StudentPerformanceDetailsLabels,\n ActivityProgress,\n} from './types';\nimport { DEFAULT_PERFORMANCE_DETAILS_LABELS } from './types';\nimport { MetricBox } from '../shared/MetricBox';\n\n/**\n * Performance stat card with colored header and white footer\n * Used for NOTA, CORRETAS, INCORRETAS cards\n */\ninterface PerformanceStatCardProps {\n /** Icon to display */\n icon: ReactNode;\n /** Card label (e.g., \"NOTA\") */\n label: string;\n /** Main value (e.g., \"9.0\" or \"8\") */\n value: string | number;\n /** Secondary label (e.g., \"DESEMPENHO\") */\n secondaryLabel: string;\n /** Badge text (e.g., \"Acima da média\") */\n badgeText: string | null;\n /** Color variant */\n variant: 'orange' | 'green' | 'red';\n}\n\nconst STAT_CARD_COLORS = {\n orange: {\n headerBg: 'bg-warning-background',\n iconBg: 'bg-warning-300',\n valueColor: 'text-warning-600',\n secondaryLabelColor: 'text-warning-500',\n },\n green: {\n headerBg: 'bg-success-200',\n iconBg: 'bg-success-300',\n valueColor: 'text-success-700',\n secondaryLabelColor: 'text-success-600',\n },\n red: {\n headerBg: 'bg-error-100',\n iconBg: 'bg-error-500',\n valueColor: 'text-error-700',\n secondaryLabelColor: 'text-error-300',\n },\n default: {\n headerBg: 'bg-warning-background',\n iconBg: 'bg-warning-300',\n valueColor: 'text-warning-600',\n secondaryLabelColor: 'text-warning-500',\n },\n} as const;\n\n/**\n * Performance stat card component\n */\nconst PerformanceStatCard = ({\n icon,\n label,\n value,\n secondaryLabel,\n badgeText,\n variant,\n}: PerformanceStatCardProps) => {\n const colors = STAT_CARD_COLORS[variant] ?? STAT_CARD_COLORS.default;\n\n return (\n <div className=\"flex flex-col rounded-xl border border-border-50 bg-background overflow-hidden flex-1\">\n {/* Header section with colored background */}\n <div\n className={`flex flex-col items-center justify-center px-2 sm:px-3 py-2 gap-1 ${colors.headerBg}`}\n >\n <Text\n as=\"span\"\n className={`size-8 rounded-full flex items-center justify-center ${colors.iconBg}`}\n >\n {icon}\n </Text>\n <Text\n size=\"2xs\"\n weight=\"medium\"\n className=\"text-text-800 uppercase text-center leading-none\"\n >\n {label}\n </Text>\n <Text\n size=\"xl\"\n weight=\"bold\"\n className={`${colors.valueColor} text-center`}\n >\n {value}\n </Text>\n </div>\n\n {/* Footer section with white background */}\n <div className=\"flex flex-col items-center gap-2 px-2 sm:px-3 py-2\">\n <Text\n size=\"2xs\"\n weight=\"medium\"\n className={`${colors.secondaryLabelColor} uppercase text-center`}\n >\n {secondaryLabel}\n </Text>\n <Badge size=\"large\" action=\"info\">\n {badgeText || '-'}\n </Badge>\n </div>\n </div>\n );\n};\n\n/**\n * Activity progress card with expandable accordion content\n */\ninterface ActivityCardProps {\n /** Activity data */\n activity: ActivityProgress;\n /** No data message */\n noDataMessage: string;\n /** Activity progress text template */\n activityProgressText: string;\n /** Activity details unavailable message */\n activityDetailsUnavailable: string;\n}\n\n/**\n * Format activity progress text by replacing placeholders\n */\nconst formatProgressText = (\n template: string,\n correct: number,\n total: number\n): string => {\n return template\n .replace('{correct}', String(correct))\n .replace('{total}', String(total));\n};\n\nconst ActivityAccordionCard = ({\n activity,\n noDataMessage,\n activityProgressText,\n activityDetailsUnavailable,\n}: ActivityCardProps) => {\n const hasData = !activity.hasNoData && activity.totalCount > 0;\n const progressPercentage = hasData\n ? Math.min(\n 100,\n Math.max(0, (activity.correctCount / activity.totalCount) * 100)\n )\n : 0;\n\n return (\n <CardAccordation\n value={activity.id}\n className=\"bg-background rounded-xl border border-border-50\"\n triggerClassName=\"p-4\"\n contentClassName=\"px-4 pb-4\"\n trigger={\n <div className=\"flex flex-col gap-2 flex-1\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {activity.name}\n </Text>\n {hasData ? (\n <div className=\"flex flex-row items-center gap-2\">\n <div className=\"flex-1\">\n <ProgressBar\n value={progressPercentage}\n variant=\"green\"\n size=\"medium\"\n />\n </div>\n <Text\n size=\"xs\"\n weight=\"medium\"\n className=\"text-text-950 whitespace-nowrap\"\n >\n {formatProgressText(\n activityProgressText,\n activity.correctCount,\n activity.totalCount\n )}\n </Text>\n </div>\n ) : (\n <Text size=\"xs\" className=\"text-text-500\">\n {noDataMessage}\n </Text>\n )}\n </div>\n }\n >\n <Text size=\"sm\" className=\"text-text-700\">\n {activity.description || activityDetailsUnavailable}\n </Text>\n </CardAccordation>\n );\n};\n\n/**\n * Loading skeleton for the modal content\n */\nconst LoadingSkeleton = () => (\n <div className=\"flex flex-col gap-4 animate-pulse\">\n <div className=\"h-6 bg-background-200 rounded w-48\" />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2\">\n <div className=\"h-48 bg-background-200 rounded-xl\" />\n <div className=\"h-48 bg-background-200 rounded-xl\" />\n <div className=\"h-48 bg-background-200 rounded-xl\" />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n <div className=\"h-20 bg-background-200 rounded-xl\" />\n <div className=\"h-20 bg-background-200 rounded-xl\" />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2\">\n <div className=\"h-20 bg-background-200 rounded-xl\" />\n <div className=\"h-20 bg-background-200 rounded-xl\" />\n <div className=\"h-20 bg-background-200 rounded-xl\" />\n </div>\n </div>\n);\n\n/**\n * Error state component\n */\nconst ErrorContent = ({ message }: { message: string }) => (\n <div className=\"flex flex-col items-center justify-center py-8 gap-3\">\n <Text\n as=\"span\"\n className=\"size-12 rounded-full bg-error-100 flex items-center justify-center\"\n >\n <XCircleIcon size={24} className=\"text-error-700\" weight=\"fill\" />\n </Text>\n <Text size=\"md\" className=\"text-error-700 text-center\">\n {message}\n </Text>\n </div>\n);\n\n/**\n * Performance content when data is available\n */\nconst PerformanceContent = ({\n data,\n labels,\n}: {\n data: StudentPerformanceDetailsData;\n labels: StudentPerformanceDetailsLabels;\n}) => (\n <div className=\"flex flex-col gap-4\">\n {/* Student name with icon */}\n <div className=\"flex items-center gap-2 pt-2\">\n <Text\n as=\"span\"\n className=\"size-6 rounded-full bg-primary-100 flex items-center justify-center\"\n >\n <UserIcon size={14} className=\"text-primary-800\" weight=\"fill\" />\n </Text>\n <Text size=\"md\" className=\"text-text-950\">\n {data.studentName}\n </Text>\n </div>\n\n {/* Main stats row - 3 colored cards */}\n <div className=\"flex flex-col sm:flex-row gap-2 sm:gap-3\">\n {/* NOTA card */}\n <PerformanceStatCard\n icon={<TrophyIcon size={16} weight=\"fill\" className=\"text-white\" />}\n label={labels.gradeLabel}\n value={data.grade.value.toFixed(1)}\n secondaryLabel={labels.performanceTagLabel}\n badgeText={data.grade.performanceLabel}\n variant=\"orange\"\n />\n\n {/* CORRETAS card */}\n <PerformanceStatCard\n icon={<TrophyIcon size={16} weight=\"fill\" className=\"text-text-950\" />}\n label={labels.correctQuestionsLabel}\n value={data.correctQuestions.value}\n secondaryLabel={labels.bestResultLabel}\n badgeText={data.correctQuestions.bestResultTopic}\n variant=\"green\"\n />\n\n {/* INCORRETAS card */}\n <PerformanceStatCard\n icon={<XCircleIcon size={16} weight=\"fill\" className=\"text-white\" />}\n label={labels.incorrectQuestionsLabel}\n value={data.incorrectQuestions.value}\n secondaryLabel={labels.hardestTopicLabel}\n badgeText={data.incorrectQuestions.hardestTopic}\n variant=\"red\"\n />\n </div>\n\n {/* Secondary stats row */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2 sm:gap-3\">\n <MetricBox\n label={labels.activitiesLabel}\n value={data.activitiesCompleted}\n />\n <MetricBox label={labels.questionsLabel} value={data.questionsAnswered} />\n </div>\n\n {/* Tertiary stats row */}\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2 sm:gap-3\">\n <MetricBox label={labels.accessCountLabel} value={data.accessCount} />\n <MetricBox label={labels.timeOnlineLabel} value={data.timeOnline} />\n <MetricBox label={labels.lastLoginLabel} value={data.lastLogin} />\n </div>\n\n {/* Activities progress section */}\n {data.activities.length > 0 && (\n <div className=\"flex flex-col gap-4 pt-4\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {labels.activitiesProgressTitle}\n </Text>\n <div className=\"flex flex-col gap-2\">\n {data.activities.map((activity) => (\n <ActivityAccordionCard\n key={activity.id}\n activity={activity}\n noDataMessage={labels.noDataMessage}\n activityProgressText={labels.activityProgressText}\n activityDetailsUnavailable={labels.activityDetailsUnavailable}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\n/**\n * Renders the modal content based on loading, error, and data state\n */\nconst renderModalContent = (\n loading: boolean,\n error: string | null | undefined,\n data: StudentPerformanceDetailsData | null,\n labels: StudentPerformanceDetailsLabels\n): ReactNode => {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorContent message={error} />;\n }\n\n if (data) {\n return <PerformanceContent data={data} labels={labels} />;\n }\n\n return null;\n};\n\n/**\n * StudentPerformanceDetailsModal component\n *\n * Displays a modal with detailed student performance information including:\n * - Student name with profile icon\n * - Three main stat cards (grade, correct questions, incorrect questions)\n * - Five metric cards (activities, questions, access, time, last login)\n * - Expandable list of activity progress\n *\n * @example\n * ```tsx\n * <StudentPerformanceDetailsModal\n * isOpen={isModalOpen}\n * onClose={() => setIsModalOpen(false)}\n * data={{\n * studentName: 'Fernanda Rocha',\n * grade: { value: 9.0, performanceLabel: 'Acima da média' },\n * correctQuestions: { value: 8, bestResultTopic: 'Fotossíntese' },\n * incorrectQuestions: { value: 7, hardestTopic: 'Células' },\n * activitiesCompleted: 10,\n * questionsAnswered: 40,\n * accessCount: '00',\n * timeOnline: '00:00:00',\n * lastLogin: '00/00/0000 • 00:00h',\n * activities: [\n * { id: '1', name: 'Atividade 1', correctCount: 30, totalCount: 50 },\n * { id: '2', name: 'Atividade 2', correctCount: 0, totalCount: 0, hasNoData: true },\n * ],\n * }}\n * />\n * ```\n */\nexport const StudentPerformanceDetailsModal = ({\n isOpen,\n onClose,\n data,\n loading = false,\n error = null,\n labels: customLabels,\n}: StudentPerformanceDetailsModalProps) => {\n const labels = useMemo(\n () => ({ ...DEFAULT_PERFORMANCE_DETAILS_LABELS, ...customLabels }),\n [customLabels]\n );\n\n if (!data && !loading && !error) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={labels.title}\n size=\"lg\"\n contentClassName=\"max-h-[80vh] overflow-y-auto\"\n >\n {renderModalContent(loading, error, data, labels)}\n </Modal>\n );\n};\n\nexport default StudentPerformanceDetailsModal;\n"],"mappings":"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","names":[]}