Finish the details the first pass left rough

Otherkamo-internal
Shipped
20 Agosti 2026, 01:58 UTC
Author
kamo
Commit
f4414a8

Nine small corrections, each with a visible symptom. The drawer opened on ~0.4s of blank panel: `loading` started false, so the first committed render fell through to the null branch and mounted an empty frame that Crossfade then had to play OUT before the skeleton could play in. It starts true now, matching VisitorDetailPanel. The listing fired twice on every load. `canManageRight` sat in the effect's dependencies without being part of the request, and useUserInfo resolves asynchronously, so the right flipped false->true just after mount, cancelled the in-flight request and sent an identical one — with `loaded` still false, the spinner covered both. The server's answer now lives in its own state and the two are combined at render time. Clearing a no-match search told an org with hundreds of codes it had none: the empty state keyed off `debouncedQuery`, which clears a full round trip before the rows it describes arrive. It now keys off the query the rows on screen actually answer. Creating a code inserted it into whatever was on screen, so an admin minting FOR someone else while scoped to "My codes" got a foreign row with no member column to explain it, and the header count drifted one high until the next reload. It splices only when the row belongs in the current view and refetches otherwise. "Copied" appeared even when the copy failed — the flag was set before and independently of the clipboard promise, and on a non-secure origin **************** short-circuits to undefined, so the member saw a confirmation, got no toast, and pasted whatever they had copied before. Opening a code was mouse-only: AG Grid's row click never fires from the keyboard and the grid runs with suppressCellFocus, leaving the funnel, the visitor list and every visitor detail unreachable. The row menu — already tabbable and labelled — gains an Open entry. Retiring a code now uses DELETE, which the backend already implements as exactly this soft delete. Routing it through PATCH left the client's DELETE, the proxy's DELETE and the empty-body branch of apiCall wired but never once executed, so the 204 handling that branch exists for was unverified. TrackingFacets restated four types the API client already owns, and the copies disagreed: the local country type allowed a null code where the API says string. The API is right — the repository filters `countryCode IS NOT NULL` — and importing the real types is what forced that to be settled rather than guessed. The house easing and brand ink, previously redeclared in three files under two names, now come from one module.

All changes

Je, unaona nini kuhusu usafiri?

Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.

Kuwa Huru MileleMtazamo wa bei