Commit Graph
456 Commits
Author SHA1 Message Date
you 3a8d92e39b Replace packet count limit with time window selector
- Add time window dropdown (15min default, up to 24h or All)
- Use 'since' param instead of fixed limit=10000
- Persist selection to localStorage
- Keep limit=50000 as safety net
2026-03-22 01:06:46 +00:00
you 0f8d63636b Increase default packet limit from 100 to 10,000
Filtering is client-side now, so load everything upfront.
2026-03-22 01:01:21 +00:00
you 132ab60e06 Fix header row observer display when filtering by observer 2026-03-22 00:57:55 +00:00
you c123ee731d Fix multi-select filters: client-side filtering, no unnecessary API calls
- Remove type/observer params from /api/packets calls (server ignores them)
- Add client-side type/observer filtering in renderTableRows()
- Change filter handlers to re-render instead of re-fetch
- Update displayed count to reflect filtered results
2026-03-22 00:57:11 +00:00
you 0fb586730b docs: update v2.4.0 release notes — multi-select filters, hex paths toggle, DB migration 2026-03-22 00:56:48 +00:00
you 7e304e60d5 fix: hex toggle calls renderTableRows (was undefined renderTable), rename to 'Hex Paths' with descriptive tooltip 2026-03-22 00:46:21 +00:00
you 9171eecc69 Drop legacy packets + paths tables on startup, remove dead code
Migration runs automatically on next startup — drops paths first (FK to
packets), then packets. Removes insertPacket(), insertPath(), all
prepared statements and references to both tables. Server-side type/
observer filtering also removed (client does it in-memory).

Saves ~2M rows (paths) + full packets table worth of disk.
2026-03-22 00:45:27 +00:00
you 552ba2f970 Add hex hash toggle to packets page filter bar 2026-03-22 00:34:46 +00:00
you 3ff29519b4 Fix multi-select filters (AND→OR) and add localStorage persistence
- Server: support comma-separated type filter values (OR logic)
- Server: add observer_id filtering to /api/packets endpoint
- Client: fix type and observer filters to use OR logic for multi-select
- Client: persist observer and type filter selections to localStorage
- Keys: meshcore-observer-filter, meshcore-type-filter
2026-03-22 00:34:38 +00:00
you 39c1782881 docs: tone down v2.4.0 release notes 2026-03-22 00:24:46 +00:00
you cbd13c00d6 docs: v2.4.0 release notes — The Observatory 2026-03-22 00:22:32 +00:00
you 4b1c1c3f22 Convert Observer and Type filters to multi-select checkbox dropdowns
- Replace single-select dropdowns with multi-select checkbox menus
- Add .multi-select-* CSS classes (reusable, styled like region filter)
- Observer: comma-separated IDs, shows count/name/All Observers
- Type: comma-separated values, shows count/name/All Types
- Bug fix: filter group children by selected observer(s) when expanded
- Close dropdowns on outside click
2026-03-22 00:21:41 +00:00
you 0d3b12d40a fix: sort help tooltip renders below icon instead of above (behind navbar) 2026-03-22 00:20:02 +00:00
you e000db438c fix: sort help tooltip uses real DOM element instead of CSS attr()
CSS content:attr() doesn't support newlines in any browser. Replaced
with a real <span> child element with white-space:pre-line, shown on
hover via .sort-help:hover .sort-help-tip { display: block }.
2026-03-22 00:17:04 +00:00
you 09f6f106ba fix: sort help uses CSS tooltip instead of title attribute
Native title tooltips are unreliable (delayed, sometimes not shown).
Replaced with CSS ::after pseudo-element tooltip using data-tip attr.
Shows immediately on hover with proper formatting.
2026-03-22 00:15:33 +00:00
you a299798b31 fix: sort help tooltip — set title via JS so newlines render
HTML entities like &#10; don't work inside JS template literals
(inserted as literal text). Setting .title via JS with actual \n
newlines works correctly in browser tooltips.
2026-03-22 00:13:03 +00:00
you 181fddf196 fix: ungrouped mode flattens observations into individual rows
When Group by Hash is off, fetches all observations for multi-obs
packets and flattens them into individual rows showing each observer's
view. Previously just showed grouped transmissions without expand arrows.
2026-03-22 00:12:16 +00:00
you 2ae467bc72 fix: region box alignment, column checkboxes, sort help, dark mode active btn
- Region filter container: remove margin-bottom, use inline-flex align
- Column dropdown checkboxes: 14x14px to match region dropdown
- Sort help ⓘ: use &#10; for newlines in title (\n doesn't render)
- Dark mode: .filter-bar .btn.active now retains accent background
  (dark theme override was clobbering the active state)
