diff --git a/bases/rsptx/assignment_server_api/routers/student.py b/bases/rsptx/assignment_server_api/routers/student.py
index b4160dbbd..76c45c217 100644
--- a/bases/rsptx/assignment_server_api/routers/student.py
+++ b/bases/rsptx/assignment_server_api/routers/student.py
@@ -201,6 +201,7 @@ def sort_key(assignment):
lti1p1=is_lti1p1_course,
now=now,
visibility_map=visibility_map,
+ term_start_date=course.term_start_date,
settings=settings,
base_url=construct_course_url(course),
activity_info="{}",
@@ -1020,6 +1021,7 @@ async def doAssignment(
questions_score=questions_score,
readings_score=readings_score,
user=user,
+ term_start_date=course.term_start_date,
user_id=user.username, # _base.html for ptx student pages needs user_id
base_course=course.base_course,
# gradeRecordingUrl=URL('assignments', 'record_grade'),
diff --git a/bases/rsptx/interactives/ptxrs-bootstrap.less b/bases/rsptx/interactives/ptxrs-bootstrap.less
index b16bbb3b4..34667c40f 100644
--- a/bases/rsptx/interactives/ptxrs-bootstrap.less
+++ b/bases/rsptx/interactives/ptxrs-bootstrap.less
@@ -23,6 +23,7 @@
border-radius: 5px;
height: 20px;
position: relative;
+ margin: 10px auto;
}
diff --git a/bases/rsptx/interactives/public/index.html b/bases/rsptx/interactives/public/index.html
index 8cd23507d..01ddd23c3 100644
--- a/bases/rsptx/interactives/public/index.html
+++ b/bases/rsptx/interactives/public/index.html
@@ -235,9 +235,11 @@
- You have attempted
of
-
activities on this page
-
+
+ You have attempted of
+ activities on this page.
+
+
diff --git a/bases/rsptx/interactives/runestone/common/css/runestone.css b/bases/rsptx/interactives/runestone/common/css/runestone.css
index 6f2615d68..f70b55e7b 100644
--- a/bases/rsptx/interactives/runestone/common/css/runestone.css
+++ b/bases/rsptx/interactives/runestone/common/css/runestone.css
@@ -1432,4 +1432,11 @@ legend {
.autopermalink {
display: none;
+}
+
+
+.course-not-started-warning {
+ margin-bottom: 20px;
+ margin-top: 20px;
+ padding: 15px;
}
\ No newline at end of file
diff --git a/bases/rsptx/interactives/runestone/common/js/bookfuncs.js b/bases/rsptx/interactives/runestone/common/js/bookfuncs.js
index fe0c8cf43..9addd2753 100644
--- a/bases/rsptx/interactives/runestone/common/js/bookfuncs.js
+++ b/bases/rsptx/interactives/runestone/common/js/bookfuncs.js
@@ -348,6 +348,25 @@ export const NON_CONTENT_PAGES = [
"search.html",
];
+export function isCourseStarted() {
+ let startDate = eBookConfig.termStartDate; // format is "2026-09-22"
+ if (!startDate) {
+ return false;
+ }
+ let today = new Date();
+ let start = new Date(startDate);
+ return today >= start;
+}
+
+function courseNotStartedMessage() {
+ const formattedDate = new Date(eBookConfig.termStartDate).toLocaleDateString(undefined, {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric'
+ });
+ return ("Course has not started yet. Progress will be tracked starting on " + formattedDate);
+}
+
/** True when pathname names one of the NON_CONTENT_PAGES. */
export function isNonContentPage(pathname = window.location.pathname) {
let page = pathname.split("/").pop().toLowerCase();
@@ -440,6 +459,11 @@ export class PageProgressBar {
} catch (e) {
value = 0;
}
+ let progressText = document.getElementById("scprogress-activity-count");
+ // Warn if course not started
+ if(progressText && !isCourseStarted()) {
+ progressText.appendChild(document.createTextNode(courseNotStartedMessage()));
+ }
// Replace #subchapterprogress div with a native