Four issues from code review:
- The selection guard read the document-wide selection, so a leftover
selection anywhere on the page could swallow the first click on any
row. It now checks that the selection is inside the row that was
clicked, with the event threaded through to both call sites.
- CopyButton's reset timer was never cleared, so it fired against an
unmounted component when a row went away on pagination, and a rapid
second click could not cancel the pending reset. Held in a ref and
cleared on unmount and on re-copy.
- navigator.clipboard only exists on secure origins, and the README
documents reaching Checkmate over plain HTTP on a LAN address. There
the API is undefined, so every click showed "could not copy" with no
way forward. Falls back to a hidden textarea.
- The two message cells were byte-identical, so they are now one shared
CopyableText component.
Claude-Session: https://claude.ai/code/session_01AbYLvwpEaZFXktHVcqrFRd
Closes#3907.
Selecting the text of a failed check's error message navigated away
before the selection could be copied. The mouseup that ends a drag-select
lands on the table row, which fires the row's onClick.
Two changes:
- DataTable ignores a row click when the user has an active text
selection, so drag-selecting text inside any row no longer navigates.
This applies to all eleven tables that pass onRowClick, not just checks.
- The message column gets an explicit copy button, which is the more
discoverable of the two fixes the reporter suggested. Added as a shared
CopyButton in design-elements so other columns can reuse it.
Note the row click on the uptime details checks table navigates to
/checks/<check id>, but that route's parameter is :monitorId. A check id
never matches a monitor, so the destination page renders empty - which is
the "all this information disappears" in the report. Left alone here to
keep this change reviewable; it needs its own decision about what that
row should link to.
Claude-Session: https://claude.ai/code/session_01AbYLvwpEaZFXktHVcqrFRd