2026-03-22 00:08:00 +00:00
you a11ace77ac Polish filter bar: consistent sizing, logical grouping with separators, tooltips
- All filter-bar controls now exactly 34px tall with line-height:1 and border-radius:6px
- col-toggle-btn matched to same height/font-size as other controls
- Controls grouped into 4 logical sections (Filters, Display, Sort, Columns) with vertical separators
- Added title attributes with helpful descriptions to all controls
- Added sort help icon (ⓘ) with detailed tooltip explaining each sort mode
- Mobile responsive: separators hidden on small screens
2026-03-22 00:00:02 +00:00
you b1c2e817fa fix: shrink region dropdown checkboxes to 14px 2026-03-21 23:55:18 +00:00
you 3d31afd0ec fix: resolve hops after sort changes header paths
When sort updates header row path_json, new hop hashes may not be in
hopNameCache. Now resolves unknown hops before re-rendering.
2026-03-21 23:54:49 +00:00
you 28ac094d83 fix: normalize filter bar heights + widen region dropdown
All filter bar controls now share: height 34px, font-size 13px,
border-radius 6px, same padding. Region dropdown trigger matches
other controls, menu widened to 220px with white-space:nowrap to
prevent text wrapping.
2026-03-21 23:53:36 +00:00
you 8c4b3f029f fix: sort change fetches observations for all visible groups
When switching to a non-Observer sort, batch-fetches observations for
all visible multi-observation groups that haven't been expanded yet.
Header rows update immediately without needing manual expand.
2026-03-21 23:52:20 +00:00
you 3b1e16a1d6 feat: sort header reflects first sorted child + asc/desc for path & time
- Header row (observer, path) updates to match the first child after sort
- Path sort: ascending (shortest first) and descending (longest first)
- Chronological: ascending (earliest first) and descending (latest first)
- Observer mode unchanged
2026-03-21 23:49:01 +00:00
you fa7f1cf76a fix: region dropdown labels show 'IATA - Friendly Name' format
Dropdown items now display 'SJC - San Jose, US' instead of just
'San Jose, US'. Summary shows just IATA codes for brevity.
2026-03-21 23:47:45 +00:00
you b800d77570 fix: apply observation sort on all code paths that set _children
Sort was only applied in pktToggleGroup and dropdown change handler.
Missing from: loadPackets restore (re-fetches children for expanded
groups) and WS update path (unshifts new observations). Now all
three paths call sortGroupChildren after modifying _children.
2026-03-21 23:46:30 +00:00
you 7e0cd455ae fix: move observation sort to filter bar dropdown, save to localStorage
- Removed per-group sort bar links (broken navigation)
- Added global 'Sort:' dropdown in filter toolbar
- Persists to localStorage across sessions
- Re-sorts all expanded groups on change
2026-03-21 23:41:24 +00:00
you 4f66e377d1 feat: add Chronological sort mode for expanded packet groups
Pure timestamp order, no grouping — shows propagation sequence.
2026-03-21 23:32:05 +00:00
you 1877c49adc feat: observation sort toggle — Observer (default) or Path length
Two sort modes for expanded packet groups:
- Observer: group by observer, earliest first, ascending time within
- Path length: shortest paths first, alphabetical observer within

