analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
1 lines • 7.83 kB
Source Map (JSON)
{"version":3,"sources":["../src/components/QuestionsData/QuestionsData.tsx"],"sourcesContent":["import { HTMLAttributes } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport {\n calculateYAxisTicks,\n LegendItem,\n DataBar,\n GridLines,\n YAxis,\n type BarItemConfig,\n} from '../shared/ChartComponents';\n\n/**\n * Data structure for questions statistics.\n * Compatible with useQuestionsData hook output (hook data can be passed directly).\n */\nexport interface QuestionsDataItem {\n /** Total number of questions answered */\n total: number;\n /** Number of correct answers */\n corretas: number;\n /** Number of incorrect answers */\n incorretas: number;\n /** Number of blank (unanswered) questions */\n emBranco?: number;\n}\n\n/**\n * Props for the QuestionsData component\n */\nexport interface QuestionsDataProps extends HTMLAttributes<HTMLDivElement> {\n /** Card title */\n title?: string;\n /** Question statistics data */\n data: QuestionsDataItem;\n /** Whether to show blank questions bar */\n showEmBranco?: boolean;\n /** Maximum value for the chart scale (defaults to total) */\n maxValue?: number;\n /** Height of the chart area in pixels */\n chartHeight?: number;\n}\n\n/**\n * Color classes for bars and legend dots using design system tokens\n */\nconst BAR_COLORS = {\n total: 'bg-info-600',\n corretas: 'bg-success-200',\n incorretas: 'bg-warning-400',\n emBranco: 'bg-background-300',\n} as const;\n\n/**\n * QuestionsData component - displays a vertical bar chart showing\n * question statistics (total, correct, incorrect, and optionally blank).\n *\n * @example\n * ```tsx\n * // Basic usage with static data\n * <QuestionsData\n * title=\"Dados de questões\"\n * data={{\n * total: 120,\n * corretas: 80,\n * incorretas: 30,\n * emBranco: 10,\n * }}\n * showEmBranco\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Usage with useQuestionsData hook (direct usage - no transformation needed)\n * const fetchQuestionsData = async (filters) => {\n * const response = await api.get('/performance/questions-data', { params: filters });\n * return response.data;\n * };\n *\n * const useQuestionsData = createUseQuestionsData(fetchQuestionsData);\n *\n * function MyComponent() {\n * const { data, loading, fetchQuestionsData } = useQuestionsData();\n *\n * useEffect(() => {\n * fetchQuestionsData({ period: '1_MONTH' });\n * }, [fetchQuestionsData]);\n *\n * if (loading || !data) return <Skeleton />;\n *\n * return <QuestionsData data={data} showEmBranco />;\n * }\n * ```\n */\nexport const QuestionsData = ({\n title = 'Dados de questões',\n data,\n showEmBranco = false,\n maxValue,\n chartHeight = 180,\n className,\n ...props\n}: QuestionsDataProps) => {\n // Calculate the maximum value for the scale\n const chartMaxValue = maxValue ?? data.total;\n\n // Calculate Y-axis ticks\n const yAxisTicks = calculateYAxisTicks(chartMaxValue);\n const adjustedMaxValue = yAxisTicks[0]; // Use the nice max for calculations\n\n // Build accessible chart description\n const blankSuffix =\n showEmBranco && data.emBranco !== undefined\n ? `, ${data.emBranco} em branco`\n : '';\n const chartDescription = `Gráfico de barras mostrando ${data.total} questões respondidas, ${data.corretas} corretas, ${data.incorretas} incorretas${blankSuffix}`;\n\n // Build bar items configuration\n const barItems: BarItemConfig[] = [\n {\n key: 'total',\n label: 'Total',\n legendLabel: 'Total de questões respondidas',\n value: data.total,\n colorClass: BAR_COLORS.total,\n },\n {\n key: 'corretas',\n label: 'Corretas',\n legendLabel: 'Questões corretas',\n value: data.corretas,\n colorClass: BAR_COLORS.corretas,\n },\n {\n key: 'incorretas',\n label: 'Incorretas',\n legendLabel: 'Questões incorretas',\n value: data.incorretas,\n colorClass: BAR_COLORS.incorretas,\n },\n ];\n\n // Add blank questions bar if enabled\n if (showEmBranco && data.emBranco !== undefined) {\n barItems.push({\n key: 'emBranco',\n label: 'Em branco',\n legendLabel: 'Questões em branco',\n value: data.emBranco,\n colorClass: BAR_COLORS.emBranco,\n });\n }\n\n return (\n <div\n className={cn(\n 'flex flex-col p-5 gap-4 bg-background border border-border-50 rounded-xl',\n className\n )}\n {...props}\n >\n {/* Header */}\n <Text\n as=\"h3\"\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px]\"\n >\n {title}\n </Text>\n\n {/* Legend */}\n <div className=\"flex flex-row flex-wrap gap-x-6 gap-y-2 mb-4\">\n {barItems.map((item) => (\n <LegendItem\n key={item.key}\n color={BAR_COLORS[item.key as keyof typeof BAR_COLORS]}\n label={item.legendLabel}\n />\n ))}\n </div>\n\n {/* Chart */}\n <div className=\"flex flex-row\" aria-label={chartDescription}>\n {/* Y-Axis */}\n <YAxis ticks={yAxisTicks} chartHeight={chartHeight} />\n\n {/* Spacer between Y-axis and chart */}\n <div className=\"w-4\" />\n\n {/* Chart area with grid and bars */}\n <div className=\"flex-1 relative\">\n {/* Grid lines */}\n <GridLines ticks={yAxisTicks} chartHeight={chartHeight} />\n\n {/* Bars */}\n <div className=\"flex flex-row flex-1 gap-4 relative z-10\">\n {barItems.map((item) => (\n <DataBar\n key={item.key}\n label={item.label}\n value={item.value}\n maxValue={adjustedMaxValue}\n colorClass={item.colorClass}\n chartHeight={chartHeight}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default QuestionsData;\n"],"mappings":";;;;;;;;;;;;;;;AAmKM,cA6BE,YA7BF;AArHN,IAAM,aAAa;AAAA,EACjB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AACZ;AA4CO,IAAM,gBAAgB,CAAC;AAAA,EAC5B,QAAQ;AAAA,EACR;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,GAAG;AACL,MAA0B;AAExB,QAAM,gBAAgB,YAAY,KAAK;AAGvC,QAAM,aAAa,oBAAoB,aAAa;AACpD,QAAM,mBAAmB,WAAW,CAAC;AAGrC,QAAM,cACJ,gBAAgB,KAAK,aAAa,SAC9B,KAAK,KAAK,QAAQ,eAClB;AACN,QAAM,mBAAmB,kCAA+B,KAAK,KAAK,6BAA0B,KAAK,QAAQ,cAAc,KAAK,UAAU,cAAc,WAAW;AAG/J,QAAM,WAA4B;AAAA,IAChC;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,YAAY,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,YAAY,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,YAAY,WAAW;AAAA,IACzB;AAAA,EACF;AAGA,MAAI,gBAAgB,KAAK,aAAa,QAAW;AAC/C,aAAS,KAAK;AAAA,MACZ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,YAAY,WAAW;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAGJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAU;AAAA,YAET;AAAA;AAAA,QACH;AAAA,QAGA,oBAAC,SAAI,WAAU,gDACZ,mBAAS,IAAI,CAAC,SACb;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,WAAW,KAAK,GAA8B;AAAA,YACrD,OAAO,KAAK;AAAA;AAAA,UAFP,KAAK;AAAA,QAGZ,CACD,GACH;AAAA,QAGA,qBAAC,SAAI,WAAU,iBAAgB,cAAY,kBAEzC;AAAA,8BAAC,SAAM,OAAO,YAAY,aAA0B;AAAA,UAGpD,oBAAC,SAAI,WAAU,OAAM;AAAA,UAGrB,qBAAC,SAAI,WAAU,mBAEb;AAAA,gCAAC,aAAU,OAAO,YAAY,aAA0B;AAAA,YAGxD,oBAAC,SAAI,WAAU,4CACZ,mBAAS,IAAI,CAAC,SACb;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO,KAAK;AAAA,gBACZ,OAAO,KAAK;AAAA,gBACZ,UAAU;AAAA,gBACV,YAAY,KAAK;AAAA,gBACjB;AAAA;AAAA,cALK,KAAK;AAAA,YAMZ,CACD,GACH;AAAA,aACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,wBAAQ;","names":[]}