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:
- The
Eventmodel/table does not have apackfield - The
source_reffield refers to the sensor that generated the event, not a pack - 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 tabletrigger_ref(TEXT) - Trigger reference (e.g., "core.webhook")source(BIGINT) - Foreign key to sensor tablesource_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
-
Column Header: Changed from "Pack" to "Source"
- Line 231:
<th>Pack</th>→<th>Source</th>
- Line 231:
-
Cell Display: Improved formatting to match other columns (Trigger, Rule)
- Before: Simple text display of
source_refor "—" - After: Structured display showing both source reference and ID
- Shows "No source" in gray italic when
source_refis null
- Before: Simple text display of
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 = nulldisplay "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.