Sort bar appears above expanded children with bold active mode.
2026-03-21 23:31:21 +00:00
you 461fb7ee68 fix: trace page accepts route param (#/traces/HASH) 2026-03-21 23:17:32 +00:00
you 679f9a552f fix: deeplink uses observation id (not observer_id) + add trace link
- Deeplinks now use ?obs=<observation_id> which is unique per row,
  fixing cases where same observer has multiple paths
- Added '🔍 Trace' link in detail pane actions
2026-03-21 23:15:42 +00:00
you f1e3a57fcf fix: set header observer/path to earliest observation on DB load
During _loadNormalized(), observations load in DESC order so the first
observation processed is the LATEST. tx.observer_id was set from this
latest observation. Added post-load pass that finds the earliest
observation by timestamp and sets tx.observer_id/path_json to match.
2026-03-21 23:10:10 +00:00
you 1dc5daab67 fix: stop client WS handler from replacing header path with longest path
The WS handler was overwriting the group's path_json with the longest
path from any new observation. Header should always show the first
observer's path — individual observation paths are in the expanded rows.
2026-03-21 23:06:36 +00:00
you 8892fb0f66 docs: update v2.4.0 release notes with latest fixes 2026-03-21 23:03:13 +00:00
you 98a6cbd3b4 revert: undo unauthorized version bump 2026-03-21 23:01:57 +00:00
you ad6a796b35 Disable auto-seeding on empty DB - require --seed flag or SEED_DB=true
Previously db.seed() ran unconditionally on startup and would populate
a fresh database with fake test data. Now seeding only triggers when
explicitly requested via --seed CLI flag or SEED_DB=true env var.

The seed functionality remains available for developers:
  node server.js --seed
  SEED_DB=true node server.js
  node db.js  (direct run still seeds)
2026-03-21 23:00:01 +00:00
you 1b2f28cb5f Add observation-level deeplinks to packet detail page
When viewing a specific observation, the URL now includes ?obs=OBSERVER_ID.
Opening such a link auto-expands the group and selects the observation.
Copy Link button includes the obs parameter when an observation is selected.
2026-03-21 22:59:07 +00:00
you 2894c38435 fix: header row shows first observer's path, not longest path
Removed server-side longest-path override in /api/packets/:id that
replaced the transmission's path_json with the longest observation
path. The header should always reflect the first observer's path.
Individual observation paths are available in the observations array.
2026-03-21 22:58:37 +00:00
you 97be64353a fix: detail pane shows clicked observation data, not parent packet
When expanding a grouped packet and clicking a child observation row,
the detail pane now shows that observation's observer, SNR/RSSI, path,
and timestamp instead of the parent packet's data.

Child rows use a new 'select-observation' action that builds a synthetic
packet object by overlaying observation-specific fields onto the parent
packet data (no extra API fetch needed).
2026-03-21 22:47:01 +00:00
you 8ae7d7710b docs: v2.4.0 release notes 2026-03-21 22:44:31 +00:00
you b61b71635b fix: update observer_id, observer_name, path_json when first_seen moves earlier
When a later observation has an earlier timestamp, the transmission's
first_seen was updated but observer_id and path_json were not. This
caused the header row to show the wrong observer and path — whichever
MQTT message arrived first, not whichever observation was actually
earliest.
2026-03-21 22:43:18 +00:00
you 04a138eba3 tweak: bump chan-tag size from 0.8em to 0.9em with more padding 2026-03-21 22:33:14 +00:00
you f51db66775 feat: show channel name tag in packet detail column for CHAN messages 2026-03-21 22:27:51 +00:00
you 75d76cf68e fix: use correct field names for observation sort (observer_name, timestamp)
Subagent used observer/rx_at/created_at but API returns
observer_name/timestamp. Sort was comparing empty strings.
2026-03-21 22:26:39 +00:00
you 1e61e021ec cleanup: remove cracker package files and temp docs accidentally committed by subagent 2026-03-21 22:24:12 +00:00
you c4d6fb7cd3 Fix expanded packet group observation sorting: group by observer, earliest first 2026-03-21 22:22:44 +00:00
you 1158161e1a Fix channel list timeAgo counters: use monotonic lastActivityMs instead of ISO strings
- Track lastActivityMs (Date.now()) on each channel object instead of ISO lastActivity
- 1s interval iterates channels[] array and updates DOM text only (no re-render)
- Uses data-channel-hash attribute to find time elements after DOM rebuilds
- Simple formatSecondsAgo: <60s→Xs, <3600s→Xm, <86400s→Xh, else Xd
- Seed lastActivityMs from API ISO string on initial load
- WS handler sets lastActivityMs = Date.now() on receipt
- Bump channels.js cache buster
2026-03-21 22:21:28 +00:00
you 81f284e952 Fix duplicate observations in expanded packet group view
The insert() method had a second code path (for building rows from
packetData) that pushed observations without checking for duplicates.
Added the same dedup check (observer_id + path_json) that exists in
the other insert path and in the load-from-DB path.
2026-03-21 22:18:04 +00:00
you 6f64ed6b9b fix: tick channel timeAgo labels every 1s instead of re-rendering every 30s 2026-03-21 22:15:25 +00:00
you d51c7a780c fix: use current time for channel lastActivity on WS updates
packet.timestamp is first_seen — when the transmission was originally
observed. When multiple observers re-see the same old packet, the
broadcast carries the original (stale) first_seen. For channel list
display, what matters is 'activity happened now', not 'packet was
first seen 10h ago'.
2026-03-21 22:12:56 +00:00