From f011a40748599c82d9075e535a6aeb5ff9ec16be Mon Sep 17 00:00:00 2001 From: 2GT-Rich <107219997+2GT-Rich@users.noreply.github.com> Date: Sun, 23 Aug 2026 20:39:46 -0700 Subject: [PATCH] fix(dashboard): render the snooze button, and cap the things-to-handle list (v0.23.15-beta) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three faults in the same card, all layout. **Snooze rendered as an unreadable sliver.** The row is a three-column grid — severity bar, text, action — but carried four children once the snooze button was added in v0.23.10. The fourth wrapped onto an implicit second row and landed in column one, which is 3px wide, so the button was squeezed to nothing. The two buttons now share the third column in a flex wrapper, which is what the grid always assumed. Only the rendering was broken: the dismiss round-trip was verified end to end against the running instance — POST returns 201, the item leaves the list, the snoozed count rises, and DELETE restores it. **A long backlog pushed the rest of the dashboard off the page.** The list grew without bound, so a fleet with real problems displaced everything below it. It now caps at min(52vh, 460px) and scrolls, keeping the card a fixed part of the page. The snoozed-count footer stays outside the scroll area so it remains visible. **The card rendered at 57% width with dead space beside it.** It was the only child of a two-column grid left behind when quick actions moved to the header (#104) — the comment above it already claimed full width, which it had not been since. The empty column and its wrapper are gone. Co-Authored-By: Claude Opus 5 --- README.md | 2 +- backend/package.json | 2 +- frontend/package.json | 2 +- frontend/src/pages/DashboardPage.tsx | 75 ++++++++++++++++------------ frontend/src/version.ts | 2 +- 5 files changed, 46 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index e0cd2a0..0aacf07 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

- Version + Version License Docker TypeScript diff --git a/backend/package.json b/backend/package.json index 75a9c62..1e2d59f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "mikrotik-manager-backend", - "version": "0.23.14-beta", + "version": "0.23.15-beta", "description": "Mikrotik Network Management Platform - Backend API", "main": "dist/index.js", "scripts": { diff --git a/frontend/package.json b/frontend/package.json index 15fa436..e3ee6e6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "mikrotik-manager-frontend", - "version": "0.23.14-beta", + "version": "0.23.15-beta", "private": true, "type": "module", "scripts": { diff --git a/frontend/src/pages/DashboardPage.tsx b/frontend/src/pages/DashboardPage.tsx index 59cbd54..e25f768 100644 --- a/frontend/src/pages/DashboardPage.tsx +++ b/frontend/src/pages/DashboardPage.tsx @@ -804,10 +804,10 @@ function OperationsView({ )} - {/* Things to handle — full width now that quick actions live in the header */} -

- {/* Things to handle */} -
+ {/* Things to handle — genuinely full width. It previously sat as the only + child of a two-column grid left behind when quick actions moved to the + header (#104), so it rendered at 57% with an empty column beside it. */} +
+ {/* A fleet with a real backlog can generate dozens of these. Capping the + list and scrolling keeps the card a fixed part of the page instead of + something that grows without bound and displaces everything below. */} +
{thingsToHandle.length > 0 ? thingsToHandle.map((item, i) => (
{item.title}
{item.body}
- - {/* "Not now" rather than "never": an item that is genuinely resolved - stops being generated, so a dismissal is time-boxed (#102). */} - {item.fingerprint && ( + {/* Both buttons share the grid's third column. Placed as siblings + they made four children in a three-column grid, which wrapped + Snooze onto an implicit second row inside the 3px severity + column — where it rendered as an unreadable sliver. */} +
- )} + {/* "Not now" rather than "never": an item that is genuinely resolved + stops being generated, so a dismissal is time-boxed (#102). */} + {item.fingerprint && ( + + )} +
)) : (
@@ -870,13 +880,12 @@ function OperationsView({ Nothing needs attention
)} - {(insights?.dismissedCount ?? 0) > 0 && ( -
- {insights!.dismissedCount} snoozed — they return automatically if still true. -
- )} -
- +
+ {(insights?.dismissedCount ?? 0) > 0 && ( +
+ {insights!.dismissedCount} snoozed — they return automatically if still true. +
+ )} {/* Capacity + Security rollup */} diff --git a/frontend/src/version.ts b/frontend/src/version.ts index 7e6d621..13d120f 100644 --- a/frontend/src/version.ts +++ b/frontend/src/version.ts @@ -1 +1 @@ -export const APP_VERSION = 'v0.23.14 Beta'; +export const APP_VERSION = 'v0.23.15 Beta';