Skip to content

Live events for "classic quiz with no assignment" content type + live events for all quiz types content update + new event types for quizzes#39

Open
JoshBothell wants to merge 1950 commits into
masterfrom
jab/live-events-classic-quiz-no-assn-new-event-types
Open

Live events for "classic quiz with no assignment" content type + live events for all quiz types content update + new event types for quizzes#39
JoshBothell wants to merge 1950 commits into
masterfrom
jab/live-events-classic-quiz-no-assn-new-event-types

Conversation

@JoshBothell
Copy link
Copy Markdown

  • Live events for "classic quiz with no assignment" content type
  • Live events for all quiz types content update
  • New event types for quizzes to avoid confusion regarding using "assignment_updated" events for quizzes with no assignment.

@JoshBothell
Copy link
Copy Markdown
Author

submitted to Instructure, awaiting approval.

ccutrer and others added 28 commits April 20, 2026 16:49
Closes AE-3819

Change-Id: I2e40d945d52ca238c187e8fa99e21c8a729c0daf
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406614
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Aaron Ogata <aogata@instructure.com>
QA-Review: Cody Cutrer <cody@instructure.com>
Product-Review: Cody Cutrer <cody@instructure.com>
The discovery page had no cap on the number of
sign-in option buttons, which violated an a11y
audit requirement. Users could save an unlimited
number of items across the primary and secondary
sections.

Backend validation now rejects configurations
exceeding 10 total items. Primary and secondary
sections are treated as empty when absent, since
discovery_page_active= can write discovery page
settings without those keys. The frontend enforces
the same limit by disabling the Add button at the
cap and blocking saves when over the limit.

A live item counter in the modal footer shows
green below the limit, yellow at the limit, and
red with an explanatory message when over it.
Existing configurations above 10 still render,
but must be reduced before saving again.

closes AE-3686
flag=new_login_ui_identity_discovery_page

[skip-crystalball]

test plan:
- enable "New Canvas Login UI: Identity Service Discovery
  Page" at /accounts/site_admin/settings#tab-features
- visit /accounts/self/authentication_providers
- click "Configure" for "Identity Service Discovery Page"
- verify the counter shows 0/10 with no items added
- add sign-in options one at a time
- verify the counter increments only after each item
  is committed, not while the form is open
- verify the counter is green below 10 items
- verify the counter turns yellow at exactly 10
- verify the Add button is disabled at 10 items
- verify Save is disabled when over the limit
- verify the counter turns red above 10 with an
  error message
- verify existing configs above 10 load and display
  the red counter, and Save is blocked until reduced

Change-Id: Ib88d61c8415905b609581ef3b892d21ce59d9712
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405720
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Michael Hulse <michael.hulse@instructure.com>
Product-Review: Michael Hulse <michael.hulse@instructure.com>
Reviewed-by: Weston Dransfield <wdransfield@instructure.com>
Added a DiscoveryPageStatus component to the configure
modal header that shows an "Enabled" or "Disabled" pill
based on the discovery page active state, along with a
"View Discovery Page" link that opens the discovery page
URL in a new tab.

Also replaced the native window.confirm exit confirmation
with the InstUI-based confirm() dialog, and added a save
confirmation warning when the discovery page is currently
enabled to alert admins that changes will be immediately
visible to users.

closes AE-3698
closes AE-3699
flag=new_login_ui_identity_discovery_page

[skip-crystalball]

test plan:
- enable "New Canvas Login UI: Identity Service Discovery
  Page" at /accounts/site_admin/settings#tab-features
- visit /accounts/self/authentication_providers
- click "Configure" for "Discovery Page" to open the modal
- verify the "Disabled" pill appears in the header
- verify the "View Discovery Page" link opens the
  discovery page in a new tab
- enable the discovery page toggle, save the form
- reopen the modal and verify "Enabled" pill shows
- make a change and click Save
- verify a confirmation dialog warns that changes
  will be immediately visible to users
- cancel the confirmation and verify save did not occur
- confirm the dialog and verify save completes
- make a change and click Close
- verify an unsaved changes confirmation dialog appears
- cancel and verify the modal stays open
- confirm close and verify the modal closes
- resize the browser narrow and verify the pill and
  link wrap below the heading as a single unit

Change-Id: Ia83817d0d6c479d153e98672395255480c817369
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406023
QA-Review: Michael Hulse <michael.hulse@instructure.com>
Product-Review: Michael Hulse <michael.hulse@instructure.com>
Reviewed-by: Weston Dransfield <wdransfield@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Custom nav links (nav_menu_link_* tab IDs) were
not surfaced in the K5 course Resources tab.
Now they appear as a "Links" section with
external link cards.

Also fixes issue in course.rb where for K5 subject courses, on the
settings page, the "no eye" icon was not being displayed for disabled
tabs.

refs INTEROP-10283
flag=nav_menu_links

test plan:
- Enable K5 on a subaccount: Admin → Account Settings →
  check "Canvas for Elementary"
  for this account" → Save
- make a course under this subaccount. This will be a K5 subject course.
  (homeroom course can be enabled in course settings)
- Add custom links in account nav settings and course nav settings
- From the course main page, click the Resources tab
- Verify the "Other Resources" section appears with clickable external link cards
- disable one of the nav menu links and verify that it shows with a "no
  eye" icon for a teacher or admin but does not show at all for a
  student

Change-Id: I2aa8ade75874b059129c69e3986b2e3720c0154c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406428
Reviewed-by: Csaba Csuzdi <csaba.csuzdi@instructure.com>
QA-Review: Csaba Csuzdi <csaba.csuzdi@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Product-Review: Alexis Nast <alexis.nast@instructure.com>
closes INTEROP-10325
flag=nav_menu_links

* also, for consistency, uses CanvasHttp.validate_url() in
  NavMenuLink validation even if URl starts with '/'
