Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
e1dae78
refactor: replacement of injectIntl with useIntl
jacobo-dominguez-wgu Jul 31, 2025
6171c4f
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Aug 1, 2025
22dfd2d
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Aug 4, 2025
b1be8d0
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Aug 5, 2025
c6c610f
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Aug 11, 2025
b2392b2
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Aug 22, 2025
1043598
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Aug 27, 2025
b797bd5
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Aug 27, 2025
41e8a04
Merge branch 'intl-modernization-1' of https://github.com/WGU-Open-ed…
jacobo-dominguez-wgu Aug 27, 2025
449d0df
Merge branch 'intl-modernization-1' of https://github.com/WGU-Open-ed…
jacobo-dominguez-wgu Aug 27, 2025
a05e99d
Merge branch 'intl-modernization-1' of https://github.com/WGU-Open-ed…
jacobo-dominguez-wgu Aug 27, 2025
9e7fc73
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Aug 28, 2025
72ff6ef
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Sep 3, 2025
34aa346
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Sep 8, 2025
60d9528
chore: updated useEffect to behave like componentDidUpdate
jacobo-dominguez-wgu Sep 8, 2025
cf41eea
chore: updated useEffect to behave like componentDidUpdate
jacobo-dominguez-wgu Sep 8, 2025
9f12286
Merge branch 'intl-modernization-1' of https://github.com/WGU-Open-ed…
jacobo-dominguez-wgu Sep 8, 2025
aa6a45d
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Sep 8, 2025
062c93d
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Sep 9, 2025
59f6505
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Sep 17, 2025
ca01330
Merge branch 'master' into intl-modernization-1
jacobo-dominguez-wgu Sep 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/components/Admin/Admin.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ describe('<Admin />', () => {
/>
))
.toJSON();
expect(mockFetchDashboardAnalytics).toHaveBeenCalled();
waitFor(() => expect(mockFetchDashboardAnalytics).toHaveBeenCalled());
expect(tree).toMatchSnapshot();
});

Expand Down
221 changes: 106 additions & 115 deletions src/components/Admin/AdminCards.jsx
Original file line number Diff line number Diff line change
@@ -1,106 +1,108 @@
import React from 'react';
import PropTypes from 'prop-types';

import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { useIntl } from '@edx/frontend-platform/i18n';
import {
Award, Check, Groups, RemoveRedEye,
} from '@openedx/paragon/icons';

import NumberCard from '../NumberCard';

