diff --git a/app/(main)/users/page.tsx b/app/(main)/users/page.tsx index db80b89d..6bcc83a7 100644 --- a/app/(main)/users/page.tsx +++ b/app/(main)/users/page.tsx @@ -96,8 +96,18 @@ function UsersContent() { const mutationController = useRef(null) const alive = useRef(true) useEffect(() => { alive.current = true; return () => { alive.current = false; mutationController.current?.abort() } }, []) + const formReturnFocus = useRef(null) const [sheetOpen, setSheetOpen] = useState(false) const [editUser, setEditUser] = useState(null) + useEffect(() => { + if (sheetOpen || !formReturnFocus.current) return + const label = formReturnFocus.current.getAttribute("aria-label") + const frame = requestAnimationFrame(() => { + const target = Array.from(document.querySelectorAll("button[aria-label]")).find(button => button.getAttribute("aria-label") === label) + ;(target ?? document.querySelector('button[aria-label="Добавить пользователя"]'))?.focus() + }) + return () => cancelAnimationFrame(frame) + }, [sheetOpen]) const [deleteTarget, setDeleteTarget] = useState(null) const loadLive = useCallback(async () => { @@ -236,20 +246,20 @@ function UsersContent() { } return ( -
+
- {isLive && } - } + } /> -
+
{operationNotice &&

{operationNotice}

} {!isLive &&

Демо: изменения сохраняются только в текущем экране.

} {!canRead &&

Для чтения пользователей требуется mm:users:read.

} @@ -295,13 +305,14 @@ function UsersContent() { allSectionsCount={ALL_SECTIONS.length} isLoading={loading && !usersKnown} actionsDisabled={!writeReady || saving || deleting} - onEdit={(u) => { saveCheckpoint.current = null; setSaveError(null); setSaveBlocked(false); setSaveResume(false); setEditUser(u); setSheetOpen(true) }} + onEdit={(u) => { formReturnFocus.current = document.activeElement as HTMLElement; saveCheckpoint.current = null; setSaveError(null); setSaveBlocked(false); setSaveResume(false); setEditUser(u); setSheetOpen(true) }} onDelete={u => { setDeleteError(null); setDeleteTarget(u) }} /> }