Files
attune/work-summary/2026-02-04-events-page-source-column-fix.md
2026-02-04 17:46:30 -06:00

3.7 KiB

Events Page: Fix Mislabeled "Pack" Column

Date: 2026-02-04 Type: Bug Fix Component: Web UI - Events Page

Problem

The Events page (/events) had a column labeled "Pack" that was displaying the source_ref field. This was misleading because:

  1. The Event model/table does not have a pack field
  2. The source_ref field refers to the sensor that generated the event, not a pack
  3. The column header did not match the data being displayed

Investigation

Database Schema

The event table has the following relevant fields:

  • trigger (BIGINT) - Foreign key to trigger table
  • trigger_ref (TEXT) - Trigger reference (e.g., "core.webhook")
  • source (BIGINT) - Foreign key to sensor table
  • source_ref (TEXT) - Sensor reference (e.g., "monitoring.webhook_sensor")
  • rule (BIGINT) - Foreign key to rule table (optional)
  • rule_ref (TEXT) - Rule reference (optional)

No pack field exists.

API Response

The EventSummary DTO includes:

pub struct EventSummary {
    pub id: Id,
    pub trigger: Option<Id>,
    pub trigger_ref: String,
    pub source: Option<Id>,
    pub source_ref: Option<String>,  // ← This is what was displayed
    pub rule: Option<Id>,
    pub rule_ref: Option<String>,
    pub has_payload: bool,
    pub created: DateTime<Utc>,
}

The source_ref is documented as "Source reference" with example "monitoring.webhook_sensor".

Solution

File Modified: attune/web/src/pages/events/EventsPage.tsx

Changes Made

  1. Column Header: Changed from "Pack" to "Source"

    • Line 231: <th>Pack</th><th>Source</th>
  2. Cell Display: Improved formatting to match other columns (Trigger, Rule)

    • Before: Simple text display of source_ref or "—"
    • After: Structured display showing both source reference and ID
    • Shows "No source" in gray italic when source_ref is null

New Display Format

{event.source_ref ? (
  <div className="text-sm">
    <div className="font-medium text-gray-900">
      {event.source_ref}
    </div>
    <div className="text-gray-500 text-xs">
      ID: {event.source || "N/A"}
    </div>
  </div>
) : (
  <span className="text-sm text-gray-400 italic">
    No source
  </span>
)}

Example Data

For timer-based events (common case):

{
  "id": 6123,
  "trigger_ref": "core.intervaltimer",
  "source_ref": null,  // No sensor, triggered by timer
  "rule_ref": "default.echo_every_second"
}

Display:

  • Trigger: core.intervaltimer (ID: 123)
  • Rule: default.echo_every_second (ID: 456)
  • Source: No source (gray italic)

For sensor-based events:

{
  "id": 789,
  "trigger_ref": "core.webhook",
  "source_ref": "monitoring.webhook_sensor",
  "rule_ref": "alert.on_webhook"
}

Display:

  • Trigger: core.webhook (ID: 111)
  • Rule: alert.on_webhook (ID: 222)
  • Source: monitoring.webhook_sensor (ID: 333)

Impact

  • User Experience: Column now accurately describes the data being displayed
  • Consistency: Source column now follows the same format as Trigger and Rule columns
  • Clarity: Users can now properly understand that the field represents the sensor source, not a pack
  • No Breaking Changes: Only UI label and formatting changed, no API or data model changes

Testing

Verified with live data:

  • Events with source_ref = null display "No source"
  • Column header correctly shows "Source"
  • Display format matches Trigger and Rule columns
  • No compilation errors or runtime issues

Future Considerations

The Source column could potentially be enhanced to:

  • Make sensor references clickable (link to sensor detail page)
  • Add filtering by source (similar to existing trigger filter)
  • Show source type/status indicators

However, these would be new features rather than bug fixes.