import type RealmRepresentation from "@keycloak/keycloak-admin-client/lib/defs/realmRepresentation"; import type { UserProfileConfig } from "@keycloak/keycloak-admin-client/lib/defs/userProfileMetadata"; import { Button, ButtonVariant, Dropdown, DropdownItem, DropdownList, InputGroup, InputGroupItem, MenuToggle, SearchInput, ToolbarItem, } from "@patternfly/react-core"; import { ArrowRightIcon, EllipsisVIcon } from "@patternfly/react-icons"; import { ReactNode, useState } from "react"; import { useTranslation } from "react-i18next"; import { useAccess } from "../../context/access/Access"; import { SearchDropdown, SearchType } from "../../user/details/SearchFilter"; import DropdownPanel from "../dropdown-panel/DropdownPanel"; import { UserFilter } from "./UserDataTable"; import { UserDataTableAttributeSearchForm } from "./UserDataTableAttributeSearchForm"; type UserDataTableToolbarItemsProps = { searchDropdownOpen: boolean; setSearchDropdownOpen: (open: boolean) => void; realm: RealmRepresentation; hasSelectedRows: boolean; toggleDeleteDialog: () => void; toggleUnlockUsersDialog: () => void; goToCreate: () => void; searchType: SearchType; setSearchType: (searchType: SearchType) => void; searchUser: string; setSearchUser: (searchUser: string) => void; activeFilters: UserFilter; setActiveFilters: (activeFilters: UserFilter) => void; refresh: () => void; profile: UserProfileConfig; clearAllFilters: () => void; createAttributeSearchChips: () => ReactNode; searchUserWithAttributes: () => void; }; export function UserDataTableToolbarItems({ searchDropdownOpen, setSearchDropdownOpen, realm, hasSelectedRows, toggleDeleteDialog, toggleUnlockUsersDialog, goToCreate, searchType, setSearchType, searchUser, setSearchUser, activeFilters, setActiveFilters, refresh, profile, clearAllFilters, createAttributeSearchChips, searchUserWithAttributes, }: UserDataTableToolbarItemsProps) { const { t } = useTranslation(); const [kebabOpen, setKebabOpen] = useState(false); const { hasAccess } = useAccess(); // Only needs query-users access to attempt add/delete of users. // This is because the user could have fine-grained access to users // of a group. There is no way to know this without searching the // permissions of every group. const isManager = hasAccess("query-users"); const searchItem = () => { return ( { clearAllFilters(); setSearchType(searchType); }} /> {searchType === "default" && defaultSearchInput()} {searchType === "attribute" && attributeSearchInput()} ); }; const defaultSearchInput = () => { return ( { setSearchUser(attribute["haswords"]); refresh(); }} onKeyDown={(e) => { if (e.key === "Enter") { const target = e.target as HTMLInputElement; setSearchUser(target.value); refresh(); } }} onClear={() => { setSearchUser(""); refresh(); }} /> ); }; const attributeSearchInput = () => { return ( <> { searchUserWithAttributes(); setSearchDropdownOpen(false); }} /> ) : ( setKebabOpen(isOpen)} toggle={(ref) => ( setKebabOpen(!kebabOpen)} > )} isOpen={kebabOpen} shouldFocusToggleOnSelect > { toggleDeleteDialog(); setKebabOpen(false); }} > {t("deleteUser")} { toggleUnlockUsersDialog(); setKebabOpen(false); }} > {t("unlockAllUsers")} ); const actionItems = ( <> {bruteForceProtectionToolbarItem} ); return ( <> {searchItem()} {isManager ? actionItems : null} ); }