class AdminCards extends React.Component {
constructor(props) {
super(props);
const { intl } = this.props;
const AdminCards = ({
activeLearners,
numberOfUsers,
courseCompletions,
enrolledLearners,
}) => {
const intl = useIntl();

this.cards = {
numberOfUsers: {
ref: React.createRef(),
description: intl.formatMessage({
id: 'adminPortal.cards.registeredLearners',
defaultMessage: 'total number of learners registered',
const cards = {
numberOfUsers: {
ref: React.createRef(),
description: intl.formatMessage({
id: 'adminPortal.cards.registeredLearners',
defaultMessage: 'total number of learners registered',
}),
icon: Groups,
actions: [{
label: intl.formatMessage({
id: 'adminPortal.cards.registeredUnenrolledLearners',
defaultMessage: 'Which learners are registered but not yet enrolled in any courses?',
}),
icon: Groups,
actions: [{
label: intl.formatMessage({
id: 'adminPortal.cards.registeredUnenrolledLearners',
defaultMessage: 'Which learners are registered but not yet enrolled in any courses?',
}),
slug: 'registered-unenrolled-learners',
}],
},
enrolledLearners: {
id: 'enrolled-learners',
ref: React.createRef(),
description: intl.formatMessage({
id: 'adminPortal.cards.enrolledOneCourse',
defaultMessage: 'learners enrolled in at least one course',
slug: 'registered-unenrolled-learners',
}],
},
enrolledLearners: {
id: 'enrolled-learners',
ref: React.createRef(),
description: intl.formatMessage({
id: 'adminPortal.cards.enrolledOneCourse',
defaultMessage: 'learners enrolled in at least one course',
}),
icon: Check,
actions: [{
label: intl.formatMessage({
id: 'adminPortal.cards.enrolledLearners',
defaultMessage: 'How many courses are learners enrolled in?',
}),
icon: Check,
actions: [{
label: intl.formatMessage({
id: 'adminPortal.cards.enrolledLearners',
defaultMessage: 'How many courses are learners enrolled in?',
}),
slug: 'enrolled-learners',
}, {
label: intl.formatMessage({
id: 'adminPortal.cards.enrolledLearnersInactiveCourses',
defaultMessage: 'Who is no longer enrolled in a current course?',
}),
slug: 'enrolled-learners-inactive-courses',
}],
},
activeLearners: {
ref: React.createRef(),
description: intl.formatMessage({
id: 'adminPortal.cards.activeLearnersPastWeek',
defaultMessage: 'active learners in the past week',
slug: 'enrolled-learners',
}, {
label: intl.formatMessage({
id: 'adminPortal.cards.enrolledLearnersInactiveCourses',
defaultMessage: 'Who is no longer enrolled in a current course?',
}),
icon: RemoveRedEye,
actions: [{
label: intl.formatMessage({
id: 'adminPortal.cards.learnersActiveWeek',
defaultMessage: 'Who are my top active learners?',
}),
slug: 'learners-active-week',
}, {
label: intl.formatMessage({
id: 'adminPortal.cards.learnersInactiveWeek',
defaultMessage: 'Who has not been active for over a week?',
}),
slug: 'learners-inactive-week',
}, {
label: intl.formatMessage({
id: 'adminPortal.cards.learnersInactiveMonth',
defaultMessage: 'Who has not been active for over a month?',
}),
slug: 'learners-inactive-month',
}],
},
courseCompletions: {
ref: React.createRef(),
description: 'course completions',
icon: Award,
actions: [{
label: intl.formatMessage({
id: 'adminPortal.cards.completedLearners',
defaultMessage: 'How many courses have been completed by learners?',
}),
slug: 'completed-learners',
}, {
label: intl.formatMessage({
id: 'adminPortal.cards.completedLearnersWeek',
defaultMessage: 'Who completed a course in the past week?',
}),
slug: 'completed-learners-week',
}],
},
};
}
slug: 'enrolled-learners-inactive-courses',
}],
},
activeLearners: {
ref: React.createRef(),
description: intl.formatMessage({
id: 'adminPortal.cards.activeLearnersPastWeek',
defaultMessage: 'active learners in the past week',
}),
icon: RemoveRedEye,
actions: [{
label: intl.formatMessage({
id: 'adminPortal.cards.learnersActiveWeek',
defaultMessage: 'Who are my top active learners?',
}),
slug: 'learners-active-week',
}, {
label: intl.formatMessage({
id: 'adminPortal.cards.learnersInactiveWeek',
defaultMessage: 'Who has not been active for over a week?',
}),
slug: 'learners-inactive-week',
}, {
label: intl.formatMessage({
id: 'adminPortal.cards.learnersInactiveMonth',
defaultMessage: 'Who has not been active for over a month?',
}),
slug: 'learners-inactive-month',
}],
},
courseCompletions: {
ref: React.createRef(),
description: 'course completions',
icon: Award,
actions: [{
label: intl.formatMessage({
id: 'adminPortal.cards.completedLearners',
defaultMessage: 'How many courses have been completed by learners?',
}),
slug: 'completed-learners',
}, {
label: intl.formatMessage({
id: 'adminPortal.cards.completedLearnersWeek',
defaultMessage: 'Who completed a course in the past week?',
}),
slug: 'completed-learners-week',
}],
},
};

renderCard({ title, cardKey }) {
const card = this.cards[cardKey];
const renderCard = ({ title, cardKey }) => {
const card = cards[cardKey];

return (
<div
Expand All @@ -117,31 +119,22 @@ class AdminCards extends React.Component {
/>
</div>
);
}

render() {
const {
activeLearners,
numberOfUsers,
courseCompletions,
enrolledLearners,
} = this.props;
};

const data = {
activeLearners: activeLearners.past_week,
numberOfUsers,
courseCompletions,
enrolledLearners,
};
const data = {
activeLearners: activeLearners.past_week,
numberOfUsers,
courseCompletions,
enrolledLearners,
};

return Object.keys(this.cards).map(cardKey => (
this.renderCard({
title: data[cardKey],
cardKey,
})
));
}
}
return Object.keys(cards).map(cardKey => (
renderCard({
title: data[cardKey],
cardKey,
})
));
};

AdminCards.propTypes = {
activeLearners: PropTypes.shape({
Expand All @@ -151,8 +144,6 @@ AdminCards.propTypes = {
numberOfUsers: PropTypes.number.isRequired,
courseCompletions: PropTypes.number.isRequired,
enrolledLearners: PropTypes.number.isRequired,
// injected
intl: intlShape.isRequired,
};

export default injectIntl(AdminCards);
export default AdminCards;
Loading