UNPKG

analytica-frontend-lib

Version:

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

359 lines (332 loc) 14.7 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _chunkIWCIL24Pjs = require('./chunk-IWCIL24P.js'); var _chunkHN2HFYUOjs = require('./chunk-HN2HFYUO.js'); var _chunkNEDUOGWUjs = require('./chunk-NEDUOGWU.js'); var _chunkMIEC42PLjs = require('./chunk-MIEC42PL.js'); var _chunkCMUIZOUVjs = require('./chunk-CMUIZOUV.js'); var _chunkTCLRDUMFjs = require('./chunk-TCLRDUMF.js'); var _chunkANT66KVKjs = require('./chunk-ANT66KVK.js'); var _chunkTN3AYOMVjs = require('./chunk-TN3AYOMV.js'); // src/components/StudentLessonProgressModal/StudentLessonProgressModal.tsx var _react = require('react'); var _react3 = require('@phosphor-icons/react'); var _CaretRight = require('@phosphor-icons/react/dist/csr/CaretRight'); var _jsxruntime = require('react/jsx-runtime'); var ContentAccordionItem = ({ item, noDataMessage }) => { const hasNoData = item.progress === 0 && !item.isCompleted; return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center justify-between p-4 border-t border-border-50", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-950", children: item.content.name }), hasNoData ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-500", children: noDataMessage }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", weight: "medium", className: "text-text-500 whitespace-nowrap", children: [ Math.round(item.progress), "%" ] } ) ] }); }; var SubtopicAccordionItem = ({ item, noDataMessage }) => { const [isExpanded, setIsExpanded] = _react.useState.call(void 0, false); const hasChildren = item.contents && item.contents.length > 0; const hasNoData = item.status === "no_data"; return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col", children: [ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "button", { type: "button", onClick: () => hasChildren && setIsExpanded(!isExpanded), disabled: !hasChildren, className: _chunkTN3AYOMVjs.cn.call(void 0, "w-full flex items-center justify-between gap-3 p-4 text-left transition-colors duration-200", "focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-inset rounded-xl", "border-t border-border-50", hasChildren && "cursor-pointer hover:bg-background-50", !hasChildren && "cursor-default" ), "aria-expanded": hasChildren ? isExpanded : void 0, children: [ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center justify-between flex-1 min-w-0", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "medium", className: "text-text-950", children: item.subtopic.name }), !hasNoData && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", weight: "medium", className: "text-text-500 whitespace-nowrap", children: [ Math.round(item.progress), "%" ] } ) ] }), hasChildren && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretRight.CaretRightIcon, { size: 20, className: _chunkTN3AYOMVjs.cn.call(void 0, "transition-transform duration-200 flex-shrink-0 text-text-700", isExpanded ? "rotate-90" : "rotate-0" ) } ) ] } ), hasChildren && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { "data-testid": `accordion-content-subtopic-${item.subtopic.id}`, "data-expanded": isExpanded, className: _chunkTN3AYOMVjs.cn.call(void 0, "transition-all duration-300 ease-in-out overflow-hidden", isExpanded ? "max-h-[2000px] opacity-100" : "max-h-0 opacity-0" ), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "pl-4", children: item.contents.map((content) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentAccordionItem, { item: content, noDataMessage }, content.content.id )) }) } ) ] }); }; var TopicAccordionItem = ({ item, noDataMessage }) => { const [isExpanded, setIsExpanded] = _react.useState.call(void 0, false); const hasChildren = item.subtopics && item.subtopics.length > 0; const hasNoData = item.status === "no_data"; return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col", children: [ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "button", { type: "button", onClick: () => hasChildren && setIsExpanded(!isExpanded), disabled: !hasChildren, className: _chunkTN3AYOMVjs.cn.call(void 0, "w-full flex items-center justify-between gap-3 p-4 text-left transition-colors duration-200", "focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-inset rounded-xl", hasChildren && "cursor-pointer hover:bg-background-50", !hasChildren && "cursor-default" ), "aria-expanded": hasChildren ? isExpanded : void 0, children: [ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "bold", className: "text-text-950", children: item.topic.name }), hasNoData ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-500", children: noDataMessage }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-row items-center gap-2", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-1", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCMUIZOUVjs.ProgressBar_default, { value: item.progress, variant: "green", size: "medium" } ) }), /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", weight: "medium", className: "text-text-950 whitespace-nowrap", children: [ Math.round(item.progress), "%" ] } ) ] }) ] }), hasChildren && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretRight.CaretRightIcon, { size: 20, className: _chunkTN3AYOMVjs.cn.call(void 0, "transition-transform duration-200 flex-shrink-0 text-text-700", isExpanded ? "rotate-90" : "rotate-0" ) } ) ] } ), hasChildren && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { "data-testid": `accordion-content-${item.topic.id}`, "data-expanded": isExpanded, className: _chunkTN3AYOMVjs.cn.call(void 0, "transition-all duration-300 ease-in-out overflow-hidden", isExpanded ? "max-h-[2000px] opacity-100" : "max-h-0 opacity-0" ), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "pl-4", children: item.subtopics.map((subtopic) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SubtopicAccordionItem, { item: subtopic, noDataMessage }, subtopic.subtopic.id )) }) } ) ] }); }; var LoadingSkeleton = () => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { "data-testid": "lesson-progress-skeleton", className: "flex flex-col gap-4", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.Skeleton, { variant: "text", width: "12rem", height: 24 }), /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-row gap-3", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonCircle, { width: 107, height: 107 }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonRounded, { className: "flex-1", height: 107 }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonRounded, { className: "flex-1", height: 107 }) ] }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.Skeleton, { variant: "text", width: "9rem", height: 24, className: "mt-4" }), /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonRounded, { height: 80 }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonRounded, { height: 80 }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonRounded, { height: 80 }) ] }) ] }); var ErrorContent = ({ message, prefix }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col items-center justify-center py-8 gap-3", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { as: "span", className: "size-12 rounded-full bg-error-100 flex items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react3.XCircleIcon, { size: 24, className: "text-error-700", weight: "fill" }) } ), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", className: "text-error-700 text-center", children: prefix ? `${prefix}: ${message}` : message }) ] }); var ProgressContent = ({ data, labels }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-4", children: [ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 pt-2", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { as: "span", className: "size-6 rounded-full bg-primary-100 flex items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react3.MagnifyingGlassIcon, { size: 14, className: "text-primary-800", weight: "bold" } ) } ), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", className: "text-text-950", children: data.name }) ] }), /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "grid grid-cols-3 gap-3", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMIEC42PLjs.ProgressCircle_default, { value: data.overallCompletionRate, variant: "green", size: "small", label: labels.completionRateLabel, showPercentage: true } ) }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHN2HFYUOjs.CardActivitiesResults, { icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react3.MedalIcon, { size: 16, weight: "regular", className: "text-text-950" }), title: labels.bestResultLabel, subTitle: data.bestResult || "-", header: "", action: "success" } ), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHN2HFYUOjs.CardActivitiesResults, { icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react3.SealWarningIcon, { size: 16, weight: "regular", className: "text-white" }), title: labels.biggestDifficultyLabel, subTitle: data.biggestDifficulty || "-", header: "", action: "error" } ) ] }), data.lessonProgress.length > 0 && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-4 pt-4", children: [ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "bold", className: "text-text-950", children: labels.lessonProgressTitle }), /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-col gap-2", children: data.lessonProgress.map((topic) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { "data-testid": `lesson-item-${topic.topic.id}`, className: "bg-background rounded-xl border border-border-50", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TopicAccordionItem, { item: topic, noDataMessage: labels.noDataMessage } ) }, topic.topic.id )) }) ] }) ] }); var renderModalContent = (loading, error, data, labels) => { if (loading) { return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LoadingSkeleton, {}); } if (error) { return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ErrorContent, { message: error, prefix: labels.errorMessagePrefix }); } if (data) { return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ProgressContent, { data, labels }); } return null; }; var StudentLessonProgressModal = ({ isOpen, onClose, data, loading = false, error = null, labels: customLabels }) => { const labels = _react.useMemo.call(void 0, () => ({ ..._chunkIWCIL24Pjs.DEFAULT_LESSON_PROGRESS_LABELS, ...customLabels }), [customLabels] ); const content = renderModalContent(loading, error, data, labels); if (!content) { return null; } return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTCLRDUMFjs.Modal_default, { isOpen, onClose, title: labels.title, size: "lg", contentClassName: "max-h-[80vh] overflow-y-auto", children: content } ); }; var StudentLessonProgressModal_default = StudentLessonProgressModal; exports.StudentLessonProgressModal = StudentLessonProgressModal; exports.StudentLessonProgressModal_default = StudentLessonProgressModal_default; //# sourceMappingURL=chunk-O5G5NKRJ.js.map