From ae994780dad99b7b06952e9f4a1f3f81f1c44241 Mon Sep 17 00:00:00 2001 From: KristinAoki Date: Wed, 18 Dec 2024 15:17:19 -0500 Subject: [PATCH] feat: updae grade summary to show floating point grades --- .../grade-summary/GradeSummaryHeader.jsx | 31 +++++-------- .../grade-summary/GradeSummaryTable.jsx | 15 +++---- .../grade-summary/GradeSummaryTableFooter.jsx | 44 ++++++++++++++----- .../progress-tab/grades/messages.ts | 6 ++- 4 files changed, 53 insertions(+), 43 deletions(-) diff --git a/src/course-home/progress-tab/grades/grade-summary/GradeSummaryHeader.jsx b/src/course-home/progress-tab/grades/grade-summary/GradeSummaryHeader.jsx index fc860c10fa..99eb6e82c1 100644 --- a/src/course-home/progress-tab/grades/grade-summary/GradeSummaryHeader.jsx +++ b/src/course-home/progress-tab/grades/grade-summary/GradeSummaryHeader.jsx @@ -1,49 +1,39 @@ -import React, { useState } from 'react'; import { useSelector } from 'react-redux'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; -import { - Icon, IconButton, OverlayTrigger, Popover, -} from '@openedx/paragon'; +import { useIntl } from '@edx/frontend-platform/i18n'; +import { Icon, OverlayTrigger, Tooltip } from '@openedx/paragon'; import { Blocked, InfoOutline } from '@openedx/paragon/icons'; import messages from '../messages'; import { useModel } from '../../../../generic/model-store'; -const GradeSummaryHeader = ({ intl, allOfSomeAssignmentTypeIsLocked }) => { +const GradeSummaryHeader = ({ allOfSomeAssignmentTypeIsLocked }) => { + const intl = useIntl(); const { courseId, } = useSelector(state => state.courseHome); const { gradesFeatureIsFullyLocked, } = useModel('progress', courseId); - const [showTooltip, setShowTooltip] = useState(false); return (

{intl.formatMessage(messages.gradeSummary)}

- - {intl.formatMessage(messages.gradeSummaryTooltipBody)} - - + + {intl.formatMessage(messages.gradeSummaryTooltipBody)} + )} > - { setShowTooltip(!showTooltip); }} - onBlur={() => { setShowTooltip(false); }} + {!gradesFeatureIsFullyLocked && allOfSomeAssignmentTypeIsLocked && ( @@ -57,8 +47,7 @@ const GradeSummaryHeader = ({ intl, allOfSomeAssignmentTypeIsLocked }) => { }; GradeSummaryHeader.propTypes = { - intl: intlShape.isRequired, allOfSomeAssignmentTypeIsLocked: PropTypes.bool.isRequired, }; -export default injectIntl(GradeSummaryHeader); +export default GradeSummaryHeader; diff --git a/src/course-home/progress-tab/grades/grade-summary/GradeSummaryTable.jsx b/src/course-home/progress-tab/grades/grade-summary/GradeSummaryTable.jsx index 628a65e24a..fa1b4775c5 100644 --- a/src/course-home/progress-tab/grades/grade-summary/GradeSummaryTable.jsx +++ b/src/course-home/progress-tab/grades/grade-summary/GradeSummaryTable.jsx @@ -1,10 +1,7 @@ -import React from 'react'; import PropTypes from 'prop-types'; import { useSelector } from 'react-redux'; -import { - getLocale, injectIntl, intlShape, isRtl, -} from '@edx/frontend-platform/i18n'; +import { getLocale, isRtl, useIntl } from '@edx/frontend-platform/i18n'; import { DataTable } from '@openedx/paragon'; import { useModel } from '../../../../generic/model-store'; @@ -14,7 +11,8 @@ import GradeSummaryTableFooter from './GradeSummaryTableFooter'; import messages from '../messages'; -const GradeSummaryTable = ({ intl, setAllOfSomeAssignmentTypeIsLocked }) => { +const GradeSummaryTable = ({ setAllOfSomeAssignmentTypeIsLocked }) => { + const intl = useIntl(); const { courseId, } = useSelector(state => state.courseHome); @@ -75,8 +73,8 @@ const GradeSummaryTable = ({ intl, setAllOfSomeAssignmentTypeIsLocked }) => { footnoteId, footnoteMarker, type: assignment.type, locked, }, weight: { weight: `${(assignment.weight * 100).toFixed(0)}${isLocaleRtl ? '\u200f' : ''}%`, locked }, - grade: { grade: `${(assignment.averageGrade * 100).toFixed(0)}${isLocaleRtl ? '\u200f' : ''}%`, locked }, - weightedGrade: { weightedGrade: `${(assignment.weightedGrade * 100).toFixed(0)}${isLocaleRtl ? '\u200f' : ''}%`, locked }, + grade: { grade: `${(assignment.averageGrade * 100).toFixed(2)}${isLocaleRtl ? '\u200f' : ''}%`, locked }, + weightedGrade: { weightedGrade: `${(assignment.weightedGrade * 100).toFixed(2)}${isLocaleRtl ? '\u200f' : ''}%`, locked }, }; }); const getAssignmentTypeCell = (value) => ( @@ -137,8 +135,7 @@ const GradeSummaryTable = ({ intl, setAllOfSomeAssignmentTypeIsLocked }) => { }; GradeSummaryTable.propTypes = { - intl: intlShape.isRequired, setAllOfSomeAssignmentTypeIsLocked: PropTypes.func.isRequired, }; -export default injectIntl(GradeSummaryTable); +export default GradeSummaryTable; diff --git a/src/course-home/progress-tab/grades/grade-summary/GradeSummaryTableFooter.jsx b/src/course-home/progress-tab/grades/grade-summary/GradeSummaryTableFooter.jsx index 2c3235be86..a99c278aa9 100644 --- a/src/course-home/progress-tab/grades/grade-summary/GradeSummaryTableFooter.jsx +++ b/src/course-home/progress-tab/grades/grade-summary/GradeSummaryTableFooter.jsx @@ -1,15 +1,20 @@ -import React from 'react'; import { useSelector } from 'react-redux'; +import { getLocale, isRtl, useIntl } from '@edx/frontend-platform/i18n'; import { - getLocale, injectIntl, intlShape, isRtl, -} from '@edx/frontend-platform/i18n'; -import { DataTable } from '@openedx/paragon'; -import { useModel } from '../../../../generic/model-store'; + DataTable, + Icon, + OverlayTrigger, + Stack, + Tooltip, +} from '@openedx/paragon'; +import { InfoOutline } from '@openedx/paragon/icons'; +import { useModel } from '../../../../generic/model-store'; import messages from '../messages'; -const GradeSummaryTableFooter = ({ intl }) => { +const GradeSummaryTableFooter = () => { + const intl = useIntl(); const { courseId, } = useSelector(state => state.courseHome); @@ -29,15 +34,30 @@ const GradeSummaryTableFooter = ({ intl }) => { return (
-
{intl.formatMessage(messages.weightedGradeSummary)}
+
+ + {intl.formatMessage(messages.weightedGradeSummary)} + + {intl.formatMessage(messages.weightedGradeSummaryTooltip)} + + )} + > + + + +
{totalGrade}{isLocaleRtl && '\u200f'}%
); }; -GradeSummaryTableFooter.propTypes = { - intl: intlShape.isRequired, -}; - -export default injectIntl(GradeSummaryTableFooter); +export default GradeSummaryTableFooter; diff --git a/src/course-home/progress-tab/grades/messages.ts b/src/course-home/progress-tab/grades/messages.ts index fb57809852..5b19e0b41c 100644 --- a/src/course-home/progress-tab/grades/messages.ts +++ b/src/course-home/progress-tab/grades/messages.ts @@ -203,7 +203,11 @@ const messages = defineMessages({ defaultMessage: 'Your current weighted grade summary', description: 'It the text precede the sum of weighted grades of all the assignment', }, - + weightedGradeSummaryTooltip: { + id: 'progress.weightedGradeSummary', + defaultMessage: 'The weighted grade for individual assignment types is raw and the weighted grade summary is rounded.', + description: 'Tooltip content that explains the rounding of the summary versus individual assignments', + }, }); export default messages;