{# Vendored from opportunities/_table.html. Same wrapper, same ui-table-head-row + ui-table-row grammar, same click-to-sort header markup, same ui-signal-chip + ui-legend-dot chip styles. Deltas vs the opportunities table: - column set swaps "Issue" → "Reason", "Query Cost" → "Slot Wasted", "Last Detected" → "Last Failed", and drops "Partition / Cluster" (irrelevant on failures); - row click target → /failures/{hash_key}; - empty-state copy mirrors opportunities. #}
| {{ row.affected_dataset }} | {{ row.affected_object }} | {% if row.author_email %} {{ row.author_email }} {% else %} - {% endif %} | {% if row.last_error_reason %} {# Visible label is the humanised reason ("Invalid query" instead of "invalidQuery"); tooltip shows the live BigQuery error message when present, else the curated description, else the raw camelCase code so it stays grep-discoverable on hover. The Reason filter dropdown keeps the raw codes as the filter values for matching. #} {{ signal_chip( row.last_error_reason | bq_reason_humanize, color="rose", title=row.last_error_message or (row.last_error_reason | bq_reason_description) or row.last_error_reason ) }} {% else %} - {% endif %} | {% if row.query_workload_kind == 'build' %} {{ signal_chip("Build", color="brand", title="Latest job classified as build") }} {% elif row.query_workload_kind == 'consumption' %} {{ signal_chip("Consumption", color="teal", title="Latest job classified as consumption") }} {% else %} {{ signal_chip("Unclassified", color="slate", title="No exact local run job match was found for this group") }} {% endif %} | {{ row.slot_wasted_human }} | {{ row.last_detected_at.strftime("%d/%m/%Y") if row.last_detected_at else "-" }} | {% set _sugg = row.table_suggestion_count or 0 %} {% if _sugg > 0 %} {{ signal_chip(_sugg ~ " suggested", color="emerald", title=_sugg ~ " suggestion rule(s) fired across this query body - open the row to see each diff") }} {% endif %} |
No failures match your filters
{% endif %}