From 1daf0b7fdf2b61a70317a1c8bac83dd7f0b0e0a6 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sun, 10 May 2026 17:14:18 -0400 Subject: [PATCH] feat(web): close #358 invites RowActionsMenu wiring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mobile-responsive design called for all 4 admin tables to use RowActionsMenu. Requests + Quarantine + Users users-section landed in earlier commits; the invites section in the same users page was still rendering inline Copy/Revoke buttons. Now uses RowActionsMenu with primary Copy + secondary Revoke (danger). Extend expiry from the design's secondary list deferred — no server endpoint exists yet (lib/api/admin.ts has no extendInviteExpiry). Closes the in-code portion of #358. Real-device verification walkthrough at 375/414/768 + grid/safe-area checks remain operator-side. Co-Authored-By: Claude Opus 4.7 (1M context) --- web/src/routes/admin/users/+page.svelte | 37 +++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/web/src/routes/admin/users/+page.svelte b/web/src/routes/admin/users/+page.svelte index 99f390ec..96d5aa19 100644 --- a/web/src/routes/admin/users/+page.svelte +++ b/web/src/routes/admin/users/+page.svelte @@ -20,7 +20,7 @@ import { pushToast } from '$lib/stores/toast.svelte'; import Modal from '$lib/components/Modal.svelte'; import RowActionsMenu, { type RowAction } from '$lib/components/RowActionsMenu.svelte'; - import { Shield, ShieldOff, CheckCircle2, XCircle, KeyRound, Trash2 } from 'lucide-svelte'; + import { Shield, ShieldOff, CheckCircle2, XCircle, KeyRound, Trash2, Copy } from 'lucide-svelte'; const client = useQueryClient(); @@ -329,23 +329,24 @@ expires {formatDate(inv.expires_at)} - - + copyToken(inv.token) + }} + secondary={[ + { + icon: Trash2, + label: 'Revoke', + ariaLabel: `Revoke invite ${inv.token}`, + onclick: () => onRevokeInvite(inv), + danger: true, + disabled: saving + } + ]} + /> {/each}