feat(course): reset student course progress (#671)

* feat(course): add reset student course progress action

Give course admins and tutors a destructive reset-progress flow on the
student people detail page. The backend clears learner progress for one
(courseId, memberId) pair in a single transaction while keeping the
groupmember enrolled, and logs an audit summary. The dashboard shows a
confirmation dialog with impact counts from analytics before deleting.

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix(i18n): add localized reset progress strings for all locales

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix(course): scope reset progress to course data only

Stop deleting org-level community questions and answers during course
progress reset. Fix course newsfeed deletion order so comments on a
student's posts are removed before the posts themselves. Restrict reset
to student members, move analytics loading to the person detail layout,
and rename impact copy to course newsfeed only.

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix(course): address Greptile review on reset progress

Make progressImpact opt-in via includeProgressImpact query param so
analytics requests avoid extra DB work unless the reset dialog needs it.
Count only student-authored course newsfeed posts and comments in the
impact summary to avoid double-counting replies on the student's posts.

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>
This commit is contained in:
Rotimi Best
2026-06-27 10:14:52 +01:00
committed by GitHub
co-authored by Rotimi Best Cursor Agent
parent e43d8a2444
commit a695c97eda
25 changed files with 1056 additions and 59 deletions
@@ -242,6 +242,10 @@
"unpinned": "अनपिन किया गया",
"successfully": "सफलतापूर्वक",
"feed_delete_success": "फ़ीड सफलतापूर्वक हटा दी गई"
},
"people": {
"progress_reset": "प्रगति रीसेट की गई",
"progress_reset_failed": "प्रगति रीसेट नहीं हो सकी"
}
},
"landing_page_settings": {
@@ -1100,6 +1104,26 @@
"no": "नहीं",
"yes": "हाँ"
},
"reset_progress": {
"button": "प्रगति रीसेट करें",
"dialog": {
"title": "{studentName} की प्रगति रीसेट करें?",
"intro": "यह इस कोर्स में इस छात्र की प्रगति को स्थायी रूप से हटा देगा। वे नामांकित रहेंगे और पाठ 1 से फिर से शुरू कर सकेंगे।",
"bullets": {
"lessons": "पूर्ण पाठ — {completed} में से {total}",
"exercises": "जमा किए गए अभ्यास — {count} सबमिशन",
"comments": "इस छात्र के पाठ टिप्पणियाँ — {count}",
"newsfeed": "इस छात्र की कोर्स न्यूज़फ़ीड पोस्ट और जवाब — {count}",
"video_progress": "वीडियो देखने की प्रगति — {count} ट्रैक किए गए पाठ",
"attendance": "उपस्थिति प्रविष्टियाँ — {count}",
"certificate_yes": "प्रमाणन/अनुपालन रिकॉर्ड — हाँ",
"certificate_no": "प्रमाणन/अनुपालन रिकॉर्ड — नहीं"
},
"warning": "इसे पूर्ववत नहीं किया जा सकता।",
"cancel": "रद्द करें",
"confirm": "हटाएँ"
}
},
"invite_modal": {
"title": "लोगों को आमंत्रित करें",
"invite": "शिक्षकों को आमंत्रित करें",