diff --git a/src/components/HeartbeatBar.vue b/src/components/HeartbeatBar.vue
index 429ca9f91..ad133821e 100644
--- a/src/components/HeartbeatBar.vue
+++ b/src/components/HeartbeatBar.vue
@@ -7,11 +7,17 @@
class="beat-hover-area"
:class="{ 'empty': (beat === 0) }"
:style="beatHoverAreaStyle"
- :title="getBeatTitle(beat)"
+ :aria-label="getBeatAriaLabel(beat)"
+ role="status"
+ tabindex="0"
+ @mouseenter="showTooltip(beat, $event)"
+ @mouseleave="hideTooltip"
+ @focus="showTooltip(beat, $event)"
+ @blur="hideTooltip"
>
@@ -24,13 +30,27 @@
{{ timeSinceLastBeat }}
+
+
+
+
+
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index e0df74fde..0c9e97c2d 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -720,7 +720,7 @@ export default {
// Configure auto-refresh loop
feedInterval = setInterval(() => {
this.updateHeartbeatList();
- }, (this.config.autoRefreshInterval + 10) * 1000);
+ }, Math.max(5, this.config.autoRefreshInterval) * 1000);
this.updateUpdateTimer();
}).catch( function (error) {
@@ -806,7 +806,15 @@ export default {
clearInterval(this.updateCountdown);
this.updateCountdown = setInterval(() => {
- const countdown = dayjs.duration(this.lastUpdateTime.add(this.config.autoRefreshInterval, "seconds").add(10, "seconds").diff(dayjs()));
+ // rounding here as otherwise we sometimes skip numbers in cases of time drift
+ const countdown = dayjs.duration(
+ Math.round(
+ this.lastUpdateTime
+ .add(Math.max(5, this.config.autoRefreshInterval), "seconds")
+ .diff(dayjs())
+ / 1000
+ ), "seconds");
+
if (countdown.as("seconds") < 0) {
clearInterval(this.updateCountdown);
} else {
diff --git a/test/e2e/specs/status-page.spec.js b/test/e2e/specs/status-page.spec.js
index c8f548b60..1964f92b5 100644
--- a/test/e2e/specs/status-page.spec.js
+++ b/test/e2e/specs/status-page.spec.js
@@ -121,8 +121,8 @@ test.describe("Status Page", () => {
await expect(page.getByTestId("update-countdown-text")).toContainText("00:");
const updateCountdown = Number((await page.getByTestId("update-countdown-text").textContent()).match(/(\d+):(\d+)/)[2]);
- expect(updateCountdown).toBeGreaterThanOrEqual(refreshInterval); // cant be certain when the timer will start, so ensure it's within expected range
- expect(updateCountdown).toBeLessThanOrEqual(refreshInterval + 10);
+ expect(updateCountdown).toBeGreaterThanOrEqual(refreshInterval - 10); // cant be certain when the timer will start, so ensure it's within expected range
+ expect(updateCountdown).toBeLessThanOrEqual(refreshInterval);
await expect(page.locator("body")).toHaveClass(theme);