instructure/canvas-lms · error · GraphQL::ExecutionError
invalid filter keys for course work widget: #
Error message
invalid filter keys for course work widget: #{invalid_keys.join(", ")} What it means
The course work widget filter hash permits exactly two keys: "selectedCourse" and "selectedDateFilter". validate_course_work_filters! raises this GraphQL::ExecutionError when any additional or unknown key is present in the filters hash.
Solutions
- Remove all keys other than "selectedCourse" and "selectedDateFilter" from the filters hash
- Use the exact key names "selectedCourse" and "selectedDateFilter"
- Extend the whitelist in validate_course_work_filters! only if a new key is intentionally added
Example fix
// before
filters: { "selectedCourse": "all", "dateFilter": "submitted" }
// after
filters: { "selectedCourse": "all", "selectedDateFilter": "submitted" } Defensive patterns
Strategy: validation
Validate before calling
const allowedKeys = ["selectedCourse", "selectedDateFilter"];
const invalid = Object.keys(filters).filter((k) => !allowedKeys.includes(k));
if (invalid.length) throw new Error(`invalid filter keys for course work widget: ${invalid.join(", ")}`); Type guard
const isCourseWorkFilterShape = (f) => f && Object.keys(f).every((k) => ["selectedCourse","selectedDateFilter"].includes(k));
Prevention
- Define a CourseWorkFilters type and construct payloads only through it
- Check for key renames when refactoring client code
- Do not merge other widgets' filter objects into course work config
When it happens
Trigger: Sending a course work widget update with filters like {"selectedCourse": "all", "selectedDateFilter": "missing", "showUngraded": true} or {"dateFilter": "submitted"}.
Common situations: Key renamed on the client (e.g. "dateFilter" vs "selectedDateFilter"); piggy-backing extra settings into the filters hash; copying filters from another widget type.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- invalid filter keys for announcements widget: #
- invalid filter keys for todo list widget: #
- A maximum of 50 assessees can be provided at once
- A maximum of 50 assessors can be provided at once
- All ConversationMessages must exist within the same…
AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15).
Data as JSON: /api/errors/c4efded778179de0.
Report an issue: GitHub.
Appendix: source
Thrown at app/graphql/mutations/update_widget_dashboard_config.rb:143
def validate_course_work_filters!(filters)
if filters.key?("selectedCourse")
course_value = filters["selectedCourse"]
unless course_value.is_a?(String) && (course_value == "all" || course_value.match?(/^course_\d+$/))
raise GraphQL::ExecutionError, "selectedCourse must be 'all' or 'course_{id}'"
end
end
if filters.key?("selectedDateFilter")
date_filter = filters["selectedDateFilter"]
unless date_filter.is_a?(String) && VALID_DATE_FILTERS.include?(date_filter)
raise GraphQL::ExecutionError, "selectedDateFilter must be one of: #{VALID_DATE_FILTERS.join(", ")}"
end
end
invalid_keys = filters.keys - ["selectedCourse", "selectedDateFilter"]
unless invalid_keys.empty?
raise GraphQL::ExecutionError, "invalid filter keys for course work widget: #{invalid_keys.join(", ")}"
end
end
def validate_generic_filters!(filters)
filters.each_value do |value|
validate_filter_value!(value)
end
end
def validate_filter_value!(value)
return if value.nil?
case value
when String, Numeric, TrueClass, FalseClass
true
when Hash, ActionController::Parameters
value.each_value { |v| validate_filter_value!(v) }
when ArrayView on GitHub (pinned to 1c9f0bb801)