[READ-ONLY] Mirror of https://github.com/openstatusHQ/openstatus. 馃珫 Status page with uptime monitoring & API monitoring as code 馃珫 openstatus.dev
bun drizzle-orm monitoring monitoring-as-code nextjs observability on-call open-source shadcn-ui status-page statuspage synthetic-monitoring tinybird turso uptime uptime-checker uptime-monitor

feat(dashboard): empty states for data tables and charts (#2973) master

* feat(dashboard): empty states for data tables and charts Every list, chart slot and section now shares one empty-state kit: icon, what belongs here, why it is empty, one action, one escape hatch. Tables render it in the body under the real header with ghost rows; charts fill their slot at the chart's height so a resolving Tinybird fetch never shifts the page; a filter that matches nothing gets its own "No matches" row with a clear action. Metrics show an em dash instead of 100% / 0 ms / N/A when a window has no checks, a paused monitor keeps its history, and status report and maintenance sheets accept a controlled open so a page mounts one sheet for both its header and empty-state buttons. * fix(dashboard): address empty-state review findings - fix free-plan region empty state, controlled sheets, uptime cards on failed fetch, regions table without configured regions - drop refs written during render in the monitor list; export the status union from search-params - em dash instead of "No data" for missing latency cells; update the metrics test and cover hasMetricsData - audit-log settings page uses the DataTable empty state - share the private-location create sheet (forms/private-location/sheet-create) - tighten empty-state copy on overview, incidents, status reports and the monitor timeline; rewrite the DESIGN.md empty-state paragraph - login: restyle the last-used badge so it reads on both button variants * fix(dashboard): empty-state follow-ups from review - audit-log settings page stays mounted on a failed list and says so - regions table: filter that matches no configured region gets its own state with a show-all action instead of "No regions configured" - overview recent activity: don't claim no activity when ended incidents failed to load * feat(dashboard): remaining tables use the DataTable empty state connected apps, API keys, pending invitations, the monitor timeline and status page history render the table with emptyState instead of swapping it for an EmptyStateContainer * fix(dashboard): monitor overview empty states - drop the widen-time-range action on the uptime chart - regions table uses the ghost-row empty state and hides the axis header without rows - monitor timeline skips the collapse wrapper when empty * feat(dashboard): align data-table ghost rows to the header columns Ghost rows are real table rows now, so the skeleton pills share the header column widths and alignment. The empty state pulls itself up over five rows behind a gradient overlay. Columns without visible header text use header "" or meta.ghost = false to stay blank. * fix(dashboard): empty-state cell wraps, ghost header check fails soft * fix(dashboard): monitor list filters keep every status in the URL Updater functions resolve against a ref so two changes in one tick both apply, and the status param is an array. Empty-state copy tweaks: MCP docs action on connected apps, globe icon for private locations, opaque media tints over the ghost rows. * fix(dashboard): monitor status filter keeps every selected status


+1324 -379
54 changed files