mirror of
https://github.com/jhd3197/ServerKit.git
synced 2026-11-03 10:36:45 +09:00
Incidents was showing the same idea twice: a converged "All incidents" table, and under it a second table headed FLEET ALERTS with its own Active/Acknowledged/ Resolved segment row. A host alert IS an incident whose source is a host alert — the SOURCE column already said so. FleetAlertsPanel is deleted (188 lines, and Incidents was its only importer); alerts are folded into the existing row merge with server -> subject, metric/value/threshold -> what happened, severity -> impact, status -> state. Ack and Resolve move into the row-actions cell, shown only for rows that have an alert id and are not resolved. The segment became an "Acknowledged" builtin view alongside the Active/Resolved ones that already covered its other two buckets. Config Templates: the Compliant/Drifted/Unknown KPI band and its progress bar are gone, replaced by a per-row Compliance column plus Drifted/Compliant builtin views. The band could say three assignments had drifted but never which template caused it; the column answers that per row. This needed the template payload to carry its own tallies, which is the same single query the bare assignment count already cost. Recycle bin: the All / domains / saved-views segment row is gone — those buckets are a filter on the Type column, and the Type column's own menu does it with live per-value counts and can be saved into a view. Settings tab panes now sit on the same card surface every other table in the app does. Users: Add User and Invite User move onto the chrome line next to the filter and "..." instead of each occupying a row of their own above its table. SSL certificates: was a card list with a KPI band, one tab away from /domains being a full table. Now a table with saved views (Expiring soon / Valid / Failed or missing), search, column filters and export. The leading tile takes the row's state too — a fixed green shield beside an expired certificate contradicted the Status cell next to it. Service detail: the Environment and Events tabs become tables with the inline chrome an inner tab gets. Fixes found by verification, in code this round touched: - ServerTemplates had four columns with a `value` accessor and no `render`, so DataTable fell back to row[key]: two rendered blank, one printed a raw array, and `services` printed a list of OBJECTS, which React refuses to render — that one took the whole tab down for any template declaring a service. Pre-existing, and invisible because the screenshot fixture sent `services: ['sshd']` as strings. The fixture now matches to_dict() so it cannot hide it again. - useTopbarChrome returns a ready `actions` value. All eight hoisting pages destructured only `portal` and dropped the fallback, so outside a tab group the filter button and "..." would have gone nowhere rather than inline. - sameViewState compares only the `page` keys a page still captures. Retiring a key (as the recycle bin just did) otherwise stranded every view a user had already saved with it, pinning "Unsaved" on with no way to clear it. - The environment tab's "Applies to" column was gated on the app's CURRENT compose services, so a variable targeting a since-renamed service showed nowhere and read as applying to everything. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>