* feat(server-detail): add online history tab
Render per-server online periods from GET /api/v1/server/:id/online-history:
summary card (current status, online rate, total in window, last active),
daily online-time bars, and the raw period list. Window selector offers
1d/7d/30d and locks options beyond the server's max_days; guests hitting
the 1d cap see a login hint. i18n keys added for all locales (zh-CN/zh-TW
translated, others fall back to English for Weblate).
* fix(online-history): keep selector pills above the sliding indicator
The active-indicator overlay sits at z-10 and intercepted clicks on the
day pills; wrap pills at z-20 like the existing PeriodSelector.
* feat(online-history): render daily online as 24h timeline with hover tooltips
每日在线卡片从整日占比进度条改为 0:00–24:00 整轴时间条:
每个在线时段按当日时刻定位为高亮分段,hover 显示起止时间与时长;
进行中时段以亮色高亮。卡片顶部新增共享刻度(0:00 / 12:00 / 24:00)。
* feat(online-history): regroup periods by day as expandable chip wall
Rework the Online tab per the chip-wall design: periods are grouped by
panel-timezone day with per-day totals, defaulting to the latest day with
"Expand more" revealing up to ten more groups per click, plus an
Online/Offline switch that derives offline chips as the window complement.
- respond to the backend panel timezone (timezone/tz_offset): dayjs 1.11
.tz(input, zone) ignores explicit offsets, so offset-bearing timestamps
are parsed first and converted afterwards; naive date strings keep the
zone-parse path (panelDay)
- guests falling back automatically: a rejected days>1 request locks 7d/30d
and retries at 1d instead of surfacing only a login prompt
- fix day-selector indicator landing on the wrong pill: useActiveIndicator
refs are stored by index, pass the map index not the day value
- disable Node experimental webstorage in vitest workers: Node >=25 ships a
broken global localStorage that shadows the jsdom one
- 14 locales: tabSwitch.Online + serverOnlineHistory.*
* feat(online-history): boxed summary stats with desktop/mobile layouts
* fix(online-history): align offline gaps, DST coordinates and ongoing chips
- extract pure timeline/grouping helpers into src/lib/online-history.ts
- clamp offline complements to day and window boundaries, so a gap can no
longer run into a later day's first online session
- use wall-clock coordinates and true next-midnight boundaries on DST days
- label only the segment ending at the live session end as Ongoing
- keep group totals equal to the visible chips for cross-day sessions
- keep period chips on one line and render next-midnight as 24:00
- add regression tests for multi-day offline gaps, window_start/window_end,
spring-forward/fall-back geometry and ongoing clipping
* style(online-history): lighten summary metrics and shorten rate bar
* feat(online-history): refine UI and unify daily history rendering
---------
Co-authored-by: Sam5440 <Sam5440@users.noreply.github.com>
Co-authored-by: hamster1963 <1410514192@qq.com>
When force_auth is on, the guest homepage still loads, but /api/v1/server
returns {"error":"ApiErrorUnauthorized"}. BackendErrorState treated that
the same as a down backend.
Match that error exactly and show a login title, description, and a
button to /dashboard. Other errors keep the old copy and the raw message.
zh-TW is unchanged: that file uses spaces, and biome would reformat the
whole translation.
index.html loaded two jsdelivr stylesheets synchronously in <head>, which
delayed first paint and failed outright on networks where the CDN is
unreachable. Drop font-logos (unused in src/) and bundle flag-icons
locally so Vite hashes the sprites and serves them from our own origin
with immutable cache headers.
Renders state.gpus[i] when the agent provides it, using the existing
formatBytes helper so it reads like the memory card. Older agents omit
the field and nothing changes.
Refs nezhahq/nezha#1235
feat: optimize GlobalMap component with useMemo for country data processing
feat: enhance ServerCard and ServerCardInline components with memoization
feat: improve ServiceTracker component by processing service data with useMemo
feat: add VirtualServerList component for efficient rendering of server lists
refactor: update Servers page to utilize VirtualServerList for better performance
test: add tests for DashCommand and GlobalMap components, including virtualization checks
* feat: implement scroll position management for main page navigation
* fix: import saveMainPageScrollPosition in ServerCard and ServerCardInline components
* feat: save scroll position when navigating to server from DashCommand
* fix: prevent restoring stale scroll positions without main page origin
- Changed websocket context to use `lastData` instead of `lastMessage` for better type safety and clarity.
- Updated components to handle the new websocket data structure, including `DashCommand`, `Header`, `ServerDetail`, and various chart components.
- Introduced lazy loading for `NotFound`, `ServerDetail`, and `NetworkChart` components to improve performance.
- Added skeleton loading states for `ServerDetail` to enhance user experience during data fetching.
- Updated tests to reflect changes in websocket data handling and component structure.
- Created tests for formatBytes function to ensure correct formatting of byte values.
- Implemented tests for InjectContext to validate resource injection and cleanup.
- Added tests for logo-class helpers to verify platform alias mappings.
- Developed tests for nezha-api functions to check API response handling.
- Introduced tests for static geographic data to validate country coordinates and GeoJSON structure.
- Created comprehensive tests for utility functions including date formatting and public note parsing.
- Added tests for Server page to ensure correct rendering and functionality.
- Implemented tests for simple pages including error handling and navigation.
- Set up testing environment with Vitest and configured coverage reporting.