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

  1. Remove all keys other than "selectedCourse" and "selectedDateFilter" from the filters hash
  2. Use the exact key names "selectedCourse" and "selectedDateFilter"
  3. 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

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


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 Array

View on GitHub (pinned to 1c9f0bb801)