From c77f2703ad9ecaff5458cb97d06f8999f1bad085 Mon Sep 17 00:00:00 2001 From: Ibrahim Moazzam Date: Wed, 1 Oct 2025 02:08:26 -0500 Subject: [PATCH 01/10] Edit: Text capitalization --- .../interactives/runestone/mchoice/js/mchoice.js | 4 ++-- projects/rsmanage/poetry.lock | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bases/rsptx/interactives/runestone/mchoice/js/mchoice.js b/bases/rsptx/interactives/runestone/mchoice/js/mchoice.js index 1da216b2d..83bb21d88 100644 --- a/bases/rsptx/interactives/runestone/mchoice/js/mchoice.js +++ b/bases/rsptx/interactives/runestone/mchoice/js/mchoice.js @@ -417,7 +417,7 @@ export default class MultipleChoice extends RunestoneBase { studentVoteCount > 1) { this.renderMCMAFeedBack(); } else { - $(this.feedBackDiv).html("

Your Answer has been recorded

"); + $(this.feedBackDiv).html("

Your answer has been recorded

"); $(this.feedBackDiv).attr("class", "alert alert-info"); } } @@ -572,7 +572,7 @@ export default class MultipleChoice extends RunestoneBase { studentVoteCount > 1) { this.renderMCMAFeedBack(); } else { - $(this.feedBackDiv).html("

Your Answer has been recorded

"); + $(this.feedBackDiv).html("

Your answer has been recorded

"); $(this.feedBackDiv).attr("class", "alert alert-info"); } } diff --git a/projects/rsmanage/poetry.lock b/projects/rsmanage/poetry.lock index c27d3de74..edad936b3 100644 --- a/projects/rsmanage/poetry.lock +++ b/projects/rsmanage/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "aiosqlite" @@ -202,7 +202,7 @@ files = [ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] -markers = {main = "python_full_version <= \"3.11.2\"", dev = "python_version == \"3.10\""} +markers = {main = "python_full_version <= \"3.11.2\"", dev = "python_version < \"3.11\""} [[package]] name = "asyncclick" @@ -329,7 +329,7 @@ description = "Backport of Python 3.11's datetime.fromisoformat" optional = false python-versions = ">3" groups = ["main"] -markers = "python_version == \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f681f638f10588fa3c101ee9ae2b63d3734713202ddfcfb6ec6cea0778a29d4"}, {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:cd681460e9142f1249408e5aee6d178c6d89b49e06d44913c8fdfb6defda8d1c"}, @@ -949,7 +949,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "dev"] -markers = "python_version == \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -2438,9 +2438,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -3111,8 +3111,8 @@ files = [ annotated-types = ">=0.6.0" pydantic-core = "2.23.4" typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, ] [package.extras] @@ -4641,7 +4641,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version == \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, From 7a6bea060d3f9a7834ad8ca4c90b400edeeaa096 Mon Sep 17 00:00:00 2001 From: Ibrahim Moazzam Date: Wed, 1 Oct 2025 02:17:51 -0500 Subject: [PATCH 02/10] Add: Assignment name for async PI UI --- .../web2py_server/applications/runestone/controllers/peer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bases/rsptx/web2py_server/applications/runestone/controllers/peer.py b/bases/rsptx/web2py_server/applications/runestone/controllers/peer.py index d298360cf..7e5de7980 100644 --- a/bases/rsptx/web2py_server/applications/runestone/controllers/peer.py +++ b/bases/rsptx/web2py_server/applications/runestone/controllers/peer.py @@ -711,6 +711,7 @@ def peer_async(): qnum = int(request.vars.question_num) current_question, all_done = _get_numbered_question(assignment_id, qnum) + assignment = db(db.assignments.id == assignment_id).select().first() course = db(db.courses.course_name == auth.user.course_name).select().first() course_attrs = getCourseAttributesDict(course.id, course.base_course) if "latex_macros" not in course_attrs: @@ -721,6 +722,7 @@ def peer_async(): course=get_course_row(db.courses.ALL), current_question=current_question, assignment_id=assignment_id, + assignment_name = assignment.name, nextQnum=qnum + 1, all_done=all_done, **course_attrs, From d0c0ffe45e3a73129c34801ee2f8f40f827fef18 Mon Sep 17 00:00:00 2001 From: Ibrahim Moazzam Date: Wed, 1 Oct 2025 02:19:18 -0500 Subject: [PATCH 03/10] Edit: Minor capitalization fix --- .../applications/runestone/views/peer/dashboard.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bases/rsptx/web2py_server/applications/runestone/views/peer/dashboard.html b/bases/rsptx/web2py_server/applications/runestone/views/peer/dashboard.html index a12624c5d..0c9f20ba8 100644 --- a/bases/rsptx/web2py_server/applications/runestone/views/peer/dashboard.html +++ b/bases/rsptx/web2py_server/applications/runestone/views/peer/dashboard.html @@ -124,7 +124,7 @@

Question {{ =current_qnum }} of {{ =num_questions }}

onclick="enableFaceChat(event)" disabled > - Enable in-person Chat + Enable In-Person Chat OR OR {{ pass }} From 80151da79842dc86dc89d0ec849a629570d78b38 Mon Sep 17 00:00:00 2001 From: Ibrahim Moazzam Date: Wed, 1 Oct 2025 04:10:35 -0500 Subject: [PATCH 05/10] Add: Initial CSS for synchronous chat --- .../runestone/static/css/peer.css | 176 +++++++++++++++++- .../runestone/views/peer/dashboard.html | 2 + .../runestone/views/peer/peer_question.html | 68 ++++--- 3 files changed, 215 insertions(+), 31 deletions(-) diff --git a/bases/rsptx/web2py_server/applications/runestone/static/css/peer.css b/bases/rsptx/web2py_server/applications/runestone/static/css/peer.css index 47ffd5e14..25efdd238 100644 --- a/bases/rsptx/web2py_server/applications/runestone/static/css/peer.css +++ b/bases/rsptx/web2py_server/applications/runestone/static/css/peer.css @@ -1,5 +1,11 @@ -#pi-instructor-interface .row, #pi-instructor-interface #imessage { +/* +--------------------------------+ */ +/* | Peer Instruction (PI) Stylesheet | */ +/* +--------------------------------+ */ +/* ---------------------- */ +/* Instructor's interface */ +/* ---------------------- */ +#pi-instructor-interface .row, #pi-instructor-interface #imessage { margin-right: 0px; margin-left: 0px; padding-left: 15px; @@ -158,4 +164,172 @@ .autopermalink { display: none; +} + +/* ------------------- */ +/* Student's interface */ +/* ------------------- */ +#peer-question-student-interface .row, #pi-student-interface #imessage { + margin-right: 0px; + margin-left: 0px; + padding-right: 15px; +} + +#discussion_panel { + margin: 20px 0; + background: #FBFBFB; + border: 0.5px solid #C7CDD1; + border-radius: 12px; + box-shadow: 0px 20px 24px 0px rgba(17, 17, 17, 0.06); + padding-left: 0px; + padding-right: 0px; +} + +#discussion-panel-heading { + font-size: 22px; + font-weight: 500; + padding: 12px 24px; + background: #FBFBFB; + border: 1px solid #C7CDD1; + border-radius: 12px 12px 0px 0px; + box-shadow: 0px 2px 2px 0px rgba(17, 17, 17, 0.06); +} + +#discussion-panel-heading p { + margin: 0; +} + +#discussion-panel-peer-votes { + border-bottom: 1px solid #C7CDD1; + padding: 16px 24px; +} + +#discussion-panel-peer-votes-content { + border-radius: 12px; + border: 2px solid #C7CDD1; + background: #FFFFFF; + padding: 16px 32px; +} + +#discussion-panel-peer-votes-content p { + margin: 0; + line-height: 28px; +} + +#discussion-panel-peer-votes-content #peerlist { + margin-bottom: 8px; +} + +#discussion-panel-messages { + padding: 16px 24px; +} + +#discussion-panel-messages #messages { + margin: 0; + padding-left: 0; + min-height: 25vh; + display: flex; + flex-direction: column; + justify-content: end; +} + +#discussion-panel-messages #messages > div { + margin-top: 8px; +} + +#discussion-panel-messages #messages .outgoing-mess + .incoming-mess, +#discussion-panel-messages #messages .incoming-mess + .outgoing-mess { + margin-top: 16px; +} + +#discussion-panel-messages #messages > div:first-child { + margin-top: 0; +} + +#discussion-panel-messages #messages .outgoing-mess, #discussion-panel-messages #messages .incoming-mess { + display: flex; + flex-direction: column; + font-style: normal; + color: #333; + gap: 4px; +} + +#discussion-panel-messages #messages .outgoing-mess { + align-items: end; +} + +#discussion-panel-messages #messages .incoming-mess { + align-items: start; +} + +#discussion-panel-messages #messages .sender { + display: flex; + font-size: 10px; + gap: 8px; + align-items: center; +} + +#discussion-panel-messages #messages .sender-initials { + display: flex; + background: #777777; + height: 24px; + width: 24px; + border-radius: 50%; + align-items: center; + justify-content: center; + color: #FFFFFF; +} + +#discussion-panel-messages #messages .sender-name { + font-weight: 700; +} + +#discussion-panel-messages #messages .content { + border-radius: 15px; + padding: 8px 16px; +} + +#discussion-panel-messages #messages .outgoing-mess .sender-initials { + order: 2; +} + +#discussion-panel-messages #messages .outgoing-mess .content { + background: rgba(215, 241, 249, 0.60); +} + +#discussion-panel-messages #messages .incoming-mess .content { + background: rgba(255, 255, 215, 0.60); +} + +#peer-message-box { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + width: 100%; + border-radius: 12px; + border: 2px solid #C7CDD1; + background: #FFFFFF; + padding: 8px 16px; + margin-top: 10px; + gap: 16px; +} + +#peer-message-box input { + width: 100%; + border: none; +} + +#sendpeermsg { + font-size: 24px; + cursor: pointer; +} + +#sendpeermsg.disabled { + pointer-events: none; + opacity: 0.5; +} + +#peer-rating { + display: none; } \ No newline at end of file diff --git a/bases/rsptx/web2py_server/applications/runestone/views/peer/dashboard.html b/bases/rsptx/web2py_server/applications/runestone/views/peer/dashboard.html index 09cbb325c..dea920732 100644 --- a/bases/rsptx/web2py_server/applications/runestone/views/peer/dashboard.html +++ b/bases/rsptx/web2py_server/applications/runestone/views/peer/dashboard.html @@ -6,10 +6,12 @@ rel="stylesheet" href="{{=URL('static','css/peer.css')}}?v={{=request.peer_mtime}}" /> + + diff --git a/bases/rsptx/web2py_server/applications/runestone/views/peer/peer_question.html b/bases/rsptx/web2py_server/applications/runestone/views/peer/peer_question.html index a7eb2b871..473457b45 100644 --- a/bases/rsptx/web2py_server/applications/runestone/views/peer/peer_question.html +++ b/bases/rsptx/web2py_server/applications/runestone/views/peer/peer_question.html @@ -4,6 +4,11 @@ {{include '_sphinx_static_files.html'}} {{end}} + +