* also be forgiving if they just paste a URL in and they end up with
  https://https://example.com

Test plan:
- add a custom link with url "http://example.com/1 2" (with space) and
  observe that it now changes space to %20 (previously it would keep the
  space and then cause a ruby error when saving)
- add a link with URL "http://canvas-web.inseng.test//accounts/self"
  (double slash after host) in Course settings. check that the link
  works before and after save. Check in the rails console that it is
  stored as "/accounts/self"
- try to add a link with URL "//example.com/123" and observe that the
  front-end rejects it.
- try adding URL  https://https://example.com and observe that it gets
  turned into https://example.com

Change-Id: I40a9908bf357f0176c95a78d8d29dfcd32bc49ea
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406376
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Csaba Csuzdi <csaba.csuzdi@instructure.com>
QA-Review: Csaba Csuzdi <csaba.csuzdi@instructure.com>
Product-Review: Alexis Nast <alexis.nast@instructure.com>
Display link URL as small secondary text below
the label for NavMenuLink tabs in course settings,
matching the same pattern as account settings.

closes INTEROP-10480
flag=nav_menu_links

test plan:
- Go to course settings > Navigation
- add a custom link (nav menu link)
- Verify nav menu link items show their URL
  in small text below the label. click link to make sure it works.
- save and refresh page and make sure link still appears
- add an custom link with internal url
  (http://canvas-web.inseng.test/courses/123) and save. after page
  refresh check that the link starts with "/" but still shows the full
  url with http://canvas-web.inseng.test

Change-Id: I147b49f5723e4f257a1179c91a9eb5d45ad2ca09
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406184
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Csaba Csuzdi <csaba.csuzdi@instructure.com>
QA-Review: Csaba Csuzdi <csaba.csuzdi@instructure.com>
Product-Review: Alexis Nast <alexis.nast@instructure.com>
Adds the ic-brand-Discovery-custom-message brand variable
to the JWT claims generated for the discovery page preview
iframe. The value is read from the account's brand config
and included in the token payload so the preview page can
display it without requiring frontend changes.

The custom message is gated behind the
new_login_ui_custom_labels site admin feature flag,
consistent with how login and registration custom
messages are handled.

closes AE-3736
flag=new_login_ui_custom_labels

[skip-crystalball]

test plan:
- enable “New Canvas Login UI: Custom Labels” flag
  at /accounts/site_admin/settings#tab-features
- enable "New Canvas Login UI: Identity Service Discovery
  Page" flag at /accounts/site_admin/settings#tab-features
- visit /accounts/self/authentication_providers
- click "Configure" for "Discovery Page" to open the modal
- confirm custom_message appears in the JWT payload
- disable the “New Canvas Login UI: Custom Labels” flag
- confirm custom_message is null in the JWT payload

Change-Id: Ib482b854a9353e5e072c8cae433141cc90e2c02b
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406096
QA-Review: Michael Hulse <michael.hulse@instructure.com>
Product-Review: Michael Hulse <michael.hulse@instructure.com>
Reviewed-by: Dave Wenzlick <david.wenzlick@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
This commit fixes an issue with with the wrapping of the buttons on the
App details page. If there were too many buttons, they would all be on
one line and would overflow the container. This commit changes the flex
wrapper div to have `flex-wrap: wrap` so that the buttons will wrap to
the next line if there are too many.

test plan:
1. Go to the App details page for an app with many buttons (Create a
registration update request, and view a DR app with reinstallation
enabled).

2. Ensure that the buttons wrap to the next line and do not overflow
the container.

closes INTEROP-10507
flag=none

Change-Id: I7e945d50a5aaaef11a18716d03208272c3c7631d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406872
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ryan Hawkins <ryan.hawkins@instructure.com>
QA-Review: Ryan Hawkins <ryan.hawkins@instructure.com>
Product-Review: Ryan Hawkins <ryan.hawkins@instructure.com>
When validating discovery page settings, the validator
would crash with ActiveRecord::SubclassNotFound when
encountering a deleted provider with an invalid
auth_type (e.g., legacy “twitter” that no longer has a
subclass). This occurred because Rails attempted STI
resolution during the iteration and method call.

We now use a database query with the
valid_for_discovery_page scope to check provider
existence and activity directly, avoiding STI
instantiation entirely. Invalid or deleted providers
gracefully return nil and fail validation with a clear
error message instead of raising an exception.

closes AE-3825
flag=none

[skip-crystalball]

test plan:
- run the account settings validator spec
- ensure the new test for legacy deleted providers
  passes without raising SubclassNotFound exceptions
- validate an account with a discovery page entry
  referencing a deleted provider
- expect validation to fail with the appropriate error
  message, not with an STI instantiation exception

Change-Id: I12c116989b46ae94700d72278e26447281f67ba2
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406707
QA-Review: Michael Hulse <michael.hulse@instructure.com>
Product-Review: Michael Hulse <michael.hulse@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Weston Dransfield <wdransfield@instructure.com>
refs AE-3801
flag=none

many developer keys include this and would
break if it disappeared. re-introducing it
to prevent that until a better story
evolves around handling invalid scopes on
dev keys

Change-Id: I9dc4b4dd926a77989d20b318404066eab553311c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406965
Reviewed-by: Xander Moffatt <xmoffatt@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Jake Oeding <jake.oeding@instructure.com>
Product-Review: Jake Oeding <jake.oeding@instructure.com>
refs EGG-2507
flag=peer_review_allocation_and_grading

Replaced the following localized messages for errors:
- "Unlock date" -> "Available from date"
- "Lock date" -> "Until date"

This change only modifies customer visible UI strings,
the lock / unlock terminology on the backend is kept as is.

[fsc-timeout=120]
[fsc-node-count=35]
[fsc-max-nodes=35]

test plan:
- create an assignment and attempt to set the dates
in a wrong way
- set due date to 15th April
- set review due date to 13rd April
- set available from date to 6th April
- set until date to 5th April
- error messages should display under each field
- verify "lock" and "unlock" language is changed

Change-Id: Ibc6bd81159564f777634558fca7cd01f13bb421d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406292
Reviewed-by: Artsiom Bolhar <artsiom.bolhar@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jason Gillett <jason.gillett@instructure.com>
QA-Review: Jason Gillett <jason.gillett@instructure.com>
Product-Review: Martin Yosifov <martin.yosifov@instructure.com>
refs AE-3466
flag=none

Instructure Identity pseudonyms are only filtered
from SisPseudonym.for results when current_user: is
provided. Without it, pending inst pseudonyms are
visible to all callers.

Not addressed (no current_user context available):
- Authentication loading (authentication_methods.rb,
  inst_access_token.rb, kaltura_helper.rb) — these
  load the session user's own pseudonym; filtering
  on self would be incorrect
- Model layer (course.rb, user.rb, message.rb, etc.)
- Background jobs and exporters (live_events.rb,
  gradebook_exporter.rb, enrollment_importer.rb,
  user_list_v2.rb, lti/*.rb, account_reports,
  custom_reports)

test plan:
- specs pass (here and in mra PS)

Change-Id: I0de2508641ae7436b1233427ac5d28dfb5c26f09
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405582
Reviewed-by: Weston Dransfield <wdransfield@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Dave Wenzlick <david.wenzlick@instructure.com>
Product-Review: Dave Wenzlick <david.wenzlick@instructure.com>
This reverts commit 6b97896.

Reason for revert: This doesn't resolve the issue from the ticket, and we're concerned it might have unintended consequences that we don't need.

Change-Id: Ieeb4195340f8476da9f9f221e2cf4dc96fc94515
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406994
Reviewed-by: Kasra Rismanchi <kasra.rismanchi@instructure.com>
QA-Review: Kasra Rismanchi <kasra.rismanchi@instructure.com>
Product-Review: Kasra Rismanchi <kasra.rismanchi@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
EAP ending; widget dashboard moves to GA Opt-in.
Drops the "Use Widgets for Dashboard" toggle and
"Early Adopter Program Settings" section. The
dashboard version switcher button stays.

closes LX-4100
flag=widget_dashboard

test plan:
- Enable widget_dashboard feature flag on root
  account; log in as student
- Open user profile tray; confirm "Early Adopter
  Program Settings" heading and toggle are gone
- Confirm Accessibility Settings section still
  renders
- Confirm "Switch to new/old dashboard view"
  button on dashboard still toggles both ways

Change-Id: Ieb45ed4191673b11575ad2fa69be0c5bb735d384
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406776
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Sarah Gerard <sarah.gerard@instructure.com>
QA-Review: Sarah Gerard <sarah.gerard@instructure.com>
Product-Review: Drake Harper <drake.harper@instructure.com>
Wire CanvasRce into the educator announcement
creation widget via platform-ui's renderMessageEditor
render prop.
The host renders a bare CanvasRce —
platform-ui owns the FormField wrapper, label,
required asterisk, and screen-reader announcement.

The main goal of this ticket is that the RCE is wired into
the widget and can be used to create an announcement

closes EGG-2471
flag=educator_dashboard

test plan:
- enable educator_dashboard feature flag
- visit /, open the announcement creation widget
- verify the RCE renders
- type content, pick a course, and submit
- verify the announcement is created with the content
that was in the RCE

Change-Id: I55ec5c0deb705716f32508da46f73e6ea0d5bd85
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406799
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Angela Gomba <angela.gomba@instructure.com>
QA-Review: Angela Gomba <angela.gomba@instructure.com>
Product-Review: Jason Gillett <jason.gillett@instructure.com>
Change-Id: I1078d7ed968cacedec3cd5ba6824982ae3b0e9c1
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407015
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Change-Id: I139258443665bf910d7821dbd26c5604f4846d67
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407016
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Change-Id: Id7578a9992980dc9d0e4d7c653cc3564cac0c920
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407017
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Cache TPs for ACTLs. Check current submission first in
find_attempt_for_report before loading all versions.
Preload old versions of submissions with multiple attempts.

refs INTEROP-10487
flag=lti_asset_processor_tii_migration

test plan:
- enable lti_asset_processor_tii_migration on an account
- set up account with TII LTI 2.0 tool proxy and assignments
  with originality reports
- trigger migration via the API
- verify migration completes successfully
- verify asset processors and asset reports are created
  correctly for each assignment

Change-Id: I1329cce53050601a9d3aa327072cec3830f0c010
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406676
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Evan Battaglia <ebattaglia@instructure.com>
QA-Review: Evan Battaglia <ebattaglia@instructure.com>
Product-Review: Csaba Csuzdi <csaba.csuzdi@instructure.com>
The new on_migration_failed function makes it possible
to add custom alerting to the migrator

refs INTEROP-10487
flag=lti_asset_processor_tii_migration

test plan:
- regression test:
- add a logline to on_migration_failed
- create an LTI2 TP
- configure an assignment with it
- inject an error to tii_tp_migration function
- migrate
- check in the logs if on_migration_failed was called

Change-Id: Iaec6c77419b1be850e33c4ab59e85e532d894f67
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406746
Reviewed-by: Evan Battaglia <ebattaglia@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Csaba Csuzdi <csaba.csuzdi@instructure.com>
Product-Review: Csaba Csuzdi <csaba.csuzdi@instructure.com>
The "Switch to new dashboard view" button should be
hidden when an observer is observing themselves, since
observers are not meant to see the widget dashboard in
that case. Observers viewing a student and plain students
still see the button as before.

fixes LX-3829
flag=widget_dashboard

test plan:
- log in as an observer that observes a student
- go to dashboard, select the student in observer picker
- verify "Switch to new dashboard" button is visible
- switch the observer picker to self
- verify the button is hidden
- log in as a student
- go to dashboard
- verify "Switch to new dashboard" button is visible

Change-Id: I30182bcee184794c264ef59dd2266112dec3d558
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406646
Reviewed-by: Sarah Gerard <sarah.gerard@instructure.com>
QA-Review: Sarah Gerard <sarah.gerard@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Product-Review: Zoe Lubitz <zoe.lubitz@instructure.com>
The multiple_root_accounts plugin was already changed to use pv5
so this change will have no effect.

Test Plan
Check that PageView functionality has not changed.

flag=none
refs PVIEW-1004

Change-Id: I7ab14d9594b9829f195b2205b995a9b527e83d3a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405816
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Robert Sznyida <robert.sznyida@instructure.com>
Reviewed-by: Peter Michaleczky <peter.michaleczky@instructure.com>
Product-Review: Robert Sznyida <robert.sznyida@instructure.com>
closes IMP-7330
flag=institutional_tags

Test Plan:
 - Use SIS import to import all inst tagging content
 - Run the separate export for them.
 - Run the provisioning export for them.
 - Both should be correct.

Change-Id: I1eafb88b15eac7d087dfa91f7b78485fb17cc273
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406865
Reviewed-by: Kristof Mehes <kristof.mehes@instructure.com>
Reviewed-by: David Hajnal <david.hajnal@instructure.com>
QA-Review: David Hajnal <david.hajnal@instructure.com>
Product-Review: David Hajnal <david.hajnal@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
- Make Width and Height input labels visible
  instead of screen-reader-only
- Remove redundant "Custom width and height
  (Pixels)" heading
- Update FormFieldGroup description to
  "Custom Dimensions" (screen-reader-only)
- Fix lock icon alignment between inputs
- Fix focus ring overflow causing horizontal
  scroll

fixes ARC-11311
flag=none

test plan:
- open Studio Media Options tray
- select custom dimensions
- verify Width and Height labels are visible
- verify lock icon is centered between inputs
- focus each input, verify no horizontal scroll

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change-Id: I85291a80a8cf0d33f88ce1ecbb223e82c4213dca
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406757
Reviewed-by: Kristóf Baján <kristof.bajan@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Kristóf Baján <kristof.bajan@instructure.com>
Reviewed-by: Zoltan Dalmadi <zoltan.dalmadi@instructure.com>
Product-Review: Patrik Gerzsenyi <patrik.gerzsenyi@instructure.com>
Bump @instructure/studio-player to 1.10.0 which
adds studio_transcript_editing track event for
inline transcript editing. Wire it to Pendo
behind rce_asr_captioning_improvements flag:

- canvas_transcript_editing (enter_edit_mode,
  segment_edited, autosave_succeeded,
  autosave_failed) with user roles attached

Also fixes CSS issues introduced by the player
upgrade: loading state and transcript editing
layout now render correctly.

refs ARC-11580
flag=rce_asr_captioning_improvements

test plan:
- Enable rce_asr_captioning_improvements flag
- Embed a media with Show Rolling Transcript
  enabled and open it in RCE Editor
- Verify loading state displays correctly
  (no blank screen or broken layout)
- Click Edit Transcript and edit a segment
- Verify transcript editing UI renders correctly
- Verify Pendo events fire with correct params
  via console.log in trackPendoEvent:
  - enter_edit_mode on clicking edit
  - segment_edited on saving a line
  - autosave_succeeded / autosave_failed
    depending on network outcome
- Confirm roles array is included in the event

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Change-Id: I7229067e33c42def7c19d66db6351815e570ae46
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406866
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Tamas Jakli <tamas.jakli@instructure.com>
Reviewed-by: Kristóf Baján <kristof.bajan@instructure.com>
QA-Review: Kristóf Baján <kristof.bajan@instructure.com>
Product-Review: Jozsef Gubicza <jozsef.gubicza@instructure.com>
test plan:
- include `docker-compose/rdbg.override.yml` in your `.env` file.
- then `inst canvas restart --debug` from the terminal
- put a breakpoint in user.rb#sortable_name
- lunch "Attach with rdbg to jobs server (tcp 12356)" debug config
- from the rails console trigger
a delayed job `User.first.delay.sortable_name`
- the code execution should stop at your breakpoint

Change-Id: I30ffe489932d859e7f14029f2727c5e4ff6a0af1
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406762
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: James Butters <jbutters@instructure.com>
Build-Review: James Butters <jbutters@instructure.com>
QA-Review: Adrián Grúber <adrian.gruber@instructure.com>
Product-Review: Adrián Grúber <adrian.gruber@instructure.com>
test plan:
- run `inst canvas restart --debug`
- choose any rspec tests case
- put a breakpoint on one of the lines
- run the test with "Debug Current Spec (Docker)"
debug config
- the execution should stop at the breakpoint.

Change-Id: I0c5f0e39c3f9fcd2decc81a4613794a5d9a1062c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406860
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: James Butters <jbutters@instructure.com>
QA-Review: Adrián Grúber <adrian.gruber@instructure.com>
Product-Review: Adrián Grúber <adrian.gruber@instructure.com>
This index improves performance of the `update_learning_outcome_results`
query from ~6 minutes down to ~50ms.

flag = none
closes: QO-1394

Change-Id: I8c3a4f2a44455a6004ca0300ef197e16bfd6b5cf
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406484
Reviewed-by: Cody Cutrer <cody@instructure.com>
Migration-Review: Cody Cutrer <cody@instructure.com>
QA-Review: Hossam Aladdin <hossam.alaaeldin@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Product-Review: András Maróy <andras.maroy@instructure.com>
dwilli77 and others added 28 commits April 29, 2026 17:21
GraderErrors were displayed directly to users in the
auto_grade_orchestration flow, but the grade_service
was wrapping all errors — including internal Ruby errors
and verbose Cedar API responses — as GraderErrors. This
caused technical stack traces and internal details to
leak to users.

Now only known-safe Cedar error subclasses surface their
messages to users, mapped to grading-specific copy.
The base CedarClientError and all unexpected errors log
their details and raise a generic user-safe message.
The criteria mismatch error likewise logs its count
details instead of exposing them.

refs EVAL-6799
flag=project_lhotse

test plan:
Setup:
- Set up a course with an assignment, rubric,
  and a student submission eligible for auto-grading

Testing:
- Trigger auto-grading on a submission that exceeds
  the Cedar content length limit and verify the user
  sees "The submission is too long to be graded
  automatically." rather than a raw Cedar message
- Trigger auto-grading when Cedar's rate limit is
  hit and verify "Grading is temporarily unavailable.
  Please try again later."
- Simulate a Cedar API error that doesn't match a
  known subclass and verify the user sees a generic
  message, not internal Cedar API details

Change-Id: If349e5a07f0104b6a535cf1f512d0e06da44c6fe
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406489
Reviewed-by: Rajmund Csehil <rajmund.csehil@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Chris Soto <christopher.soto@instructure.com>
QA-Review: Chris Soto <christopher.soto@instructure.com>
Product-Review: Yasi Afsharnive <yasaman.afsharnive@instructure.com>
if a grade was zero, it was displayed as a dash in
the individual gradebook

closes EVAL-6516
flag=none

test plan:
- set up an assignment to use a grading scheme
  -- ensure 0% is covered in the scheme
- grade that assignment as a zero
- verify that the letter grade is displayed correctly
in the Student Information section of the individual gradebook

Change-Id: Ief85b7bdf38ed9ace698680b34308e56b9a6156d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406325
Reviewed-by: Chris Soto <christopher.soto@instructure.com>
Reviewed-by: Spencer Olson <solson@instructure.com>
QA-Review: Derek Williams <derek.williams@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Product-Review: Yasi Afsharnive <yasaman.afsharnive@instructure.com>
When a graded discussion uses checkpoints, grade change
events are recorded against each SubAssignment ID, not
the parent assignment. Filtering gradebook history by
the parent assignment returned no results because the
query used an exact match on the parent ID.

When the selected assignment is a checkpoint parent,
expand the query to include the parent and all active
sub-assignment IDs using an IN clause via the existing
for_scope_conditions path. Grader and student filters
are still applied when provided.

fixes EVAL-5785
flag=discussion_checkpoints

Test plan:
Setup:
- Have a course with at least one student enrolled
- Create a graded discussion with checkpoints enabled
  and publish it
- Grade the student on both checkpoints

Testing:
- Go to Gradebook History for the course
- In the Artifact filter, search for and select the
  discussion topic
- Click Filter
- Verify grade change events are returned for both
  checkpoints (Reply to Topic, Required Replies)
- Re-filter adding a Grader and verify only events
  for that grader are returned
- Re-filter adding the Student and verify only events
  for that student are returned
- Verify a non-checkpoint assignment still works
  correctly in the Artifact filter

Expected Results:
- Checkpoint grade changes appear when filtering by
  the parent discussion assignment
- Grader and student filters narrow results correctly
- Non-checkpoint assignments are unaffected

Change-Id: I9a5cbfbed92f29ff05edbf249805a15c1d73cf6c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406665
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Chris Soto <christopher.soto@instructure.com>
Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com>
QA-Review: Derek Williams <derek.williams@instructure.com>
Product-Review: Yasi Afsharnive <yasaman.afsharnive@instructure.com>
this commit fixes the AssignmentPointsDifferenceModal from not rendering
when a user creates a rubric with points possible that is different from
the assignment points possible on the assignment's page. The issue was
that the check for whether the points were different was including a
check for whether there was already an active rubric so it only
displayed when updating the rubric on the assignment

fixes EVAL-6830
flag=enhanced_rubrics

test plan:
- go to the assignment's show page and verify that when creating a new
  rubric for the assignment that if the points are different from the
  assignment points possible and the "Use for assignment grading"
  checkbox is checked that the AssignmentPointsDifferenceModal renders
- after save, verify that the AssignmentPointsDifferenceModal is also
  rendered if you edit that rubric with points different.
- remove the rubric from the assignment.
- create a new rubric and verify that if you create a rubric with points
  different and do not have the "Use for assignment grading" checkbox
  checked that the AssignmentPointsDifferenceModal does not render.
- go to the /rubrics page and verify that when creating or updating a
  rubric that it never triggers the AssignmentPointsDifferenceModal.

Change-Id: Icb045078138c76222f9b51712f9f05814a4ad53a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407475
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
QA-Review: Derek Williams <derek.williams@instructure.com>
Product-Review: Yasi Afsharnive <yasaman.afsharnive@instructure.com>
the file referenced was removed in g/261784

actually, the file referenced never existed in that location;
the comment was updated to reference ui/features in g/258807,
which landed a week after the file was deleted from app/coffeescripts

flag=none
test plan: N/A
refs FOO-6341

Change-Id: Ib6c83f41adfcace929a8b8c15faa59deb51c4753
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407617
Reviewed-by: August Thornton <august@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Jeremy Stanley <jeremy@instructure.com>
Product-Review: Jeremy Stanley <jeremy@instructure.com>
When a student submits a new attempt on an assignment, we want to keep
the AttachmentAssociations from previous attempts around. This moves us
towards a future where we use AttachmentAssociation-based auth checks
to determine if a submission is associated with an attachment.

Note that this change does not impact the returned attachments from
Submission#attachments. That will continue to only return attachments
from the most recent attempt.

closes GROW-234
flag=none

[fsc-timeout=75]
[fsc-node-count=10]

Test Plan 1:
1. turn OFF "Assignment Enhancements - Student"
2. create a file upload assignment
3. submit File A as a student. then submit again, but submit File B.
4. Go to /courses/:id/assignments/:assignment_id for the assignment,
   as the student
5. Notice you only see a "Download File B" link in the sidebar, not a
   "Download File A" link.

Test Plan 2:
1. create a file upload assignment
2. submit File A as a student. then submit again, but submit File B.
3. Go to /graphiql as a site admin user
4. Make sure the following request only returns File B

query MyQuery {
  submission(
    userId: <the student id>,
    assignmentId: <the assignment id>
  ) {
    attachments {
      displayName
      _id
    }
  }
}

Change-Id: Ibc15fb29f9b3fa26594b4785c852eaf0b442122a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405710
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Rajmund Csehil <rajmund.csehil@instructure.com>
QA-Review: Rajmund Csehil <rajmund.csehil@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
Adds accessible label to IconPeerReviewLine so
screen readers can identify the icon in the
student peer reviews list.

closes EGG-2375
flag=peer_review_allocation_and_grading

QA: https://instructure.atlassian.net/browse/EGG-2375?focusedCommentId=2912334

test plan:
- Navigate to an assignment with peer reviews
- Open student view and check the peer reviews
  section
- Inspect the HTML via the dev tools and verify that the SVG has the aria-label "Peer Review"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Change-Id: Id1fcd277c5ce026a2d8ee07a70fd8e4c7bcf36ce
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407626
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Martin Yosifov <martin.yosifov@instructure.com>
QA-Review: Martin Yosifov <martin.yosifov@instructure.com>
Product-Review: Angela Gomba <angela.gomba@instructure.com>
this commit refactors the rubric form to not use nested tables in the
criteria container. it will instead be seperate sections with headers
for each criteria. it also fixes the display and responsiveness of the
Generate Criteria buttons so that they display correctly and wrap
responsively on smaller screens.

fixes EVAL-6753
fixes EVAL-6755
flag=enhanced_rubrics

test plan:
- open the rubric form page and add a criteria, an outcome criteria,
  and a couple AI generated criteria.
- verify that the criteria are all displayed correctly
- make the criteria responsive down to 320px and verify that they are
  still displayed correctly
- verify that the GeneratedCriteriaHeader component renders properly and
  that the contents of the header wrap responsively as well.
- verify that the Generate Criteria button for an individual criterion
  is displayed correctly and becomes added to the action menu for that
  criterion when the viewport is under 550px
- verify that both Generate Criteria buttons correctly open and close
  the RegenerateCriteriaModal and that the modal closes correctly when
  cancelling or regenerating criteria.

Change-Id: I6302148ee5bceca41e16664fc1ed7dbe9f06e114
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405700
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
Reviewed-by: László Sipula <laszlo.sipula@instructure.com>
QA-Review: László Sipula <laszlo.sipula@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
flag=ai_experiences
fixes EGG-336

implements tabbed view to match designs
Removes AI Analysis section (will be
re-introduced once we get real AC)
refactors frontend code to fix linter errors
removes backend code used only by
old ai conversations route

also: removes AI analysis, as it was a POC.
it will be reintroduced when PM comes up
with new Analysis AC

test plan:
- jenkins passes
- see demo video in ticket
(it should give you a general idea of
what to test)

Change-Id: I1a34d2b1c7c0608df4c859d374cdb871e9bee766
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407602
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jason Anderson <jason.anderson@instructure.com>
QA-Review: Jason Anderson <jason.anderson@instructure.com>
Product-Review: Caleb Guanzon <cguanzon@instructure.com>
pass ENV.disable_keyboard_shortcuts to the speedgrader context so
the new speedgrader can respect the user's keyboard shortcut preference.

fixes EVAL-6474
flag=none

test plan:
- go to account settings and enable "Disable Keyboard Shortcuts"
- open speedgrader with the new speedgrader enabled
- press J or K
- verify student does not navigate

Change-Id: I42dc5d966e59ca5dcd6ce2ddfbc4d42c28e79116
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406423
Reviewed-by: Chris Soto <christopher.soto@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
QA-Review: Derek Williams <derek.williams@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
Returns five submission counts for a single assignment
scoped to the teacher calling the API: on_time, late, and
resubmitted needs-grading pills, plus submitted and total
enrollment counts.

For moderated assignments before grades are published,
applies the same provisional-grade exclusion used by
NeedsGradingCountQueryOptimized so all five metrics
reflect what is on this teacher's plate.

Wires the counts into the todo item API serializer
alongside the existing needs_grading_count field.

refs EGG-2561
flag=educator_dashboard

test plan:
- bin/rspec spec/models/assignments/teacher_todo_metrics_query_spec.rb
- bin/rspec spec/models/assignments/needs_grading_count_query_spec.rb
- bin/rspec spec/apis/v1/todo_items_api_spec.rb

Change-Id: I9e3da4cb911984f34b4cb5d1bebc4f1611a06810
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407562
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Martin Yosifov <martin.yosifov@instructure.com>
QA-Review: Martin Yosifov <martin.yosifov@instructure.com>
Product-Review: Jason Gillett <jason.gillett@instructure.com>
Move reusable API, query, translation, and theme
code from ui/features/notebook/ into the new
ui/shared/notebook/ package so the upcoming
notebook_index feature can import from a single
shared location.

closes LX-4122
flag=none

test plan:
- open a wiki page with notebook feature enabled
- verify notebook button appears and tray opens
- verify highlights and note saving still work

Change-Id: I51bf286bce892fe85732fe4f8b545118961a1496
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407329
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Eric Saupe <eric.saupe@instructure.com>
QA-Review: Eric Saupe <eric.saupe@instructure.com>
Product-Review: Sarah Gerard <sarah.gerard@instructure.com>
Replace Journey-based study tools with a Canvas
endpoint that calls Cedar directly for Summarize,
Quiz me, and Flashcards. Journey plumbing removed
from the study_assist path.

closes LX-4114
flag=study_assist

test plan:
- enable study_assist in a course and sign in as
  a student
- open a wiki page and click the study tools
  button
- verify chips show Summarize, Quiz me,
  Flashcards (per per-tool feature flags)
- click Summarize and confirm a summary renders
- click Quiz me and Flashcards and confirm they
  render
- click regenerate on Quiz / Flashcards and
  confirm a new call is made
- open a course file (PDF or text) and repeat
- disable study_assist or each per-tool flag and
  confirm the tools hide or return an error

Change-Id: Ia9c7b53d13a0e6991a72bbfcf0635d81e5576958
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407249
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Sarah Gerard <sarah.gerard@instructure.com>
QA-Review: Sarah Gerard <sarah.gerard@instructure.com>
Product-Review: Eric Saupe <eric.saupe@instructure.com>
closes: EGG-2540
flag=educator_dashboard

test plan:
- enable educator_dashboard on default account
- as a teacher, visit / and confirm the
  educator dashboard renders
- as a student, visit / and confirm it does
  not render

Change-Id: I15cd02dd6f04a8d9448573706a82cb4f4259e1e7
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407599
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jason Gillett <jason.gillett@instructure.com>
QA-Review: Jason Gillett <jason.gillett@instructure.com>
Product-Review: Ferenc Marcsó <ferenc.marcso@instructure.com>
  Cascade-restore queries filter by workflow_state='deleted'
  and updated_at to find rows archived in the same operation.
  Without partial composite indexes these scans grow with
  total deleted rows. Add postdeploy partial indexes on
  (institutional_tag_id, updated_at) and
  (category_id, updated_at) to keep restore O(matched rows).

  refs IMP-7422
  flag=none

  test plan:
  - run db:migrate; verify both indexes exist
  - archive a category with tags + associations
  - restore the category; confirm cascade restores
    associated tags and associations
  - EXPLAIN cascade_restore_associations_for query uses
    idx_inst_tag_assoc_tag_archived_updated_at

Change-Id: If678db8dc0f1455bad4b61c90ef5d0512d4ece88
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407569
Reviewed-by: Norbert György <norbert.gyorgy@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Cody Cutrer <cody@instructure.com>
Migration-Review: Cody Cutrer <cody@instructure.com>
QA-Review: David Hajnal <david.hajnal@instructure.com>
Product-Review: David Hajnal <david.hajnal@instructure.com>
Hover state should be driven by actual cursor
position, not per-cell enter/leave events which
browsers drop on fast movement.

fixes OUTC-783
flag=improved_lmgb

test plan:
- open Learning Mastery Gradebook
- sweep cursor quickly across multiple
  outcome bar charts
- verify only one expand button is visible
  at any time
- click expand and confirm the popover
  still opens correctly

Change-Id: Id679125072712e26331d6e9aae1c7fea28401669
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407488
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Balázs Buri <balazs.buri@instructure.com>
Reviewed-by: Balázs Buri <balazs.buri@instructure.com>
Product-Review: Sam Garza <sam.garza@instructure.com>
When switching to LMGB via ?view=learning_mastery, render
the correct template directly instead of redirecting to
/gradebook. The redirect + re-read pattern was unreliable:
if the DB read in the second request returned stale data
(e.g., read replica lag), Traditional Gradebook would show
instead of LMGB.

fixes OUTC-784
flag=outcomes_gradebook

test plan:
- Go to Traditional Gradebook for a course
- Open the gradebook dropdown menu
- Click "Learning Mastery Gradebook"
- Verify LMGB loads consistently (no intermittent
  Traditional Gradebook reload)

Change-Id: I0eada5c063c3f40bc789b1ce95059f71d705118c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407516
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Balázs Buri <balazs.buri@instructure.com>
QA-Review: Balázs Buri <balazs.buri@instructure.com>
Product-Review: Sam Garza <sam.garza@instructure.com>
Implementation of E2E tests, consisting of tests for:
-missing table caption rule
-missing table headers rule
-missing table header scope rule

closes RCX-5005
flag=a11y_checker

[fsc-timeout=75]
[fsc-node-count=10]

test plan:
- tests should pass

Change-Id: I4b65fc7e155fecaefbb37755f0a6e9a06306fcb9
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407512
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Marta Nagy <marta.nagy@instructure.com>
QA-Review: Adam Zoltan Jelenszky <adam.jelenszky@instructure.com>
Product-Review: Adam Zoltan Jelenszky <adam.jelenszky@instructure.com>
closes RCX-5073

test-plan:
-pipeline passes
-open http://canvas-web.inseng.test/graphiql
-go to course endpoint
-execute a query to show the files
-both size, and size_bytes should work

Change-Id: Ib143bf5bc78f259072878d419e9f2b41960b7a33
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407590
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Rajmund Csehil <rajmund.csehil@instructure.com>
QA-Review: Ferenc Marcsó <ferenc.marcso@instructure.com>
Product-Review: Ádám Máté <adam.mate@instructure.com>
closes: EGG-2452
flag=educator_dashboard

test plan:
- enable educator_dashboard and
  a11y_checker_account_statistics on the account
- GET the educator a11y statistics endpoint
  (users/:id/educator_accessibility_course_statistics)
  with no include[]: rows omit course_name,
  course_code, published, closed_issue_count
- adding ?include[]=closed_issue_count
  &include[]=course_details includes those fields
- as a student, the endpoint returns 403
- as a teacher in only completed/deleted courses,
  the endpoint returns 403
- POST users/:id/educator_accessibility_course_scan
  as a teacher returns 200; as a student, 403

Change-Id: Iad2793c951271ac8d14ff1bf7c4c9dc4d7bdb28c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407655
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Dániel Török <daniel.torok@instructure.com>
Reviewed-by: Zsolt Mester <zsolt.mester@instructure.com>
QA-Review: Zsolt Mester <zsolt.mester@instructure.com>
Product-Review: Ferenc Marcsó <ferenc.marcso@instructure.com>
Move AssignmentPostingPolicyTray to ui/shared/ so
it can be used from both the regular and individual
gradebook without violating feature interdependence
rules.

Add a "Grade Post Policy" button to AssignmentActions
in the individual gradebook that opens the tray.

closes EVAL-6228
flag=none

test plan:
- Open the individual gradebook
- Select an assignment
- Confirm "Grade Post Policy" button appears below
  Curve Grades
- Click the button and confirm the tray opens with
  the assignment name in the header
- Save a policy change and confirm the success alert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Change-Id: Iba13726eacba29007c1345b8d36acc6839963744
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405769
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jacob DeWar <jacob.dewar@instructure.com>
QA-Review: Jacob DeWar <jacob.dewar@instructure.com>
Reviewed-by: Chris Soto <christopher.soto@instructure.com>
Product-Review: Yasi Afsharnive <yasaman.afsharnive@instructure.com>
This reverts commit 436d7c3.

Reason for revert: This change causing regression issues, for
example site admin could not access a11y features.

Change-Id: I8b552e9a1cd2715350af5a2107a34d08563a9441
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407437
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Zsolt Mester <zsolt.mester@instructure.com>
QA-Review: Zsolt Mester <zsolt.mester@instructure.com>
Product-Review: Ferenc Marcsó <ferenc.marcso@instructure.com>
Implementation of E2E tests, consisting of tests for:
-low contrast issues with small text
-low contrast issues with large text

closes RCX-5002
flag=a11y_checker

[fsc-timeout=75]
[fsc-node-count=10]

test plan:
- tests should pass

Change-Id: I9b19cbd9b9f5966492925b391a094eacd2744f20
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407600
Reviewed-by: Marta Nagy <marta.nagy@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
QA-Review: Adam Zoltan Jelenszky <adam.jelenszky@instructure.com>
Product-Review: Adam Zoltan Jelenszky <adam.jelenszky@instructure.com>
User.courseProgression returned null when queried via
enrollments → course → usersConnection across more
than one course. Move context.scoped_merge!(course:)
out of the preload_course_permissions.then block so
its scoped path is attributed to the resolver, not
the deferred batch flush.

fixes LX-4162
flag=none

test plan:
- as a learner enrolled in 2+ module-based courses
  with completion requirements, run the multi-course
  GraphQL query from the ticket
- verify courseProgression.requirements is populated
  for every course (not null)
- single-course query still returns progression
- REST progress endpoint still works

Change-Id: Iadd785788e6c6e153a5067fc1e2973c2e31b0fe6
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407576
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Sarah Gerard <sarah.gerard@instructure.com>
QA-Review: Sarah Gerard <sarah.gerard@instructure.com>
Product-Review: Sarah Gerard <sarah.gerard@instructure.com>
The "Instructor Score" / "Peer Review Score" label in
the rubric assessment panel was overflowing and
overlapping adjacent content when translated into
languages with longer strings (e.g., Norwegian).

Wrapped the label in TruncateText so it truncates
gracefully when space is constrained, and added a
Tooltip that appears on hover only when the text is
actually truncated, preserving the full label for
accessibility.

Changes:
- Import TruncateText and Tooltip components
- Track truncation state via onUpdate callback
- Render Tooltip conditionally based on truncation
- Adjust margin when label is truncated

fixes EVAL-5857
flag=none

Test plan:
Setup:
- Enable a course with peer review assignments
- Create a rubric and attach it to the assignment
- Open Canvas in English and in Norwegian
  (Account Settings > Language)

Testing:
- In English: verify "Instructor Score" label renders
  normally with no truncation or tooltip
- Switch language to Norwegian and reopen the rubric
  assessment panel
- Verify the label truncates instead of overflowing
  into adjacent content
- Hover over the truncated label and verify a tooltip
  appears showing the full translated label text
- Verify the layout does not shift or break for other
  rubric elements
- Repeat for peer review rubric and verify
  "Peer Review Score" behaves the same way

Expected Results:
- No text overlap in any language
- Tooltip only appears when label is actually truncated
- English labels are unaffected and render normally
- Layout remains stable across both score label types

Change-Id: I1453fcd3192b85ce32c27140f7873e9b0012d664
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407478
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Chris Soto <christopher.soto@instructure.com>
Reviewed-by: Derek Williams <derek.williams@instructure.com>
Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com>
QA-Review: Chris Soto <christopher.soto@instructure.com>
QA-Review: Jacob DeWar <jacob.dewar@instructure.com>
Product-Review: Cameron Ray <cameron.ray@instructure.com>
Screen reader users navigating the caption list now hear
the status (Processing/Failed) when focusing a language
name, satisfying WCAG 1.3.1.

refs ARC-11503
flag=rce_asr_captioning_improvements

test plan:
- open Caption Manager, trigger auto-captioning
- verify screen reader announces status with
  the language name
- verify no aria-describedby in ready state

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change-Id: I27e5e2d9d0ef1b202d16e823de112ac0ca1c8008
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405975
Reviewed-by: Tamas Jakli <tamas.jakli@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jozsef Gubicza <jozsef.gubicza@instructure.com>
QA-Review: Jozsef Gubicza <jozsef.gubicza@instructure.com>
Product-Review: Patrik Gerzsenyi <patrik.gerzsenyi@instructure.com>
Change-Id: I08bb9f45154aeec6c199a5fc3c000e5673a6e0e2
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407679
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Change-Id: I51dbde60f0a52a1a1a9f90190d3006c2649feb65
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407681
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
@braysch braysch force-pushed the jab/live-events-classic-quiz-no-assn-new-event-types branch from d83c5e9 to 414f36c Compare May 6, 2026 20:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.